[pycsw] 01/03: Imported Upstream version 1.8.2

Johan Van de Wauw johanvdw-guest at moszumanska.debian.org
Thu Sep 18 22:26:24 UTC 2014


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

johanvdw-guest pushed a commit to branch master
in repository pycsw.

commit 0b1029a0e096acb7fdf26c975387fe184b7cc8b5
Author: Johan Van de Wauw <johan.vandewauw at gmail.com>
Date:   Fri Sep 19 00:16:30 2014 +0200

    Imported Upstream version 1.8.2
---
 .travis.yml                                        |   28 +
 COMMITTERS.txt                                     |    7 +
 CONTRIBUTING.rst                                   |  113 +
 HISTORY.txt                                        |    4 +
 LICENSE.txt                                        |   22 +
 MANIFEST.in                                        |    2 +
 README.txt                                         |   12 +
 VERSION.txt                                        |    1 +
 bin/pycsw-admin.py                                 |  260 ++
 bin/pycsw-pylint.sh                                |   34 +
 csw.py                                             |   84 +
 csw.wsgi                                           |  132 +
 default-sample.cfg                                 |   98 +
 docs/Makefile                                      |  154 ++
 docs/_build/doctrees/administration.doctree        |  Bin 0 -> 43456 bytes
 docs/_build/doctrees/ckan.doctree                  |  Bin 0 -> 7181 bytes
 docs/_build/doctrees/committers.doctree            |  Bin 0 -> 7554 bytes
 docs/_build/doctrees/configuration.doctree         |  Bin 0 -> 57725 bytes
 docs/_build/doctrees/contributing.doctree          |  Bin 0 -> 32548 bytes
 docs/_build/doctrees/distributedsearching.doctree  |  Bin 0 -> 16380 bytes
 docs/_build/doctrees/geonode.doctree               |  Bin 0 -> 7516 bytes
 docs/_build/doctrees/index.doctree                 |  Bin 0 -> 5876 bytes
 docs/_build/doctrees/installation.doctree          |  Bin 0 -> 36239 bytes
 docs/_build/doctrees/introduction.doctree          |  Bin 0 -> 52206 bytes
 docs/_build/doctrees/license.doctree               |  Bin 0 -> 5839 bytes
 docs/_build/doctrees/odc.doctree                   |  Bin 0 -> 7375 bytes
 docs/_build/doctrees/opensearch.doctree            |  Bin 0 -> 6836 bytes
 docs/_build/doctrees/outputschemas.doctree         |  Bin 0 -> 10408 bytes
 docs/_build/doctrees/profiles.doctree              |  Bin 0 -> 41529 bytes
 docs/_build/doctrees/repofilters.doctree           |  Bin 0 -> 25175 bytes
 docs/_build/doctrees/sitemaps.doctree              |  Bin 0 -> 4934 bytes
 docs/_build/doctrees/soap.doctree                  |  Bin 0 -> 3884 bytes
 docs/_build/doctrees/sru.doctree                   |  Bin 0 -> 5556 bytes
 docs/_build/doctrees/support.doctree               |  Bin 0 -> 4448 bytes
 docs/_build/doctrees/testing.doctree               |  Bin 0 -> 32371 bytes
 docs/_build/doctrees/tools.doctree                 |  Bin 0 -> 11422 bytes
 docs/_build/doctrees/transactions.doctree          |  Bin 0 -> 33440 bytes
 docs/_build/html/_sources/administration.txt       |  173 ++
 docs/_build/html/_sources/ckan.txt                 |   16 +
 docs/_build/html/_sources/committers.txt           |    6 +
 docs/_build/html/_sources/configuration.txt        |  112 +
 docs/_build/html/_sources/contributing.txt         |    3 +
 docs/_build/html/_sources/distributedsearching.txt |   77 +
 docs/_build/html/_sources/geonode.txt              |   15 +
 docs/_build/html/_sources/index.txt                |   36 +
 docs/_build/html/_sources/installation.txt         |  197 ++
 docs/_build/html/_sources/introduction.txt         |  190 ++
 docs/_build/html/_sources/license.txt              |    6 +
 docs/_build/html/_sources/odc.txt                  |   15 +
 docs/_build/html/_sources/opensearch.txt           |   27 +
 docs/_build/html/_sources/outputschemas.txt        |   42 +
 docs/_build/html/_sources/profiles.txt             |   69 +
 docs/_build/html/_sources/repofilters.txt          |   74 +
 docs/_build/html/_sources/sitemaps.txt             |   14 +
 docs/_build/html/_sources/soap.txt                 |    7 +
 docs/_build/html/_sources/sru.txt                  |   16 +
 docs/_build/html/_sources/support.txt              |    9 +
 docs/_build/html/_sources/testing.txt              |   97 +
 docs/_build/html/_sources/tools.txt                |   26 +
 docs/_build/html/_sources/transactions.txt         |   77 +
 docs/_build/html/_static/ajax-loader.gif           |  Bin 0 -> 673 bytes
 docs/_build/html/_static/basic.css                 |  537 ++++
 docs/_build/html/_static/comment-bright.png        |  Bin 0 -> 3500 bytes
 docs/_build/html/_static/comment-close.png         |  Bin 0 -> 3578 bytes
 docs/_build/html/_static/comment.png               |  Bin 0 -> 3445 bytes
 docs/_build/html/_static/default.css               |  256 ++
 docs/_build/html/_static/doctools.js               |  238 ++
 docs/_build/html/_static/down-pressed.png          |  Bin 0 -> 368 bytes
 docs/_build/html/_static/down.png                  |  Bin 0 -> 363 bytes
 docs/_build/html/_static/favicon.ico               |  Bin 0 -> 1150 bytes
 docs/_build/html/_static/file.png                  |  Bin 0 -> 392 bytes
 docs/_build/html/_static/jquery.js                 |    2 +
 docs/_build/html/_static/minus.png                 |  Bin 0 -> 199 bytes
 docs/_build/html/_static/plus.png                  |  Bin 0 -> 199 bytes
 docs/_build/html/_static/pygments.css              |   62 +
 docs/_build/html/_static/searchtools.js            |  622 +++++
 docs/_build/html/_static/sidebar.js                |  159 ++
 docs/_build/html/_static/underscore.js             |   31 +
 docs/_build/html/_static/up-pressed.png            |  Bin 0 -> 372 bytes
 docs/_build/html/_static/up.png                    |  Bin 0 -> 363 bytes
 docs/_build/html/_static/websupport.js             |  808 +++++++
 docs/_build/html/administration.html               |  325 +++
 docs/_build/html/ckan.html                         |  161 ++
 docs/_build/html/committers.html                   |  169 ++
 docs/_build/html/configuration.html                |  259 ++
 docs/_build/html/contributing.html                 |  267 ++
 docs/_build/html/distributedsearching.html         |  209 ++
 docs/_build/html/geonode.html                      |  161 ++
 docs/_build/html/index.html                        |  272 +++
 docs/_build/html/installation.html                 |  316 +++
 docs/_build/html/introduction.html                 |  408 ++++
 docs/_build/html/license.html                      |  164 ++
 docs/_build/html/odc.html                          |  162 ++
 docs/_build/html/opensearch.html                   |  170 ++
 docs/_build/html/outputschemas.html                |  191 ++
 docs/_build/html/profiles.html                     |  315 +++
 docs/_build/html/repofilters.html                  |  304 +++
 docs/_build/html/search.html                       |  136 ++
 docs/_build/html/sitemaps.html                     |  152 ++
 docs/_build/html/soap.html                         |  148 ++
 docs/_build/html/sru.html                          |  153 ++
 docs/_build/html/support.html                      |  159 ++
 docs/_build/html/testing.html                      |  237 ++
 docs/_build/html/tools.html                        |  182 ++
 docs/_build/html/transactions.html                 |  282 +++
 docs/_static/favicon.ico                           |  Bin 0 -> 1150 bytes
 docs/_templates/indexsidebar.html                  |   15 +
 docs/_templates/layout.html                        |   32 +
 docs/administration.rst                            |  173 ++
 docs/ckan.rst                                      |   16 +
 docs/committers.rst                                |    6 +
 docs/conf.py                                       |  294 +++
 docs/configuration.rst                             |  112 +
 docs/contributing.rst                              |    3 +
 docs/distributedsearching.rst                      |   77 +
 docs/geonode.rst                                   |   15 +
 docs/index.rst                                     |   36 +
 docs/installation.rst                              |  197 ++
 docs/introduction.rst                              |  190 ++
 docs/license.rst                                   |    6 +
 docs/locale/el/LC_MESSAGES/.gitkeep                |    0
 docs/locale/fr/LC_MESSAGES/.gitkeep                |    0
 docs/odc.rst                                       |   15 +
 docs/opensearch.rst                                |   27 +
 docs/outputschemas.rst                             |   42 +
 docs/profiles.rst                                  |   69 +
 docs/repofilters.rst                               |   74 +
 docs/sitemaps.rst                                  |   14 +
 docs/soap.rst                                      |    7 +
 docs/sru.rst                                       |   16 +
 docs/support.rst                                   |    9 +
 docs/testing.rst                                   |   97 +
 docs/tools.rst                                     |   26 +
 docs/transactions.rst                              |   77 +
 etc/dist/debian/README                             |    6 +
 etc/dist/debian/changelog                          |   35 +
 etc/dist/debian/compat                             |    1 +
 etc/dist/debian/control                            |   18 +
 etc/dist/debian/copyright                          |   27 +
 etc/dist/debian/format                             |    1 +
 etc/dist/debian/pycsw-cgi.install                  |   13 +
 etc/dist/debian/pycsw-cgi.postinst                 |   53 +
 etc/dist/debian/python-pycsw.install               |    1 +
 etc/dist/debian/rules                              |    5 +
 etc/dist/install_script/install_pycsw.sh           |  106 +
 etc/dist/opensuse/python-pycsw.changes             |   45 +
 etc/dist/opensuse/python-pycsw.spec                |  196 ++
 etc/dist/osgeolive/install_pycsw.sh                |   64 +
 etc/harvest-all.cron                               |    5 +
 etc/mappings.py                                    |  100 +
 etc/pycsw                                          |    5 +
 etc/pycsw.desktop                                  |   11 +
 pavement.py                                        |  349 +++
 pycsw-1.8.2.tar                                    |  Bin 0 -> 10240 bytes
 pycsw/__init__.py                                  |   31 +
 pycsw/admin.py                                     |  593 +++++
 pycsw/config.py                                    |  332 +++
 pycsw/fes.py                                       |  400 +++
 pycsw/formats/__init__.py                          |   29 +
 pycsw/formats/fmt_json.py                          |   39 +
 pycsw/gml.py                                       |  231 ++
 pycsw/log.py                                       |  100 +
 pycsw/metadata.py                                  | 1040 ++++++++
 pycsw/opensearch.py                                |   69 +
 pycsw/plugins/__init__.py                          |   29 +
 pycsw/plugins/outputschemas/__init__.py            |   30 +
 pycsw/plugins/outputschemas/atom.py                |  122 +
 pycsw/plugins/outputschemas/dif.py                 |  180 ++
 pycsw/plugins/outputschemas/fgdc.py                |  180 ++
 pycsw/plugins/profiles/__init__.py                 |   29 +
 pycsw/plugins/profiles/apiso/__init__.py           |   29 +
 pycsw/plugins/profiles/apiso/apiso.py              |  667 +++++
 pycsw/plugins/profiles/apiso/docs/apiso.rst        |   56 +
 .../ogc/csw/2.0.2/profiles/apiso/1.0.0/ReadMe.txt  |   24 +
 .../ogc/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd   |   13 +
 .../schemas/ogc/iso/19139/20060504/ReadMe.txt      |   19 +
 .../schemas/ogc/iso/19139/20060504/Version.txt     |    6 +
 .../ogc/iso/19139/20060504/gco/basicTypes.xsd      |  429 ++++
 .../schemas/ogc/iso/19139/20060504/gco/gco.xsd     |   12 +
 .../schemas/ogc/iso/19139/20060504/gco/gcoBase.xsd |   61 +
 .../iso/19139/20060504/gmd/applicationSchema.xsd   |   42 +
 .../ogc/iso/19139/20060504/gmd/citation.xsd        |  275 +++
 .../ogc/iso/19139/20060504/gmd/constraints.xsd     |  106 +
 .../schemas/ogc/iso/19139/20060504/gmd/content.xsd |  188 ++
 .../ogc/iso/19139/20060504/gmd/dataQuality.xsd     |  554 +++++
 .../ogc/iso/19139/20060504/gmd/distribution.xsd    |  202 ++
 .../schemas/ogc/iso/19139/20060504/gmd/extent.xsd  |  205 ++
 .../ogc/iso/19139/20060504/gmd/freeText.xsd        |  122 +
 .../schemas/ogc/iso/19139/20060504/gmd/gmd.xsd     |   12 +
 .../ogc/iso/19139/20060504/gmd/identification.xsd  |  348 +++
 .../ogc/iso/19139/20060504/gmd/maintenance.xsd     |   86 +
 .../iso/19139/20060504/gmd/metadataApplication.xsd |  175 ++
 .../ogc/iso/19139/20060504/gmd/metadataEntity.xsd  |   70 +
 .../iso/19139/20060504/gmd/metadataExtension.xsd   |   99 +
 .../iso/19139/20060504/gmd/portrayalCatalogue.xsd  |   36 +
 .../ogc/iso/19139/20060504/gmd/referenceSystem.xsd |  100 +
 .../19139/20060504/gmd/spatialRepresentation.xsd   |  237 ++
 .../schemas/ogc/iso/19139/20060504/gml/ReadMe.txt  |   26 +
 .../ogc/iso/19139/20060504/gml/basicTypes.xsd      |  267 ++
 .../19139/20060504/gml/coordinateOperations.xsd    |  639 +++++
 .../20060504/gml/coordinateReferenceSystems.xsd    |  526 ++++
 .../iso/19139/20060504/gml/coordinateSystems.xsd   |  401 +++
 .../ogc/iso/19139/20060504/gml/coverage.xsd        |  462 ++++
 .../schemas/ogc/iso/19139/20060504/gml/datums.xsd  |  342 +++
 .../ogc/iso/19139/20060504/gml/dictionary.xsd      |  129 +
 .../ogc/iso/19139/20060504/gml/direction.xsd       |   80 +
 .../ogc/iso/19139/20060504/gml/dynamicFeature.xsd  |  142 ++
 .../schemas/ogc/iso/19139/20060504/gml/feature.xsd |  215 ++
 .../iso/19139/20060504/gml/geometryAggregates.xsd  |  216 ++
 .../iso/19139/20060504/gml/geometryBasic0d1d.xsd   |  304 +++
 .../ogc/iso/19139/20060504/gml/geometryBasic2d.xsd |  123 +
 .../iso/19139/20060504/gml/geometryComplexes.xsd   |   89 +
 .../iso/19139/20060504/gml/geometryPrimitives.xsd  |  892 +++++++
 .../schemas/ogc/iso/19139/20060504/gml/gml.xsd     |   14 +
 .../schemas/ogc/iso/19139/20060504/gml/gmlBase.xsd |  305 +++
 .../schemas/ogc/iso/19139/20060504/gml/grids.xsd   |   58 +
 .../ogc/iso/19139/20060504/gml/measures.xsd        |  167 ++
 .../ogc/iso/19139/20060504/gml/observation.xsd     |   90 +
 .../iso/19139/20060504/gml/referenceSystems.xsd    |   69 +
 .../ogc/iso/19139/20060504/gml/temporal.xsd        |  263 ++
 .../20060504/gml/temporalReferenceSystems.xsd      |  183 ++
 .../iso/19139/20060504/gml/temporalTopology.xsd    |  124 +
 .../ogc/iso/19139/20060504/gml/topology.xsd        |  372 +++
 .../schemas/ogc/iso/19139/20060504/gml/units.xsd   |  156 ++
 .../ogc/iso/19139/20060504/gml/valueObjects.xsd    |  212 ++
 .../ogc/iso/19139/20060504/gmx/catalogues.xsd      |  112 +
 .../ogc/iso/19139/20060504/gmx/codelistItem.xsd    |  168 ++
 .../schemas/ogc/iso/19139/20060504/gmx/crsItem.xsd | 1030 ++++++++
 .../ogc/iso/19139/20060504/gmx/extendedTypes.xsd   |   75 +
 .../schemas/ogc/iso/19139/20060504/gmx/gmx.xsd     |    2 +
 .../ogc/iso/19139/20060504/gmx/gmxUsage.xsd        |  127 +
 .../schemas/ogc/iso/19139/20060504/gmx/uomItem.xsd |  162 ++
 .../schemas/ogc/iso/19139/20060504/gsr/gsr.xsd     |   12 +
 .../iso/19139/20060504/gsr/spatialReferencing.xsd  |   24 +
 .../ogc/iso/19139/20060504/gss/geometry.xsd        |   35 +
 .../schemas/ogc/iso/19139/20060504/gss/gss.xsd     |   12 +
 .../schemas/ogc/iso/19139/20060504/gts/gts.xsd     |   12 +
 .../ogc/iso/19139/20060504/gts/temporalObjects.xsd |   34 +
 .../resources/Codelist/ML_gmxCodelists.xml         |  819 +++++++
 .../20060504/resources/Codelist/gmxCodelists.xml   | 1858 ++++++++++++++
 .../iso/19139/20060504/resources/crs/ML_gmxCrs.xml |  116 +
 .../iso/19139/20060504/resources/crs/gmxCrs.xml    |  236 ++
 .../iso/19139/20060504/resources/example/fr-fr.xml |   53 +
 .../iso/19139/20060504/resources/uom/ML_gmxUom.xml |   91 +
 .../iso/19139/20060504/resources/uom/gmxUom.xml    |   43 +
 .../ogc/iso/19139/20060504/srv/serviceMetadata.xsd |  197 ++
 .../ogc/iso/19139/20060504/srv/serviceModel.xsd    |  220 ++
 .../schemas/ogc/iso/19139/20060504/srv/srv.xsd     |   13 +
 pycsw/plugins/profiles/ebrim/__init__.py           |   29 +
 pycsw/plugins/profiles/ebrim/docs/ebrim.rst        |   30 +
 pycsw/plugins/profiles/ebrim/ebrim.py              |  172 ++
 .../csw/2.0.2/profiles/ebrim/1.0/csw-ebrim-iri.xsd |  146 ++
 .../ogc/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim.xsd |  104 +
 .../ebrim/1.0/wsdl/1.1/csw-ebrim-binding.wsdl      |  126 +
 .../ebrim/1.0/wsdl/1.1/csw-ebrim-interface.wsdl    |  242 ++
 .../ebrim/1.0/wsdl/1.1/csw-ebrim-service.wsdl      |   29 +
 .../ebrim/1.0/wsdl/2.0/csw-ebrim-interface.wsdl    |  350 +++
 pycsw/plugins/profiles/profile.py                  |  139 ++
 pycsw/plugins/repository/__init__.py               |   29 +
 pycsw/plugins/repository/geonode/__init__.py       |   29 +
 pycsw/plugins/repository/geonode/geonode_.py       |  147 ++
 pycsw/plugins/repository/odc/__init__.py           |   29 +
 pycsw/plugins/repository/odc/odc.py                |  154 ++
 pycsw/repository.py                                |  386 +++
 pycsw/schemas/ogc/README.txt                       |    9 +
 pycsw/schemas/ogc/csw/2.0.2/CSW-discovery.xsd      |  494 ++++
 pycsw/schemas/ogc/csw/2.0.2/CSW-publication.xsd    |  242 ++
 pycsw/schemas/ogc/csw/2.0.2/rec-dcmes.xsd          |  199 ++
 pycsw/schemas/ogc/csw/2.0.2/rec-dcterms.xsd        |   94 +
 pycsw/schemas/ogc/csw/2.0.2/record.xsd             |  138 ++
 pycsw/schemas/ogc/filter/1.1.0/expr.xsd            |   67 +
 pycsw/schemas/ogc/filter/1.1.0/filter.xsd          |  265 ++
 .../ogc/filter/1.1.0/filterCapabilities.xsd        |  171 ++
 pycsw/schemas/ogc/filter/1.1.0/sort.xsd            |   46 +
 pycsw/schemas/ogc/gml/3.1.1/base/basicTypes.xsd    |  278 +++
 .../ogc/gml/3.1.1/base/coordinateOperations.xsd    |  789 ++++++
 .../gml/3.1.1/base/coordinateReferenceSystems.xsd  |  429 ++++
 .../ogc/gml/3.1.1/base/coordinateSystems.xsd       |  408 ++++
 pycsw/schemas/ogc/gml/3.1.1/base/coverage.xsd      |  451 ++++
 pycsw/schemas/ogc/gml/3.1.1/base/dataQuality.xsd   |  129 +
 pycsw/schemas/ogc/gml/3.1.1/base/datums.xsd        |  484 ++++
 pycsw/schemas/ogc/gml/3.1.1/base/defaultStyle.xsd  |  454 ++++
 pycsw/schemas/ogc/gml/3.1.1/base/dictionary.xsd    |  137 ++
 pycsw/schemas/ogc/gml/3.1.1/base/direction.xsd     |   72 +
 .../schemas/ogc/gml/3.1.1/base/dynamicFeature.xsd  |  115 +
 pycsw/schemas/ogc/gml/3.1.1/base/feature.xsd       |  199 ++
 .../ogc/gml/3.1.1/base/geometryAggregates.xsd      |  430 ++++
 .../ogc/gml/3.1.1/base/geometryBasic0d1d.xsd       |  602 +++++
 .../schemas/ogc/gml/3.1.1/base/geometryBasic2d.xsd |  213 ++
 .../ogc/gml/3.1.1/base/geometryComplexes.xsd       |  141 ++
 .../ogc/gml/3.1.1/base/geometryPrimitives.xsd      | 1609 ++++++++++++
 pycsw/schemas/ogc/gml/3.1.1/base/gml.xsd           |   22 +
 pycsw/schemas/ogc/gml/3.1.1/base/gmlBase.xsd       |  294 +++
 pycsw/schemas/ogc/gml/3.1.1/base/grids.xsd         |   76 +
 pycsw/schemas/ogc/gml/3.1.1/base/measures.xsd      |  200 ++
 pycsw/schemas/ogc/gml/3.1.1/base/observation.xsd   |   96 +
 .../ogc/gml/3.1.1/base/referenceSystems.xsd        |  211 ++
 pycsw/schemas/ogc/gml/3.1.1/base/temporal.xsd      |  332 +++
 .../gml/3.1.1/base/temporalReferenceSystems.xsd    |  251 ++
 .../ogc/gml/3.1.1/base/temporalTopology.xsd        |  186 ++
 pycsw/schemas/ogc/gml/3.1.1/base/topology.xsd      |  459 ++++
 pycsw/schemas/ogc/gml/3.1.1/base/units.xsd         |  170 ++
 pycsw/schemas/ogc/gml/3.1.1/base/valueObjects.xsd  |  361 +++
 pycsw/schemas/ogc/ows/1.0.0/ows19115subset.xsd     |  222 ++
 pycsw/schemas/ogc/ows/1.0.0/owsAll.xsd             |   20 +
 pycsw/schemas/ogc/ows/1.0.0/owsCommon.xsd          |  155 ++
 .../ogc/ows/1.0.0/owsDataIdentification.xsd        |  112 +
 pycsw/schemas/ogc/ows/1.0.0/owsExceptionReport.xsd |   67 +
 pycsw/schemas/ogc/ows/1.0.0/owsGetCapabilities.xsd |  108 +
 .../ogc/ows/1.0.0/owsOperationsMetadata.xsd        |  161 ++
 .../ogc/ows/1.0.0/owsServiceIdentification.xsd     |   55 +
 pycsw/schemas/ogc/ows/1.0.0/owsServiceProvider.xsd |   46 +
 pycsw/schemas/w3c/1999/xlink.xsd                   |  271 +++
 pycsw/schemas/w3c/2001/xml.xsd                     |  287 +++
 pycsw/server.py                                    | 2557 ++++++++++++++++++++
 pycsw/sru.py                                       |  215 ++
 pycsw/util.py                                      |  424 ++++
 requirements-dev.txt                               |    2 +
 requirements-standalone.txt                        |    2 +
 requirements.txt                                   |    4 +
 setup.py                                           |  153 ++
 tests/README.txt                                   |    1 +
 ...ites_apiso-inspire_get_GetCapabilities-lang.xml |  367 +++
 .../suites_apiso-inspire_get_GetCapabilities.xml   |  367 +++
 .../expected/suites_apiso_post_DescribeRecord.xml  |  551 +++++
 .../expected/suites_apiso_post_GetCapabilities.xml |  310 +++
 .../suites_apiso_post_GetDomain-property.xml       |   12 +
 .../suites_apiso_post_GetRecordById-brief.xml      |   77 +
 .../suites_apiso_post_GetRecordById-full-dc.xml    |   44 +
 .../suites_apiso_post_GetRecordById-full.xml       |   40 +
 .../suites_apiso_post_GetRecordById-srv-brief.xml  |   93 +
 ...suites_apiso_post_GetRecords-all-csw-output.xml |  399 +++
 .../expected/suites_apiso_post_GetRecords-all.xml  |  399 +++
 .../suites_apiso_post_GetRecords-cql-title.xml     |  372 +++
 .../suites_apiso_post_GetRecords-elementname.xml   |  388 +++
 ...suites_apiso_post_GetRecords-filter-anytext.xml |  372 +++
 ...piso_post_GetRecords-filter-bbox-csw-output.xml |   52 +
 .../suites_apiso_post_GetRecords-filter-bbox.xml   |  388 +++
 ...es_apiso_post_GetRecords-filter-servicetype.xml |   96 +
 tests/expected/suites_atom_get_opensearch.xml      |   97 +
 tests/expected/suites_atom_post_DescribeRecord.xml |    3 +
 .../expected/suites_atom_post_GetCapabilities.xml  |  254 ++
 .../suites_atom_post_GetRecords-filter-bbox.xml    |   38 +
 ...te_get_27e17158-c57a-4493-92ac-dba8934cf462.xml |  283 +++
 ...te_get_27f69b66-5f05-4311-a89c-73ca55c2686b.xml |    9 +
 ...te_get_2ab7d1fa-885b-459f-80e4-b6282eab4f8c.xml |  283 +++
 ...te_get_37aa90e2-6ff0-420c-af15-8b9463099a73.xml |   14 +
 ...te_get_3a8a3c47-455f-4f49-9078-03119f3e70b3.xml |  283 +++
 ...te_get_4515831f-834a-4699-95f6-ab0c2cbfcfd0.xml |    7 +
 ...te_get_477b23a3-baa9-47c8-9541-5fe27735ed49.xml |   57 +
 ...te_get_48f26761-3a9d-48db-bee1-da089f5fb857.xml |  283 +++
 ...te_get_4e38092f-1586-44b8-988e-0acfa5855916.xml |    7 +
 ...te_get_55c38f00-2553-42c1-99ab-33edbb561ad7.xml |  257 ++
 ...te_get_5ab5db18-c87a-4fbf-a8d8-b7289b09ac81.xml |    7 +
 ...te_get_6a4f57ca-a1bd-4802-89c2-44860dbdb0f0.xml |   11 +
 ...te_get_6c375703-9c00-4aef-bec7-d2e964f849eb.xml |   11 +
 ...te_get_80f31def-4185-48b9-983a-960566918eae.xml |  283 +++
 ...te_get_8e2232ed-05d9-44ae-8b04-0911cbe6a507.xml |    7 +
 ...te_get_9697f0aa-3b6a-4125-83a5-61e8826127c4.xml |  283 +++
 ...te_get_9bfd17fa-15dc-4a10-8fa7-b3cff7013dd7.xml |   13 +
 ...te_get_b81c3595-06d6-4693-82ea-1ff8650755ac.xml |    3 +
 ...te_get_ba5fc729-3b71-47a0-b7d0-42ec565cd185.xml |  283 +++
 ...te_get_c4ea754f-c158-4d8d-8253-dc8f86021b52.xml |    7 +
 ...te_get_f4692ec5-9547-4a05-88ab-e6154af2640a.xml |  283 +++
 ...te_get_f997f25e-c865-4d53-a362-0ed1846337f2.xml |   15 +
 ...e_post_0c976d98-c896-4b10-b1fe-a22ef50434e7.xml |    6 +
 ...e_post_19d2a6ed-be28-4866-ae15-e3bb634486cb.xml |   55 +
 ...e_post_1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml |   19 +
 ...e_post_1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml |    7 +
 ...e_post_1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml |    7 +
 ...e_post_2102a460-5d62-465f-9668-d70b3faafbfa.xml |   12 +
 ...e_post_225f455a-0035-486b-a94e-fee7ae881b2b.xml |   17 +
 ...e_post_2d53ffea-60e4-4652-abf5-36eb23042fd5.xml |   69 +
 ...e_post_34a019a9-1581-42cb-9827-fbfdda2773b7.xml |    6 +
 ...e_post_3e76fd38-e035-41c9-83dc-61356f680c97.xml |    7 +
 ...e_post_418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml |   15 +
 ...e_post_420b745e-0c4b-404e-9f2d-61fa580ff05a.xml |   22 +
 ...e_post_4735d649-a2b1-42fd-a101-14e1d7e4607f.xml |   44 +
 ...e_post_5c5861bc-f742-40a5-9998-5342615d674b.xml |   49 +
 ...e_post_6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml |   89 +
 ...e_post_73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml |   18 +
 ...e_post_78297c88-4850-4927-adc6-511cd9a3d539.xml |  115 +
 ...e_post_7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml |   48 +
 ...e_post_7e2cd105-daec-4d25-bc8e-d49d21364912.xml |    3 +
 ...e_post_87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml |   50 +
 ...e_post_88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml |    7 +
 ...e_post_898cd63b-2585-4ec0-8720-d554bd324174.xml |   14 +
 ...e_post_8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml |   48 +
 ...e_post_928c1896-52d4-4ac7-9832-f98e3eb65f02.xml |   17 +
 ...e_post_93bdbb9d-2734-4f01-92fb-48634cca41de.xml |   21 +
 ...e_post_948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml |   51 +
 ...e_post_9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml |    7 +
 ...e_post_a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml |   69 +
 ...e_post_ad61686c-d304-42d1-b845-8c1f3070c83e.xml |    8 +
 ...e_post_af39c020-7b1d-429c-b474-f45c3164cb79.xml |   21 +
 ...e_post_b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml |   91 +
 ...e_post_ba9b0107-dcee-46ef-823a-a2e25a911a96.xml |   36 +
 ...e_post_bb66ebc5-7121-48b5-9f53-b56537d9561b.xml |   19 +
 ...e_post_c02d1c85-df9f-45ee-bea7-345c35e02a98.xml |    7 +
 ...e_post_c311a342-72e3-4983-be39-868e6ed9740f.xml |  115 +
 ...e_post_c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml |   27 +
 ...e_post_c8588f47-8e65-45f5-ad34-ff4524cad84d.xml |    7 +
 ...e_post_da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml |    7 +
 ...e_post_dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml |   22 +
 ...e_post_dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml |   69 +
 ...e_post_e308f030-c097-4036-a838-44bad74c9ef7.xml |   69 +
 ...e_post_e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml |   69 +
 ...e_post_f7976c55-a156-4421-8199-bc0487da4b0f.xml |  115 +
 ...e_post_f7d79701-f10b-4087-a33c-f62df0a04fd1.xml |   69 +
 ...e_post_fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml |   12 +
 ...e_post_fe20960f-a26c-4f13-852d-470a0d3233f9.xml |   12 +
 ...default_get_GetCapabilities-invalid-request.xml |    7 +
 .../suites_default_get_GetCapabilities.xml         |  254 ++
 .../expected/suites_default_get_GetRecords-all.xml |    6 +
 .../suites_default_get_GetRecords-sortby-asc.xml   |   91 +
 .../suites_default_get_GetRecords-sortby-desc.xml  |   93 +
 ...default_get_GetRecords-sortby-invalid-order.xml |    7 +
 ..._get_GetRecords-sortby-invalid-propertyname.xml |    7 +
 .../suites_default_post_DescribeRecord-json.xml    |  408 ++++
 .../suites_default_post_DescribeRecord.xml         |  115 +
 ...efault_post_Exception-GetRecords-badsrsname.xml |    7 +
 ...fault_post_Exception-GetRecords-elementname.xml |    7 +
 ...fault_post_Exception-GetRecords-invalid-xml.xml |    8 +
 .../suites_default_post_GetCapabilities-SOAP.xml   |  258 ++
 ...uites_default_post_GetCapabilities-sections.xml |   83 +
 ...default_post_GetCapabilities-updatesequence.xml |  254 ++
 .../suites_default_post_GetCapabilities.xml        |  254 ++
 .../suites_default_post_GetDomain-parameter.xml    |   11 +
 .../suites_default_post_GetDomain-property.xml     |   18 +
 .../suites_default_post_GetRecordById-json.xml     |   50 +
 .../expected/suites_default_post_GetRecordById.xml |   15 +
 .../suites_default_post_GetRecords-all-json.xml    |  183 ++
 ...default_post_GetRecords-all-resulttype-hits.xml |    6 +
 ...ult_post_GetRecords-all-resulttype-validate.xml |   11 +
 ...tes_default_post_GetRecords-all-sortby-bbox.xml |   56 +
 .../suites_default_post_GetRecords-all.xml         |   49 +
 .../suites_default_post_GetRecords-cql-title.xml   |   17 +
 ...s_default_post_GetRecords-distributedsearch.xml |   17 +
 .../suites_default_post_GetRecords-elementname.xml |   20 +
 .../suites_default_post_GetRecords-end.xml         |   30 +
 ...lt_post_GetRecords-filter-and-bbox-freetext.xml |   16 +
 ...efault_post_GetRecords-filter-and-nested-or.xml |   16 +
 ...fault_post_GetRecords-filter-and-nested-or2.xml |   23 +
 ...ault_post_GetRecords-filter-anytext-and-not.xml |   15 +
 ...efault_post_GetRecords-filter-anytext-equal.xml |   36 +
 ...ites_default_post_GetRecords-filter-anytext.xml |   36 +
 ...fault_post_GetRecords-filter-bbox-reproject.xml |   25 +
 ..._default_post_GetRecords-filter-bbox-sortby.xml |   25 +
 .../suites_default_post_GetRecords-filter-bbox.xml |   25 +
 ...ites_default_post_GetRecords-filter-between.xml |   49 +
 ...default_post_GetRecords-filter-function-bad.xml |    7 +
 ...tes_default_post_GetRecords-filter-function.xml |   12 +
 ...tes_default_post_GetRecords-filter-not-bbox.xml |   36 +
 ...ult_post_GetRecords-filter-or-bbox-freetext.xml |   25 +
 ...efault_post_GetRecords-filter-or-nested-and.xml |   60 +
 ...lt_post_GetRecords-filter-or-title-abstract.xml |   19 +
 .../suites_default_post_GetRecords-maxrecords.xml  |   16 +
 .../suites_default_post_GetRecords-requestid.xml   |   50 +
 .../suites_default_post_Harvest-default.xml        |    7 +
 ...uites_default_post_Harvest-response-handler.xml |    7 +
 .../suites_default_post_Transaction-delete.xml     |    7 +
 .../suites_default_post_Transaction-insert.xml     |    7 +
 ...suites_default_post_Transaction-update-full.xml |    7 +
 ...ault_post_Transaction-update-recordproperty.xml |    7 +
 tests/expected/suites_dif_post_DescribeRecord.xml  |    3 +
 tests/expected/suites_dif_post_GetCapabilities.xml |  254 ++
 .../suites_dif_post_GetRecords-filter-bbox.xml     |   71 +
 .../expected/suites_ebrim_post_DescribeRecord.xml  |   93 +
 .../expected/suites_ebrim_post_GetCapabilities.xml |  258 ++
 .../suites_ebrim_post_GetRecords-filter-bbox.xml   |   13 +
 tests/expected/suites_fgdc_post_DescribeRecord.xml |    3 +
 .../expected/suites_fgdc_post_GetCapabilities.xml  |  254 ++
 .../suites_fgdc_post_GetRecords-filter-bbox.xml    |  123 +
 ..._get_Exception-Harvest-invalid-resourcetype.xml |    7 +
 ..._get_Exception-Harvest-missing-resourcetype.xml |    7 +
 ...esting_get_Exception-Harvest-missing-source.xml |    7 +
 ...vesting_get_Exception-Harvest-waf-bad-value.xml |    7 +
 ..._get_Exception-Harvest-waf-no-records-found.xml |   11 +
 ...suites_harvesting_post_Clear-000-delete-all.xml |    9 +
 ...es_harvesting_post_Exception-Havest-csw-404.xml |    7 +
 .../suites_harvesting_post_GetCapabilities.xml     |  341 +++
 .../suites_harvesting_post_GetDomain-parameter.xml |   23 +
 .../suites_harvesting_post_Harvest-csw.xml         |   65 +
 .../expected/suites_harvesting_post_Harvest-dc.xml |   17 +
 .../suites_harvesting_post_Harvest-fgdc.xml        |   17 +
 .../suites_harvesting_post_Harvest-iso.xml         |   17 +
 .../suites_harvesting_post_Harvest-rdf.xml         |   17 +
 .../suites_harvesting_post_Harvest-sos100.xml      |  125 +
 .../suites_harvesting_post_Harvest-sos200.xml      |   21 +
 .../suites_harvesting_post_Harvest-waf.xml         |   25 +
 .../suites_harvesting_post_Harvest-wcs.xml         |  185 ++
 .../suites_harvesting_post_Harvest-wfs.xml         |    7 +
 .../suites_harvesting_post_Harvest-wms.xml         |   53 +
 .../suites_harvesting_post_Harvest-wps.xml         |   17 +
 ...t_Harvest-zzz-post-GetRecords-filter-ows-dc.xml |  146 ++
 ...-zzz-post-GetRecords-filter-sos-abstract-dc.xml |   30 +
 ...t_Harvest-zzz-post-GetRecords-filter-sos-dc.xml |   69 +
 ..._Harvest-zzz-post-GetRecords-filter-sos-iso.xml |  833 +++++++
 ...t_Harvest-zzz-post-GetRecords-filter-wms-dc.xml |   33 +
 ...arvest-zzz-post-GetRecords-filter-wms-layer.xml |   29 +
 ..._harvesting_post_Transaction-000-delete-all.xml |    9 +
 .../suites_manager_post_Clear-000-delete-all.xml   |    9 +
 .../suites_manager_post_GetCapabilities.xml        |  341 +++
 .../suites_manager_post_GetDomain-parameter.xml    |   23 +
 ...tes_manager_post_Transaction-000-delete-all.xml |    9 +
 ...uites_manager_post_Transaction-dc-01-insert.xml |   15 +
 ..._manager_post_Transaction-dc-02-update-full.xml |    9 +
 ...tes_manager_post_Transaction-fgdc-01-insert.xml |   15 +
 ...ger_post_Transaction-fgdc-02-update-recprop.xml |    9 +
 ...manager_post_Transaction-fgdc-03-delete-all.xml |    9 +
 ..._manager_post_Transaction-iso-00-delete-all.xml |    9 +
 ...ites_manager_post_Transaction-iso-01-insert.xml |   15 +
 ...manager_post_Transaction-iso-02-update-full.xml |    9 +
 ...ager_post_Transaction-iso-03-update-recprop.xml |    9 +
 ...ransaction-iso-04-update-recprop-no-matches.xml |    9 +
 ...ites_manager_post_Transaction-iso-05-delete.xml |    9 +
 ...tes_manager_post_Transaction-xxx-delete-all.xml |    9 +
 ...suites_repofilter_post_GetRecordById-masked.xml |    3 +
 .../suites_repofilter_post_GetRecords-all.xml      |   37 +
 tests/expected/suites_sru_get_explain.xml          |  128 +
 tests/expected/suites_sru_get_search.xml           |    6 +
 tests/expected/suites_sru_get_search_cql.xml       |   30 +
 .../expected/suites_sru_get_search_maxrecords.xml  |   30 +
 ...uites_sru_get_search_startrecord_maxrecords.xml |   30 +
 .../expected/suites_utf-8_post_GetCapabilities.xml |  254 ++
 tests/gen_html.py                                  |  153 ++
 tests/index.html                                   |  332 +++
 tests/run_tests.py                                 |  336 +++
 tests/suites/apiso-inspire/default.cfg             |   91 +
 tests/suites/apiso-inspire/get/requests.txt        |    2 +
 tests/suites/apiso/data/3e9a8c05.xml               |  248 ++
 .../data/T_aerfo_RAS_1991_GR800P001800000012.xml   |   37 +
 .../data/T_aerfo_RAS_1991_GR800P001800000013.xml   |   37 +
 .../data/T_aerfo_RAS_1991_GR800P001800000014.xml   |   37 +
 .../data/T_aerfo_RAS_1991_GR800P001800000015.xml   |   37 +
 .../suites/apiso/data/T_ortho_RAS_1998_284404.xml  |   37 +
 .../suites/apiso/data/T_ortho_RAS_1998_288395.xml  |   37 +
 .../suites/apiso/data/T_ortho_RAS_1998_288398.xml  |   37 +
 .../suites/apiso/data/T_ortho_RAS_1998_288401.xml  |   37 +
 .../suites/apiso/data/T_ortho_RAS_1998_288404.xml  |   37 +
 .../suites/apiso/data/T_pmoed_DTM_1996_276395.xml  |   37 +
 .../suites/apiso/data/T_pmoed_DTM_1996_276398.xml  |   37 +
 .../suites/apiso/data/T_pmoed_DTM_1996_276401.xml  |   37 +
 .../suites/apiso/data/T_pmoed_DTM_1996_276404.xml  |   37 +
 .../suites/apiso/data/T_pmoed_DTM_1996_280395.xml  |   37 +
 tests/suites/apiso/data/pacioos-NS06agg.xml        | 1182 +++++++++
 tests/suites/apiso/data/test.xml                   |   39 +
 tests/suites/apiso/default.cfg                     |   91 +
 tests/suites/apiso/post/DescribeRecord.xml         |    4 +
 tests/suites/apiso/post/GetCapabilities.xml        |    9 +
 tests/suites/apiso/post/GetDomain-property.xml     |    5 +
 tests/suites/apiso/post/GetRecordById-brief.xml    |    6 +
 tests/suites/apiso/post/GetRecordById-full-dc.xml  |    6 +
 tests/suites/apiso/post/GetRecordById-full.xml     |    6 +
 .../suites/apiso/post/GetRecordById-srv-brief.xml  |    6 +
 .../apiso/post/GetRecords-all-csw-output.xml       |    6 +
 tests/suites/apiso/post/GetRecords-all.xml         |    6 +
 tests/suites/apiso/post/GetRecords-cql-title.xml   |    9 +
 tests/suites/apiso/post/GetRecords-elementname.xml |    6 +
 .../apiso/post/GetRecords-filter-anytext.xml       |   15 +
 .../post/GetRecords-filter-bbox-csw-output.xml     |   19 +
 tests/suites/apiso/post/GetRecords-filter-bbox.xml |   18 +
 .../apiso/post/GetRecords-filter-servicetype.xml   |   14 +
 tests/suites/atom/default.cfg                      |   90 +
 tests/suites/atom/get/requests.txt                 |    1 +
 tests/suites/atom/post/DescribeRecord.xml          |    4 +
 tests/suites/atom/post/GetCapabilities.xml         |    9 +
 tests/suites/atom/post/GetRecords-filter-bbox.xml  |   17 +
 ...Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml |   13 +
 ...Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml |   13 +
 ...Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml |   12 +
 ...Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml |   11 +
 ...Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml |   14 +
 ...Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml |   11 +
 ...Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml |   11 +
 ...Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml |   17 +
 ...Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml |   16 +
 ...Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml |   11 +
 ...Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml |   11 +
 ...Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml |   14 +
 tests/suites/cite/data/records.db                  |  Bin 0 -> 82944 bytes
 tests/suites/cite/default.cfg                      |   86 +
 tests/suites/cite/get/requests.txt                 |   22 +
 .../post/0c976d98-c896-4b10-b1fe-a22ef50434e7.xml  |   20 +
 .../post/19d2a6ed-be28-4866-ae15-e3bb634486cb.xml  |   20 +
 .../post/1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml  |   14 +
 .../post/1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml  |    6 +
 .../post/1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml  |   14 +
 .../post/2102a460-5d62-465f-9668-d70b3faafbfa.xml  |   14 +
 .../post/225f455a-0035-486b-a94e-fee7ae881b2b.xml  |   16 +
 .../post/2d53ffea-60e4-4652-abf5-36eb23042fd5.xml  |    6 +
 .../post/34a019a9-1581-42cb-9827-fbfdda2773b7.xml  |    6 +
 .../post/3e76fd38-e035-41c9-83dc-61356f680c97.xml  |    4 +
 .../post/418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml  |   25 +
 .../post/420b745e-0c4b-404e-9f2d-61fa580ff05a.xml  |   16 +
 .../post/4735d649-a2b1-42fd-a101-14e1d7e4607f.xml  |    6 +
 .../post/5c5861bc-f742-40a5-9998-5342615d674b.xml  |   14 +
 .../post/6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml  |    6 +
 .../post/73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml  |   14 +
 .../post/78297c88-4850-4927-adc6-511cd9a3d539.xml  |    2 +
 .../post/7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml  |    6 +
 .../post/7e2cd105-daec-4d25-bc8e-d49d21364912.xml  |    4 +
 .../post/87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml  |    8 +
 .../post/88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml  |    4 +
 .../post/898cd63b-2585-4ec0-8720-d554bd324174.xml  |   20 +
 .../post/8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml  |   20 +
 .../post/928c1896-52d4-4ac7-9832-f98e3eb65f02.xml  |   16 +
 .../post/93bdbb9d-2734-4f01-92fb-48634cca41de.xml  |   18 +
 .../post/948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml  |   14 +
 .../post/9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml  |    4 +
 .../post/a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml  |    6 +
 .../post/ad61686c-d304-42d1-b845-8c1f3070c83e.xml  |   14 +
 .../post/af39c020-7b1d-429c-b474-f45c3164cb79.xml  |   14 +
 .../post/b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml  |   16 +
 .../post/ba9b0107-dcee-46ef-823a-a2e25a911a96.xml  |   20 +
 .../post/bb66ebc5-7121-48b5-9f53-b56537d9561b.xml  |   27 +
 .../post/c02d1c85-df9f-45ee-bea7-345c35e02a98.xml  |   16 +
 .../post/c311a342-72e3-4983-be39-868e6ed9740f.xml  |    4 +
 .../post/c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml  |   25 +
 .../post/c8588f47-8e65-45f5-ad34-ff4524cad84d.xml  |   17 +
 .../post/da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml  |   14 +
 .../post/dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml  |   16 +
 .../post/dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml  |    6 +
 .../post/e308f030-c097-4036-a838-44bad74c9ef7.xml  |    6 +
 .../post/e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml  |   12 +
 .../post/f7976c55-a156-4421-8199-bc0487da4b0f.xml  |    4 +
 .../post/f7d79701-f10b-4087-a33c-f62df0a04fd1.xml  |    6 +
 .../post/fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml  |   14 +
 .../post/fe20960f-a26c-4f13-852d-470a0d3233f9.xml  |   14 +
 tests/suites/default/default.cfg                   |   90 +
 tests/suites/default/get/requests.txt              |    7 +
 tests/suites/default/post/DescribeRecord-json.xml  |    4 +
 tests/suites/default/post/DescribeRecord.xml       |    4 +
 .../post/Exception-GetRecords-badsrsname.xml       |   19 +
 .../post/Exception-GetRecords-elementname.xml      |    6 +
 .../post/Exception-GetRecords-invalid-xml.xml      |    6 +
 tests/suites/default/post/GetCapabilities-SOAP.xml |   13 +
 .../default/post/GetCapabilities-sections.xml      |   12 +
 .../post/GetCapabilities-updatesequence.xml        |    9 +
 tests/suites/default/post/GetCapabilities.xml      |    9 +
 tests/suites/default/post/GetDomain-parameter.xml  |    4 +
 tests/suites/default/post/GetDomain-property.xml   |    4 +
 tests/suites/default/post/GetRecordById-json.xml   |    5 +
 tests/suites/default/post/GetRecordById.xml        |    5 +
 tests/suites/default/post/GetRecords-all-json.xml  |    6 +
 .../post/GetRecords-all-resulttype-hits.xml        |    6 +
 .../post/GetRecords-all-resulttype-validate.xml    |    6 +
 .../default/post/GetRecords-all-sortby-bbox.xml    |   12 +
 tests/suites/default/post/GetRecords-all.xml       |    6 +
 tests/suites/default/post/GetRecords-cql-title.xml |    9 +
 .../default/post/GetRecords-distributedsearch.xml  |   15 +
 .../suites/default/post/GetRecords-elementname.xml |    6 +
 tests/suites/default/post/GetRecords-end.xml       |    6 +
 .../post/GetRecords-filter-and-bbox-freetext.xml   |   23 +
 .../post/GetRecords-filter-and-nested-or.xml       |   38 +
 .../post/GetRecords-filter-and-nested-or2.xml      |   34 +
 .../post/GetRecords-filter-anytext-and-not.xml     |   26 +
 .../post/GetRecords-filter-anytext-equal.xml       |   14 +
 .../default/post/GetRecords-filter-anytext.xml     |   14 +
 .../post/GetRecords-filter-bbox-reproject.xml      |   17 +
 .../default/post/GetRecords-filter-bbox-sortby.xml |   23 +
 .../suites/default/post/GetRecords-filter-bbox.xml |   17 +
 .../default/post/GetRecords-filter-between.xml     |   20 +
 .../post/GetRecords-filter-function-bad.xml        |   17 +
 .../default/post/GetRecords-filter-function.xml    |   17 +
 .../default/post/GetRecords-filter-not-bbox.xml    |   19 +
 .../post/GetRecords-filter-or-bbox-freetext.xml    |   23 +
 .../post/GetRecords-filter-or-nested-and.xml       |   30 +
 .../post/GetRecords-filter-or-title-abstract.xml   |   20 +
 .../suites/default/post/GetRecords-maxrecords.xml  |    6 +
 tests/suites/default/post/GetRecords-requestid.xml |    6 +
 tests/suites/default/post/Harvest-default.xml      |    6 +
 .../default/post/Harvest-response-handler.xml      |    7 +
 tests/suites/default/post/Transaction-delete.xml   |   13 +
 tests/suites/default/post/Transaction-insert.xml   |   73 +
 .../default/post/Transaction-update-full.xml       |   73 +
 .../post/Transaction-update-recordproperty.xml     |   17 +
 tests/suites/dif/default.cfg                       |   90 +
 tests/suites/dif/post/DescribeRecord.xml           |    4 +
 tests/suites/dif/post/GetCapabilities.xml          |    9 +
 tests/suites/dif/post/GetRecords-filter-bbox.xml   |   17 +
 tests/suites/ebrim/default.cfg                     |   93 +
 tests/suites/ebrim/post/DescribeRecord.xml         |    4 +
 tests/suites/ebrim/post/GetCapabilities.xml        |    9 +
 tests/suites/ebrim/post/GetRecords-filter-bbox.xml |   17 +
 tests/suites/fgdc/default.cfg                      |   90 +
 tests/suites/fgdc/post/DescribeRecord.xml          |    4 +
 tests/suites/fgdc/post/GetCapabilities.xml         |    9 +
 tests/suites/fgdc/post/GetRecords-filter-bbox.xml  |   17 +
 tests/suites/harvesting/data/.gitkeep              |    0
 tests/suites/harvesting/default.cfg                |   91 +
 tests/suites/harvesting/get/requests.txt           |    5 +
 .../harvesting/post/Clear-000-delete-all.xml       |   13 +
 .../harvesting/post/Exception-Havest-csw-404.xml   |    6 +
 tests/suites/harvesting/post/GetCapabilities.xml   |    9 +
 .../suites/harvesting/post/GetDomain-parameter.xml |    4 +
 tests/suites/harvesting/post/Harvest-csw.xml       |    6 +
 tests/suites/harvesting/post/Harvest-dc.xml        |    6 +
 tests/suites/harvesting/post/Harvest-fgdc.xml      |    6 +
 tests/suites/harvesting/post/Harvest-iso.xml       |    6 +
 tests/suites/harvesting/post/Harvest-rdf.xml       |    6 +
 tests/suites/harvesting/post/Harvest-sos100.xml    |    5 +
 tests/suites/harvesting/post/Harvest-sos200.xml    |    5 +
 tests/suites/harvesting/post/Harvest-waf.xml       |    5 +
 tests/suites/harvesting/post/Harvest-wcs.xml       |    6 +
 tests/suites/harvesting/post/Harvest-wfs.xml       |    6 +
 tests/suites/harvesting/post/Harvest-wms.xml       |    6 +
 tests/suites/harvesting/post/Harvest-wps.xml       |    6 +
 .../Harvest-zzz-post-GetRecords-filter-ows-dc.xml  |   36 +
 ...-zzz-post-GetRecords-filter-sos-abstract-dc.xml |   24 +
 .../Harvest-zzz-post-GetRecords-filter-sos-dc.xml  |   20 +
 .../Harvest-zzz-post-GetRecords-filter-sos-iso.xml |   20 +
 .../Harvest-zzz-post-GetRecords-filter-wms-dc.xml  |   20 +
 ...arvest-zzz-post-GetRecords-filter-wms-layer.xml |   20 +
 .../harvesting/post/Transaction-000-delete-all.xml |   13 +
 tests/suites/manager/data/.gitkeep                 |    0
 tests/suites/manager/default.cfg                   |   91 +
 tests/suites/manager/post/Clear-000-delete-all.xml |   13 +
 tests/suites/manager/post/GetCapabilities.xml      |    9 +
 tests/suites/manager/post/GetDomain-parameter.xml  |    4 +
 .../manager/post/Transaction-000-delete-all.xml    |   13 +
 .../manager/post/Transaction-dc-01-insert.xml      |   22 +
 .../manager/post/Transaction-dc-02-update-full.xml |   22 +
 .../manager/post/Transaction-fgdc-01-insert.xml    |  214 ++
 .../post/Transaction-fgdc-02-update-recprop.xml    |   17 +
 .../post/Transaction-fgdc-03-delete-all.xml        |   13 +
 .../manager/post/Transaction-iso-00-delete-all.xml |   13 +
 .../manager/post/Transaction-iso-01-insert.xml     |   73 +
 .../post/Transaction-iso-02-update-full.xml        |   73 +
 .../post/Transaction-iso-03-update-recprop.xml     |   17 +
 ...ransaction-iso-04-update-recprop-no-matches.xml |   17 +
 .../manager/post/Transaction-iso-05-delete.xml     |   13 +
 .../manager/post/Transaction-xxx-delete-all.xml    |   13 +
 tests/suites/repofilter/default.cfg                |   91 +
 .../repofilter/post/GetRecordById-masked.xml       |    5 +
 tests/suites/repofilter/post/GetRecords-all.xml    |    6 +
 tests/suites/sru/default.cfg                       |   90 +
 tests/suites/sru/get/requests.txt                  |    5 +
 tests/suites/utf-8/default.cfg                     |   89 +
 tests/suites/utf-8/post/GetCapabilities.xml        |    9 +
 740 files changed, 73935 insertions(+)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..bbf04e1
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,28 @@
+language: python
+
+python:
+  - "2.7"
+  - "2.6"
+
+install:
+  - sudo apt-get install -y libgeos-c1
+  - pip install . --use-mirrors
+  - pip install -r ./requirements-standalone.txt
+  - pip install -r ./requirements-dev.txt
+  - python ./setup.py -q install
+
+#before_script:
+#  - paver start
+
+script:
+  - paver test
+
+after_script:
+  - paver stop
+
+notifications:
+  irc:
+    channels:
+      - "irc.freenode.org#geopython"
+      - "irc.freenode.org#pycsw"
+    use_notice: true
diff --git a/COMMITTERS.txt b/COMMITTERS.txt
new file mode 100644
index 0000000..4fb8b80
--- /dev/null
+++ b/COMMITTERS.txt
@@ -0,0 +1,7 @@
+============ ===================== =========================== ==================================
+Login(s)     Name                  Email / Contact             Area(s)
+============ ===================== =========================== ==================================
+tomkralidis  Tom Kralidis          tomkralidis at gmail.com    Overall 
+kalxas       Angelos Tzotsos       tzotsos at gmail.com        INSPIRE, APISO profiles, Packaging 
+adamhinz     Adam Hinz             hinz dot adam at gmail.com  WSGI/Server Deployment
+============ ===================== =========================== ==================================
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
new file mode 100644
index 0000000..87240ac
--- /dev/null
+++ b/CONTRIBUTING.rst
@@ -0,0 +1,113 @@
+Contributing to pycsw
+=====================
+
+The pycsw project openly welcomes contributions (bug reports, bug fixes, code
+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.
+
+GitHub
+------
+
+Code, tests, documentation, wiki and issue tracking are all managed on GitHub.
+Make sure you have a `GitHub account <https://github.com/signup/free>`_.
+
+Code Overview
+-------------
+
+- the pycsw `wiki <https://github.com/geopython/pycsw/wiki/Code-Architecture>`_ documents an overview of the codebase
+
+Documentation
+-------------
+
+- documentation is managed in ``docs/``, in reStructuredText format
+- `Sphinx`_ is used to generate the documentation
+- See the `reStructuredText Primer <http://sphinx-doc.org/rest.html>`_ on rST markup and syntax.
+
+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.
+
+Forking pycsw
+-------------
+
+Contributions are most easily managed via GitHub pull requests.  `Fork <https://github.com/geopython/pycsw/fork>`_
+pycsw into your own GitHub repository to be able to commit your work and submit pull requests.
+
+Development
+-----------
+
+GitHub Commit Guidelines
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+- enhancements and bug fixes should be identified with a GitHub issue
+- commits should be granular enough for other developers to understand the nature / implications of the change(s)
+- for trivial commits that do not need `Travis CI <https://travis-ci.org/geopython/pycsw>`_ to run, include ``[ci skip]`` as part of the commit message
+- non-trivial Git commits shall be associated with a GitHub issue.  As documentation can always be improved, tickets need not be opened for improving the docs
+- Git commits shall include a description of changes
+- Git commits shall include the GitHub issue number (i.e. ``#1234``) in the Git commit log message
+- all enhancements or bug fixes must successfully pass all :ref:`ogc-cite` tests before they are committed
+- all enhancements or bug fixes must successfully pass all :ref:`tests` tests before they are committed
+- enhancements which can be demonstrated from the pycsw :ref:`tests` should be accompanied by example CSW request XML
+
+Coding Guidelines
+^^^^^^^^^^^^^^^^^
+
+- pycsw instead of PyCSW, pyCSW, Pycsw
+- always code with `PEP 8`_ conventions
+- always run source code through ``pep8`` and `pylint`_, using all pylint defaults except for ``C0111``.  ``sbin/pycsw-pylint.sh`` is included for convenience
+- for exceptions which make their way to OGC ``ExceptionReport`` XML, always specify the appropriate ``locator`` and ``code`` parameters
+- the pycsw wiki documents `developer tasks`_ for things like releasing documentation, testing, etc.
+
+Submitting a Pull Request
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This section will guide you through steps of working on pycsw.  This section assumes you have forked pycsw into your own GitHub repository.
+
+.. code-block:: bash
+
+  # setup a virtualenv
+  $ virtualenv mypycsw && cd mypycsw
+  $ . ./bin/activate
+  # clone the repository locally
+  $ git clone git at github.com:USERNAME/pycsw.git
+  $ cd pycsw
+  $ pip install -e . && pip install -r requirements-standalone.txt
+  # add the main pycsw master branch to keep up to date with upstream changes
+  $ git remote add upstream https://github.com/geopython/pycsw.git
+  $ git pull upstream master
+  # create a local branch off master
+  # The name of the branch should include the issue number if it exists
+  $ git branch 72-foo
+  $ git checkout 72-foo
+  # 
+  # make code/doc changes
+  #
+  $ git commit -am 'fix xyz (#72-foo)'
+  $ git push origin 72-foo
+
+Your changes are now visible on your pycsw repository on GitHub.  You are now ready to create a pull request.
+A member of the pycsw team will review the pull request and provide feedback / suggestions if required.  If changes are
+required, make them against the same branch and push as per above (all changes to the branch in the pull request apply).
+
+The pull request will then be merged by the pycsw team.  You can then delete your local branch (on GitHub), and then update
+your own repository to ensure your pycsw repository is up to date with pycsw master:
+
+.. code-block:: bash
+
+  $ 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
+
+.. _`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
diff --git a/HISTORY.txt b/HISTORY.txt
new file mode 100644
index 0000000..0cc8a0a
--- /dev/null
+++ b/HISTORY.txt
@@ -0,0 +1,4 @@
+pycsw Revision History
+===========================
+
+See http://github.com/geopython/pycsw for commit and release history.
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..5dbcb2b
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2010-2013 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
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..39a2604
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,2 @@
+recursive-include pycsw *.xsd
+include *.txt
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..4f32d50
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,12 @@
+pycsw README
+============
+
+pycsw is an OGC CSW server implementation written in Python.
+
+pycsw fully implements the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web]. Initial development started in 2010 (more formally announced in 2011). The project is certified OGC Compliant, and is an OGC Reference Implementation.
+
+pycsw allows for the publishing and discovery of geospatial metadata. Existing repositories of geospatial metadata can also be exposed via OGC:CSW 2.0.2, providing a standards-based metadata and catalogue component of spatial data infrastructures.
+
+pycsw is Open Source, released under an MIT license, and runs on all major platforms (Windows, Linux, Mac OS X).
+
+Please read the docs at http://pycsw.org/docs for more information.
diff --git a/VERSION.txt b/VERSION.txt
new file mode 100644
index 0000000..53adb84
--- /dev/null
+++ b/VERSION.txt
@@ -0,0 +1 @@
+1.8.2
diff --git a/bin/pycsw-admin.py b/bin/pycsw-admin.py
new file mode 100755
index 0000000..ea11ddf
--- /dev/null
+++ b/bin/pycsw-admin.py
@@ -0,0 +1,260 @@
+#!/usr/bin/python
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#          Angelos Tzotsos <tzotsos at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import ConfigParser
+import getopt
+import logging
+import sys
+
+from pycsw import admin, config
+
+logging.basicConfig(format='%(message)s', level=logging.DEBUG)
+
+CONTEXT = config.StaticContext()
+
+
+def usage():
+    """Provide usage instructions"""
+    return '''
+NAME
+    pycsw-admin.py - pycsw admin utility
+
+SYNOPSIS
+    pycsw-admin.py -c <command> -f <cfg> [-h] [-p /path/to/records] [-r]
+
+    Available options:
+
+    -c    Command to be performed:
+              - setup_db
+              - load_records
+              - export_records
+              - rebuild_db_indexes
+              - optimize_db
+              - refresh_harvested_records
+              - gen_sitemap
+              - gen_opensearch_description
+              - post_xml
+              - get_sysprof
+              - validate_xml
+
+    -f    Filepath to pycsw configuration
+
+    -h    Usage message
+
+    -o    path to output file
+
+    -p    path to input/output directory to read/write metadata records
+
+    -r    load records from directory recursively
+
+    -s    XML Schema
+
+    -t    Timeout (in seconds) for HTTP requests (default is 30)
+
+    -u    URL of CSW
+
+    -x    XML document
+    
+EXAMPLES
+
+    1.) setup_db: Creates repository tables and indexes
+
+        pycsw-admin.py -c setup_db -f default.cfg
+        
+    2.) load_records: Loads metadata records from directory into repository
+
+        pycsw-admin.py -c load_records -p /path/to/records -f default.cfg
+
+        Load records from directory recursively
+
+        pycsw-admin.py -c load_records -p /path/to/records -f default.cfg -r
+
+    3.) export_records: Dump metadata records from repository into directory
+
+        pycsw-admin.py -c export_records -p /path/to/records -f default.cfg
+
+    4.) rebuild_db_indexes: Rebuild repository database indexes
+
+        pycsw-admin.py -c rebuild_db_indexes -f default.cfg
+
+    5.) optimize_db: Optimize repository database
+
+        pycsw-admin.py -c optimize_db -f default.cfg
+
+    6.) refresh_harvested_records: Refresh repository records
+        which have been harvested
+
+        pycsw-admin.py -c refresh_harvested_records -f default.cfg
+
+    7.) gen_sitemap: Generate XML Sitemap
+
+        pycsw-admin.py -c gen_sitemap -f default.cfg -o /path/to/sitemap.xml
+
+    8.) gen_opensearch_description: Generate OpenSearch Description document
+
+        pycsw-admin.py -c gen_opensearch_description -f default.cfg -o /path/to/opensearch.xml
+
+    8.) post_xml: Execute a CSW request via HTTP POST
+
+        pycsw-admin.py -c post_xml -u http://host/csw -x /path/to/request.xml
+
+    9.) get_sysprof: Get versions of dependencies
+
+        pycsw-admin.py -c get_sysprof
+
+   10.) validate_xml: Validate an XML document against an XML Schema
+
+        pycsw-admin.py -c validate_xml -x file.xml -s file.xsd
+
+'''
+
+COMMAND = None
+XML_DIRPATH = None
+CFG = None
+RECURSIVE = False
+OUTPUT_FILE = None
+CSW_URL = None
+XML = None
+XSD = None
+TIMEOUT = 30
+
+if len(sys.argv) == 1:
+    print usage()
+    sys.exit(1)
+
+try:
+    OPTS, ARGS = getopt.getopt(sys.argv[1:], 'c:f:ho:p:ru:x:s:t:')
+except getopt.GetoptError, err:
+    print '\nERROR: %s' % err
+    print usage()
+    sys.exit(2)
+
+for o, a in OPTS:
+    if o == '-c':
+        COMMAND = a
+    if o == '-f':
+        CFG = a
+    if o == '-o':
+        OUTPUT_FILE = a
+    if o == '-p':
+        XML_DIRPATH = a
+    if o == '-r':
+        RECURSIVE = True
+    if o == '-u':
+        CSW_URL = a
+    if o == '-x':
+        XML = a
+    if o == '-s':
+        XSD = a
+    if o == '-t':
+        TIMEOUT = int(a)
+    if o == '-h':  # dump help and exit
+        print usage()
+        sys.exit(3)
+
+if COMMAND is None:
+    print '-c <command> is a required argument'
+    sys.exit(4)
+
+if COMMAND not in ['setup_db', 'load_records', 'export_records',
+                   'rebuild_db_indexes', 'optimize_db',
+                   'refresh_harvested_records', 'gen_sitemap',
+                   'gen_opensearch_description', 'post_xml', 'get_sysprof',
+                   'validate_xml']:
+    print 'ERROR: invalid command name: %s' % COMMAND
+    sys.exit(5)
+
+if CFG is None and COMMAND not in ['post_xml', 'get_sysprof', 'validate_xml']:
+    print 'ERROR: -f <cfg> is a required argument'
+    sys.exit(6)
+
+if COMMAND in ['load_records', 'export_records'] and XML_DIRPATH is None:
+    print 'ERROR: -p </path/to/records> is a required argument'
+    sys.exit(7)
+
+if (COMMAND in ['gen_sitemap', 'gen_opensearch_description'] and
+        OUTPUT_FILE is None):
+    print 'ERROR: -o </path/to/sitemap.xml> is a required argument'
+    sys.exit(8)
+
+if COMMAND not in ['post_xml', 'get_sysprof', 'validate_xml']:
+    SCP = ConfigParser.SafeConfigParser()
+    SCP.readfp(open(CFG))
+
+    DATABASE = SCP.get('repository', 'database')
+    URL = SCP.get('server', 'url')
+    HOME = SCP.get('server', 'home')
+    METADATA = dict(SCP.items('metadata:main'))
+    try:
+        TABLE = SCP.get('repository', 'table')
+    except ConfigParser.NoOptionError:
+        TABLE = 'records'
+
+elif COMMAND not in ['get_sysprof', 'validate_xml']:
+    if CSW_URL is None:
+        print 'ERROR: -u <http://host/csw> is a required argument'
+        sys.exit(9)
+    if XML is None:
+        print 'ERROR: -x /path/to/request.xml is a required argument'
+        sys.exit(10)
+elif COMMAND == 'validate_xml':
+    if XML is None:
+        print 'ERROR: -x /path/to/file.xml is a required argument'
+        sys.exit(11)
+    if XSD is None:
+        print 'ERROR: -s /path/to/file.xsd is a required argument'
+        sys.exit(12)
+
+if COMMAND == 'setup_db':
+    admin.setup_db(DATABASE, TABLE, HOME)
+elif COMMAND == 'load_records':
+    admin.load_records(CONTEXT, DATABASE, TABLE, XML_DIRPATH, RECURSIVE)
+elif COMMAND == 'export_records':
+    admin.export_records(CONTEXT, DATABASE, TABLE, XML_DIRPATH)
+elif COMMAND == 'rebuild_db_indexes':
+    admin.rebuild_db_indexes(DATABASE, TABLE)
+elif COMMAND == 'optimize_db':
+    admin.optimize_db(CONTEXT, DATABASE, TABLE)
+elif COMMAND == 'refresh_harvested_records':
+    admin.refresh_harvested_records(CONTEXT, DATABASE, TABLE, URL)
+elif COMMAND == 'gen_sitemap':
+    admin.gen_sitemap(CONTEXT, DATABASE, TABLE, URL, OUTPUT_FILE)
+elif COMMAND == 'gen_opensearch_description':
+    admin.gen_opensearch_description(CONTEXT, METADATA, URL, OUTPUT_FILE)
+elif COMMAND == 'post_xml':
+    print admin.post_xml(CSW_URL, XML, TIMEOUT)
+elif COMMAND == 'get_sysprof':
+    print admin.get_sysprof()
+elif COMMAND == 'validate_xml':
+    admin.validate_xml(XML, XSD)
+
+print 'Done'
diff --git a/bin/pycsw-pylint.sh b/bin/pycsw-pylint.sh
new file mode 100755
index 0000000..43e262c
--- /dev/null
+++ b/bin/pycsw-pylint.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+# run pylint without warnings about docstrings on first line
+# and suppress reporting
+
+pylint -r n -d C0111 $1
diff --git a/csw.py b/csw.py
new file mode 100755
index 0000000..79fb7a7
--- /dev/null
+++ b/csw.py
@@ -0,0 +1,84 @@
+#!/usr/bin/python -u
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2010 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+# CGI wrapper for pycsw
+
+import os
+import sys
+from StringIO import StringIO
+from pycsw import server
+
+CONFIG = 'default.cfg'
+GZIP = False
+
+if 'PYCSW_CONFIG' in os.environ:
+    CONFIG = os.environ['PYCSW_CONFIG']
+if os.environ['QUERY_STRING'].lower().find('config') != -1:
+    for kvp in os.environ['QUERY_STRING'].split('&'):
+        if kvp.lower().find('config') != -1:
+            CONFIG = kvp.split('=')[1]
+
+if ('HTTP_ACCEPT_ENCODING' in os.environ and
+        os.environ['HTTP_ACCEPT_ENCODING'].find('gzip') != -1):
+    # set for gzip compressed response
+    GZIP = True
+
+# get runtime configuration
+CSW = server.Csw(CONFIG)
+
+# set compression level
+if CSW.config.has_option('server', 'gzip_compresslevel'):
+    GZIP_COMPRESSLEVEL = \
+        int(CSW.config.get('server', 'gzip_compresslevel'))
+else:
+    GZIP_COMPRESSLEVEL = 0
+
+# go!
+OUTP = CSW.dispatch_cgi()
+
+sys.stdout.write("Content-Type:%s\r\n" % CSW.contenttype)
+
+if GZIP and GZIP_COMPRESSLEVEL > 0:
+    import gzip
+
+    BUF = StringIO()
+    GZIPFILE = gzip.GzipFile(mode='wb', fileobj=BUF,
+                             compresslevel=GZIP_COMPRESSLEVEL)
+    GZIPFILE.write(OUTP)
+    GZIPFILE.close()
+
+    OUTP = BUF.getvalue()
+
+    sys.stdout.write('Content-Encoding: gzip\r\n')
+
+sys.stdout.write('Content-Length: %d\r\n' % len(OUTP))
+sys.stdout.write('\r\n')
+sys.stdout.write(OUTP)
diff --git a/csw.wsgi b/csw.wsgi
new file mode 100644
index 0000000..ca9ac1f
--- /dev/null
+++ b/csw.wsgi
@@ -0,0 +1,132 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Adam Hinz <hinz.adam at gmail.com>
+#
+# Copyright (c) 2012 Adam Hinz
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+# WSGI wrapper for pycsw
+#
+# Apache mod_wsgi configuration
+#
+# ServerName host1
+# WSGIDaemonProcess host1 home=/var/www/pycsw processes=2
+# WSGIProcessGroup host1
+#
+# WSGIScriptAlias /pycsw-wsgi /var/www/pycsw/csw.wsgi
+#
+# <Directory /var/www/pycsw>
+#  Order deny,allow
+#  Allow from all
+# </Directory>
+#
+# or invoke this script from the command line:
+#
+# $ python ./csw.wsgi
+#
+# which will publish pycsw to:
+#
+# http://localhost:8000/
+#
+
+from StringIO import StringIO
+import os
+import sys
+
+app_path = os.path.dirname(__file__)
+sys.path.append(app_path)
+
+from pycsw import server
+
+
+def application(env, start_response):
+    """WSGI wrapper"""
+    config = 'default.cfg'
+
+    if 'PYCSW_CONFIG' in env:
+        config = env['PYCSW_CONFIG']
+
+    if env['QUERY_STRING'].lower().find('config') != -1:
+        for kvp in env['QUERY_STRING'].split('&'):
+            if kvp.lower().find('config') != -1:
+                config = kvp.split('=')[1]
+
+    if not os.path.isabs(config):
+        config = os.path.join(app_path, config)
+
+    if 'HTTP_HOST' in env and ':' in env['HTTP_HOST']:
+        env['HTTP_HOST'] = env['HTTP_HOST'].split(':')[0]
+
+    env['local.app_root'] = app_path
+
+    csw = server.Csw(config, env)
+
+    gzip = False
+    if ('HTTP_ACCEPT_ENCODING' in env and
+            env['HTTP_ACCEPT_ENCODING'].find('gzip') != -1):
+        # set for gzip compressed response
+        gzip = True
+
+    # set compression level
+    if csw.config.has_option('server', 'gzip_compresslevel'):
+        gzip_compresslevel = \
+            int(csw.config.get('server', 'gzip_compresslevel'))
+    else:
+        gzip_compresslevel = 0
+
+    contents = csw.dispatch_wsgi()
+
+    headers = {}
+
+    if gzip and gzip_compresslevel > 0:
+        import gzip
+
+        buf = StringIO()
+        gzipfile = gzip.GzipFile(mode='wb', fileobj=buf,
+                                 compresslevel=gzip_compresslevel)
+        gzipfile.write(contents)
+        gzipfile.close()
+
+        contents = buf.getvalue()
+
+        headers['Content-Encoding'] = 'gzip'
+
+    headers['Content-Length'] = str(len(contents))
+    headers['Content-Type'] = csw.contenttype
+
+    status = '200 OK'
+    start_response(status, headers.items())
+
+    return [contents]
+
+if __name__ == '__main__':  # run inline using WSGI reference implementation
+    from wsgiref.simple_server import make_server
+    port = 8000
+    if len(sys.argv) > 1:
+        port = int(sys.argv[1])
+    httpd = make_server('', port, application)
+    print "Serving on port %d..." % port
+    httpd.serve_forever()
diff --git a/default-sample.cfg b/default-sample.cfg
new file mode 100644
index 0000000..5420a7f
--- /dev/null
+++ b/default-sample.cfg
@@ -0,0 +1,98 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2010 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=/var/www/pycsw
+url=http://localhost/pycsw/csw.py
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+#federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+#pretty_print=true
+#gzip_compresslevel=8
+#domainquerytype=range
+#domaincounts=true
+#spatial_ranking=true
+profiles=apiso
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+#csw_harvest_pagesize=10
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery,metadata
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=Organization Name
+provider_url=http://pycsw.org/
+contact_name=Lastname, Firstname
+contact_position=Position Title
+contact_address=Mailing Address
+contact_city=City
+contact_stateorprovince=Administrative Area
+contact_postalcode=Zip or Postal Code
+contact_country=Country
+contact_phone=+xx-xxx-xxx-xxxx
+contact_fax=+xx-xxx-xxx-xxxx
+contact_email=Email Address
+contact_url=Contact URL
+contact_hours=Hours of Service
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:////var/www/pycsw/tests/suites/cite/data/records.db
+# postgres
+#database=postgresql://username:password@localhost/pycsw
+# mysql
+#database=mysql://username:password@localhost/pycsw?charset=utf8
+#mappings=path/to/mappings.py
+table=records
+#filter=type = 'http://purl.org/dc/dcmitype/Dataset'
+
+[metadata:inspire]
+enabled=true
+languages_supported=eng,gre
+default_language=eng
+date=YYYY-MM-DD
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=Organization Name
+contact_email=Email Address
+temp_extent=YYYY-MM-DD/YYYY-MM-DD
+
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..f249484
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,154 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -W -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  texinfo    to make Texinfo files"
+	@echo "  info       to make Texinfo files and run them through makeinfo"
+	@echo "  gettext    to make PO message catalogs"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	mkdir -p $(BUILDDIR)
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pycsw.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pycsw.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/pycsw"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pycsw"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	$(MAKE) -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo
+	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+	@echo "Run \`make' in that directory to run these through makeinfo" \
+	      "(use \`make info' here to do that automatically)."
+
+info:
+	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+	@echo "Running Texinfo files through makeinfo..."
+	make -C $(BUILDDIR)/texinfo info
+	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+	@echo
+	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/docs/_build/doctrees/administration.doctree b/docs/_build/doctrees/administration.doctree
new file mode 100644
index 0000000..f3c12c0
Binary files /dev/null and b/docs/_build/doctrees/administration.doctree differ
diff --git a/docs/_build/doctrees/ckan.doctree b/docs/_build/doctrees/ckan.doctree
new file mode 100644
index 0000000..4d28084
Binary files /dev/null and b/docs/_build/doctrees/ckan.doctree differ
diff --git a/docs/_build/doctrees/committers.doctree b/docs/_build/doctrees/committers.doctree
new file mode 100644
index 0000000..7c64195
Binary files /dev/null and b/docs/_build/doctrees/committers.doctree differ
diff --git a/docs/_build/doctrees/configuration.doctree b/docs/_build/doctrees/configuration.doctree
new file mode 100644
index 0000000..a456c01
Binary files /dev/null and b/docs/_build/doctrees/configuration.doctree differ
diff --git a/docs/_build/doctrees/contributing.doctree b/docs/_build/doctrees/contributing.doctree
new file mode 100644
index 0000000..5b4eb71
Binary files /dev/null and b/docs/_build/doctrees/contributing.doctree differ
diff --git a/docs/_build/doctrees/distributedsearching.doctree b/docs/_build/doctrees/distributedsearching.doctree
new file mode 100644
index 0000000..eed2e1d
Binary files /dev/null and b/docs/_build/doctrees/distributedsearching.doctree differ
diff --git a/docs/_build/doctrees/geonode.doctree b/docs/_build/doctrees/geonode.doctree
new file mode 100644
index 0000000..1974fd1
Binary files /dev/null and b/docs/_build/doctrees/geonode.doctree differ
diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree
new file mode 100644
index 0000000..e843d82
Binary files /dev/null and b/docs/_build/doctrees/index.doctree differ
diff --git a/docs/_build/doctrees/installation.doctree b/docs/_build/doctrees/installation.doctree
new file mode 100644
index 0000000..f854911
Binary files /dev/null and b/docs/_build/doctrees/installation.doctree differ
diff --git a/docs/_build/doctrees/introduction.doctree b/docs/_build/doctrees/introduction.doctree
new file mode 100644
index 0000000..62966d3
Binary files /dev/null and b/docs/_build/doctrees/introduction.doctree differ
diff --git a/docs/_build/doctrees/license.doctree b/docs/_build/doctrees/license.doctree
new file mode 100644
index 0000000..fc0d6c5
Binary files /dev/null and b/docs/_build/doctrees/license.doctree differ
diff --git a/docs/_build/doctrees/odc.doctree b/docs/_build/doctrees/odc.doctree
new file mode 100644
index 0000000..63d36cf
Binary files /dev/null and b/docs/_build/doctrees/odc.doctree differ
diff --git a/docs/_build/doctrees/opensearch.doctree b/docs/_build/doctrees/opensearch.doctree
new file mode 100644
index 0000000..8e853d6
Binary files /dev/null and b/docs/_build/doctrees/opensearch.doctree differ
diff --git a/docs/_build/doctrees/outputschemas.doctree b/docs/_build/doctrees/outputschemas.doctree
new file mode 100644
index 0000000..6e19be9
Binary files /dev/null and b/docs/_build/doctrees/outputschemas.doctree differ
diff --git a/docs/_build/doctrees/profiles.doctree b/docs/_build/doctrees/profiles.doctree
new file mode 100644
index 0000000..9f4b76d
Binary files /dev/null and b/docs/_build/doctrees/profiles.doctree differ
diff --git a/docs/_build/doctrees/repofilters.doctree b/docs/_build/doctrees/repofilters.doctree
new file mode 100644
index 0000000..daf79be
Binary files /dev/null and b/docs/_build/doctrees/repofilters.doctree differ
diff --git a/docs/_build/doctrees/sitemaps.doctree b/docs/_build/doctrees/sitemaps.doctree
new file mode 100644
index 0000000..8e4ee54
Binary files /dev/null and b/docs/_build/doctrees/sitemaps.doctree differ
diff --git a/docs/_build/doctrees/soap.doctree b/docs/_build/doctrees/soap.doctree
new file mode 100644
index 0000000..5faf494
Binary files /dev/null and b/docs/_build/doctrees/soap.doctree differ
diff --git a/docs/_build/doctrees/sru.doctree b/docs/_build/doctrees/sru.doctree
new file mode 100644
index 0000000..fe9b645
Binary files /dev/null and b/docs/_build/doctrees/sru.doctree differ
diff --git a/docs/_build/doctrees/support.doctree b/docs/_build/doctrees/support.doctree
new file mode 100644
index 0000000..2af4d54
Binary files /dev/null and b/docs/_build/doctrees/support.doctree differ
diff --git a/docs/_build/doctrees/testing.doctree b/docs/_build/doctrees/testing.doctree
new file mode 100644
index 0000000..cb61203
Binary files /dev/null and b/docs/_build/doctrees/testing.doctree differ
diff --git a/docs/_build/doctrees/tools.doctree b/docs/_build/doctrees/tools.doctree
new file mode 100644
index 0000000..3b270d6
Binary files /dev/null and b/docs/_build/doctrees/tools.doctree differ
diff --git a/docs/_build/doctrees/transactions.doctree b/docs/_build/doctrees/transactions.doctree
new file mode 100644
index 0000000..6684ef6
Binary files /dev/null and b/docs/_build/doctrees/transactions.doctree differ
diff --git a/docs/_build/html/_sources/administration.txt b/docs/_build/html/_sources/administration.txt
new file mode 100644
index 0000000..3ea9591
--- /dev/null
+++ b/docs/_build/html/_sources/administration.txt
@@ -0,0 +1,173 @@
+.. _administration:
+
+Administration
+==============
+
+pycsw administration is handled by the ``pycsw-admin.py`` utility.  ``pycsw-admin.py``
+is installed as part of the pycsw install process and should be available in your
+PATH.
+
+.. note::
+  Run ``pycsw-admin.py -h`` to see all administration operations and parameters
+
+Metadata Repository Setup
+-------------------------
+
+pycsw supports the following databases:
+
+- SQLite3
+- PostgreSQL
+- PostgreSQL with PostGIS enabled
+- MySQL
+
+.. note::
+  The easiest and fastest way to deploy pycsw is to use SQLite3 as the backend.
+
+.. note::
+  PostgreSQL support includes support for PostGIS functions if enabled
+
+.. note::
+  If PostGIS (1.x or 2.x) is activated before setting up the pycsw/PostgreSQL database, then native PostGIS geometries will be enabled.
+
+To expose your geospatial metadata via pycsw, perform the following actions:
+
+- setup the database
+- import metadata
+- publish the repository
+
+Supported Information Models
+----------------------------
+
+By default, pycsw supports the ``csw:Record`` information model.
+
+.. note::
+  See :ref:`profiles` for information on enabling profiles
+
+Setting up the Database
+-----------------------
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c setup_db -f default.cfg
+
+This will create the necessary tables and values for the repository.
+
+The database created is an `OGC SFSQL`_ compliant database, and can be used with any implementing software.  For example, to use with `OGR`_:
+
+.. code-block:: bash
+
+  $ ogrinfo /path/to/records.db
+  INFO: Open of 'records.db'
+  using driver 'SQLite' successful.
+  1: records (Polygon)
+  $ ogrinfo -al /path/to/records.db
+  # lots of output
+
+.. note::
+  If PostGIS is detected, the pycsw-admin.py script does not create the SFSQL tables as they are already in the database.
+
+
+Loading Records
+----------------
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c load_records -f default.cfg -p /path/to/records
+
+This will import all ``*.xml`` records from ``/path/to/records`` into the database specified in ``default.cfg`` (``repository.database``).  Passing ``-r`` to the script will process ``/path/to/records`` recursively.
+
+.. note::
+  Records can also be imported using CSW-T (see :ref:`transactions`).
+
+Exporting the Repository
+------------------------
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c export_records -f default.cfg -p /path/to/output_dir
+
+This will write each record in the database specified in ``default.cfg`` (``repository.database``) to an XML document on disk, in directory ``/path/to/output_dir``.
+
+Optimizing the Database
+-----------------------
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c optimize_db -f default.cfg
+
+.. note::
+  This feature is relevant only for PostgreSQL and MySQL
+
+Database Specific Notes
+-----------------------
+
+PostgreSQL
+^^^^^^^^^^
+
+- if PostGIS is not enabled, pycsw makes uses of PL/Python functions.  To enable PostgreSQL support, the database user must be able to create functions within the database. In case of recent PostgreSQL versions (9.x), the PL/Python extension must be enabled prior to pycsw setup
+- `PostgreSQL Full Text Search`_ is supported for ``csw:AnyText`` based queries.  pycsw creates a tsvector column based on the text from anytext column. Then pycsw creates a GIN index against the anytext_tsvector column.  This is created automatically in ``pycsw.admin.setup_db``.  Any query against `csw:AnyText` or `apiso:AnyText` will process using PostgreSQL FTS handling
+
+PostGIS
+^^^^^^^
+
+- pycsw makes use of PostGIS spatial functions and native geometry data type.
+- It is advised to install the PostGIS extension before setting up the pycsw database
+- If PostGIS is detected, the pycsw-admin.py script will create both a native geometry column and a WKT column, as well as a trigger to keep both synchronized. 
+- In case PostGIS gets disabled, pycsw will continue to work with the `WKT`_ column
+- In case of migration from plain PostgreSQL database to PostGIS, the spatial functions of PostGIS will be used automatically
+- When migrating from plain PostgreSQL database to PostGIS, in order to enable native geometry support, a "GEOMETRY" column named "wkb_geometry" needs to be created manually (along with the update trigger in ``pycsw.admin.setup_db``). Also the native geometries must be filled manually from the `WKT`_ field. Next versions of pycsw will automate this process
+
+.. _custom_repository:
+
+Mapping to an Existing Repository
+---------------------------------
+
+pycsw supports publishing metadata from an existing repository.  To enable this functionality, the default database mappings must be modified to represent the existing database columns mapping to the abstract core model (the default mappings are in ``pycsw/config.py:MD_CORE_MODEL``).
+
+To override the default settings:
+
+- define a custom database mapping based on ``etc/mappings.py``
+- in ``default.cfg``, set ``repository.mappings`` to the location of the mappings.py file:
+
+.. code-block:: none
+
+  [repository]
+  ...
+  mappings=path/to/mappings.py
+
+See the :ref:`geonode` and :ref:`odc` for further examples.
+
+Existing Repository Requirements
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+pycsw requires certain repository attributes and semantics to exist in any repository to operate as follows:
+
+- ``pycsw:Identifier``: unique identifier
+- ``pycsw:Typename``: typename for the metadata; typically the value of the root element tag (e.g. ``csw:Record``, ``gmd:MD_Metadata``)
+- ``pycsw:Schema``: schema for the metadata; typically the target namespace (e.g. ``http://www.opengis.net/cat/csw/2.0.2``, ``http://www.isotc211.org/2005/gmd``)
+- ``pycsw:InsertDate``: date of insertion
+- ``pycsw:XML``: full XML representation
+- ``pycsw:AnyText``: bag of XML element text values, used for full text search.  Realized with the following design pattern:
+
+  - capture all XML element and attribute values
+  - store in repository
+- ``pycsw:BoundingBox``: string of `WKT`_ or `EWKT`_ geometry
+
+The following repository semantics exist if the attributes are specified:
+
+- ``pycsw:Keywords``: comma delimited list of keywords
+- ``pycsw:Links``: structure of links in the format "name,description,protocol,url[^,,,[^,,,]]"
+
+Values of mappings can be derived from the following mechanisms:
+
+- text fields
+- Python datetime.datetime or datetime.date objects
+- Python functions 
+
+Further information is provided in ``pycsw/config.py:MD_CORE_MODEL``.
+
+.. _`OGR`: http://www.gdal.org/ogr
+.. _`OGC SFSQL`: http://www.opengeospatial.org/standards/sfs
+.. _`WKT`: http://en.wikipedia.org/wiki/Well-known_text
+.. _`EWKT`: http://en.wikipedia.org/wiki/Well-known_text#Variations
+.. _`PostgreSQL Full Text Search`: http://www.postgresql.org/docs/9.2/static/textsearch.html
diff --git a/docs/_build/html/_sources/ckan.txt b/docs/_build/html/_sources/ckan.txt
new file mode 100644
index 0000000..40a083f
--- /dev/null
+++ b/docs/_build/html/_sources/ckan.txt
@@ -0,0 +1,16 @@
+.. _ckan:
+
+CKAN Configuration
+==================
+
+CKAN (http://ckan.org) is a powerful data management system that makes data accessible – by providing tools to streamline publishing, sharing, finding and using data. CKAN is aimed at data publishers (national and regional governments, companies and organizations) wanting to make their data open and available.
+
+`ckanext-spatial`_ is CKAN's geospatial extension.  The extension adds a spatial field to the default CKAN dataset schema, using PostGIS as the backend. This allows to perform spatial queries and display the dataset extent on the frontend. It also provides harvesters to import geospatial metadata into CKAN from other sources, as well as commands to support the CSW standard. Finally, it also includes plugins to preview spatial formats such as GeoJSON.
+
+CKAN Setup
+----------
+
+Installation and configuration Instructions are provided as part of the ckanext-spatial `documentation`_.
+
+.. _`ckanext-spatial`: https://github.com/okfn/ckanext-spatial
+.. _`documentation`: http://docs.ckan.org/projects/ckanext-spatial/en/latest/csw.html
diff --git a/docs/_build/html/_sources/committers.txt b/docs/_build/html/_sources/committers.txt
new file mode 100644
index 0000000..ca189f3
--- /dev/null
+++ b/docs/_build/html/_sources/committers.txt
@@ -0,0 +1,6 @@
+.. _committers:
+
+Committers
+==========
+
+.. include:: ../COMMITTERS.txt
diff --git a/docs/_build/html/_sources/configuration.txt b/docs/_build/html/_sources/configuration.txt
new file mode 100644
index 0000000..c69a434
--- /dev/null
+++ b/docs/_build/html/_sources/configuration.txt
@@ -0,0 +1,112 @@
+.. _configuration:
+
+Configuration
+=============
+
+pycsw's runtime configuration is defined by ``default.cfg``.  pycsw ships with a sample configuration (``default-sample.cfg``).  Copy the file to ``default.cfg`` and edit the following: 
+
+**[server]**
+
+- **home**: the full filesystem path to pycsw
+- **url**: the URL of the resulting service
+- **mimetype**: the MIME type when returning HTTP responses
+- **language**: the ISO 639-1 language and ISO 3166-1 alpha2 country code of the service (e.g. ``en-CA``, ``fr-CA``, ``en-US``)
+- **encoding**: the content type encoding (e.g. ``ISO-8859-1``)
+- **maxrecords**: the maximum number of records to return by default
+- **loglevel**: the logging level (see http://docs.python.org/library/logging.html#logging-levels)
+- **logfile**: the full file path to the logfile
+- **ogc_schemas_base**: base URL of OGC XML schemas tree file structure (default is http://schemas.opengis.net)
+- **federatedcatalogues**: comma delimited list of CSW endpoints to be used for distributed searching, if requested by the client (see :ref:`distributedsearching`)
+- **pretty_print**: whether to pretty print the output (``true`` or ``false``).  Default is ``false``
+- **gzip_compresslevel**: gzip compression level, lowest is ``1``, highest is ``9``.  Default is off
+- **domainquerytype**: for GetDomain operations, how to output domain values.  Accepted values are ``list`` and ``range`` (min/max). Default is ``list``
+- **domaincounts**: for GetDomain operations, whether to provide frequency counts for values.  Accepted values are ``true`` and ``False``. Default is ``false``
+- **profiles**: comma delimited list of profiles to load at runtime (default is none).  See :ref:`profiles`
+- **smtp_host**: SMTP host for processing ``csw:ResponseHandler`` parameter via outgoing email requests (default is ``localhost``)
+- **spatial_ranking**: parameter that enables (``true`` or ``false``) ranking of spatial query results as per `K.J. Lanfear 2006 - A Spatial Overlay Ranking Method for a Geospatial Search of Text Objects  <http://pubs.usgs.gov/of/2006/1279/2006-1279.pdf>`_.
+
+**[manager]**
+
+- **transactions**: whether to enable transactions (``true`` or ``false``).  Default is ``false`` (see :ref:`transactions`)
+- **allowed_ips**: comma delimited list of IP addresses (e.g. 192.168.0.103), wildcards (e.g. 192.168.0.*) or CIDR notations (e.g. 192.168.100.0/24) allowed to perform transactions (see :ref:`transactions`)
+- **csw_harvest_pagesize**: when harvesting other CSW servers, the number of records per request to page by (default is 10)
+
+**[metadata:main]**
+
+- **identification_title**: the title of the service
+- **identification_abstract**: some descriptive text about the service
+- **identification_keywords**: comma delimited list of keywords about the service
+- **identification_keywords_type**: keyword type as per the `ISO 19115 MD_KeywordTypeCode codelist <http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode>`_).  Accepted values are ``discipline``, ``temporal``, ``place``, ``theme``, ``stratum``
+- **identification_fees**: fees associated with the service
+- **identification_accessconstraints**: access constraints associated with the service
+- **provider_name**: the name of the service provider
+- **provider_url**: the URL of the service provider
+- **contact_name**: the name of the provider contact
+- **contact_position**: the position title of the provider contact
+- **contact_address**: the address of the provider contact
+- **contact_city**: the city of the provider contact
+- **contact_stateorprovince**: the province or territory of the provider contact
+- **contact_postalcode**: the postal code of the provider contact
+- **contact_country**: the country of the provider contact
+- **contact_phone**: the phone number of the provider contact
+- **contact_fax**: the facsimile number of the provider contact
+- **contact_email**: the email address of the provider contact
+- **contact_url**: the URL to more information about the provider contact
+- **contact_hours**: the hours of service to contact the provider
+- **contact_instructions**: the how to contact the provider contact
+- **contact_role**: the role of the provider contact as per the `ISO 19115 CI_RoleCode codelist <http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode>`_).  Accepted values are ``author``, ``processor``, ``publisher``, ``custodian``, ``pointOfContact``, ``distributor``, ``user``, ``resourceProvider``, ``originator``, ``owner``, ``principalInvestigator``
+
+**[repository]**
+
+- **database**: the full file path to the metadata database, in database URL format (see http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls)
+- **table**: the table name for metadata records (default is ``records``).  If you are using PostgreSQL with a DB schema other than ``public``, qualify the table like ``myschema.table``
+- **mappings**: custom repository mappings (see :ref:`custom_repository`)
+- **source**: the source of this repository only if not local (e.g. :ref:`geonode`, :ref:`odc`).  Supported values are ``geonode``, ``odc``
+- **filter**: server side database filter to apply as mask to all CSW requests (see :ref:`repofilters`)
+
+.. note::
+
+  See :ref:`administration` for connecting your metadata repository and supported information models.
+
+.. _alternate-configurations:
+
+Alternate Configurations
+------------------------
+
+By default, pycsw loads ``default.cfg`` at runtime.  To load an alternate configuration, modify ``csw.py`` to point to the desired configuration.  Alternatively, pycsw supports explicitly specifiying a configuration by appending ``config=/path/to/default.cfg`` to the base URL of the service (e.g. ``http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities``).  When the ``config`` parameter is passed by a CSW client, pycsw will [...]
+
+This also provides the functionality to deploy numerous CSW servers with a single pycsw installation.
+
+Hiding the Location
+^^^^^^^^^^^^^^^^^^^
+
+Some deployments with alternate configurations prefer not to advertise the base URL with the ``config=`` approach.  In this case, there are many options to advertise the base URL.
+
+Environment Variables
+~~~~~~~~~~~~~~~~~~~~~
+
+One option is using Apache's ``Alias`` and ``SetEnvIf`` directives.  For example, given the base URL ``http://localhost/pycsw/csw.py?config=foo.cfg``, set the following in Apache's ``httpd.conf``:
+
+.. code-block:: none
+
+  Alias /pycsw/csw-foo.py /var/www/pycsw/csw.py
+  SetEnvIf Request_URI "/pycsw/csw-foo.py" PYCSW_CONFIG=/var/www/pycsw/csw-foo.cfg
+
+.. note::
+
+  Apache must be restarted after changes to ``httpd.conf``
+
+pycsw will use the configuration as set in the ``PYCSW_CONFIG`` environment variable in the same manner as if it was specified in the base URL.  Note that the configuration value ``server.url`` value must match the ``Request_URI`` value so as to advertise correctly in pycsw's Capabilities XML.
+
+Wrapper Script
+~~~~~~~~~~~~~~
+
+Another option is to write a simple wrapper (e.g. ``csw-foo.sh``), which provides the same functionality and can be deployed without restarting Apache:
+
+.. code-block:: bash
+
+  #!/bin/sh
+
+  export PYCSW_CONFIG=/var/www/pycsw/csw-foo.cfg
+
+  /var/www/pycsw/csw.py
diff --git a/docs/_build/html/_sources/contributing.txt b/docs/_build/html/_sources/contributing.txt
new file mode 100644
index 0000000..4628182
--- /dev/null
+++ b/docs/_build/html/_sources/contributing.txt
@@ -0,0 +1,3 @@
+.. _contributing:
+
+.. include:: ../CONTRIBUTING.rst
diff --git a/docs/_build/html/_sources/distributedsearching.txt b/docs/_build/html/_sources/distributedsearching.txt
new file mode 100644
index 0000000..eece5b2
--- /dev/null
+++ b/docs/_build/html/_sources/distributedsearching.txt
@@ -0,0 +1,77 @@
+.. _distributedsearching:
+
+Distributed Searching
+=====================
+
+.. note::
+
+   Your server must be able to make outgoing HTTP requests for this functionality.
+
+pycsw has the ability to perform distributed searching against other CSW servers.  Distributed searching is disabled by default; to enable, ``server.federatedcatalogues`` must be set.  A CSW client must issue a GetRecords request with ``csw:DistributedSearch`` specified, along with an optional ``hopCount`` attribute (see subclause 10.8.4.13 of the CSW specification).  When enabled, pycsw will search all specified catalogues and return a unified set of search results to the client.  Due t [...]
+
+Scenario: Federated Search
+--------------------------
+
+pycsw deployment with 3 configurations (CSW-1, CSW-2, CSW-3), subsequently providing three (3) endpoints.  Each endpoint is based on an opaque metadata repository (based on theme/place/discipline, etc.).  Goal is to perform a single search against all endpoints.
+ 
+pycsw realizes this functionality by supporting :ref:`alternate configurations <alternate-configurations>`, and exposes the additional CSW endpoint(s) with the following design pattern:
+ 
+CSW-1: ``http://localhost/pycsw/csw.py?config=CSW-1.cfg``
+ 
+CSW-2: ``http://localhost/pycsw/csw.py?config=CSW-2.cfg``
+ 
+CSW-3: ``http://localhost/pycsw/csw.py?config=CSW-3.cfg``
+ 
+...where the ``*.cfg`` configuration files are configured for each respective metadata repository.  The above CSW endpoints can be interacted with as usual.
+ 
+To federate the discovery of the three (3) portals into a unified search, pycsw realizes this functionality by deploying an additional configuration which acts as the superset of CSW-1, CSW-2, CSW-3:
+
+CSW-all: ``http://localhost/pycsw/csw.py?config=CSW-all.cfg``
+
+This allows the client to invoke one (1) CSW GetRecords request, in which the CSW endpoint spawns the same GetRecords request to 1..n distributed CSW endpoints.  Distributed CSW endpoints are advertised in CSW Capabilities XML via ``ows:Constraint``:
+
+.. code-block:: xml
+
+  <ows:OperationsMetadata>
+  ... 
+      <ows:Constraint name="FederatedCatalogues">
+          <ows:Value>http://localhost/pycsw/csw.py?config=CSW-1.cfg</ows:Value>
+          <ows:Value>http://localhost/pycsw/csw.py?config=CSW-2.cfg</ows:Value>
+          <ows:Value>http://localhost/pycsw/csw.py?config=CSW-3.cfg</ows:Value>
+      </ows:Constraint>
+  ...
+  </ows:OperationsMetadata>
+
+...which advertises which CSW endpoint(s) the CSW server will spawn if a distributed search is requested by the client.
+ 
+in the CSW-all configuration:
+
+.. code-block:: none 
+
+  [server]
+  ...
+  federatedcatalogues=http://localhost/pycsw/csw.py?config=CSW-1.cfg,http://localhost/pycsw/csw.py?config=CSW-2.cfg,http://localhost/pycsw/csw.py?config=CSW-3.cfg
+ 
+At which point a CSW client request to CSW-all with ``distributedsearch=TRUE``, while specifying an optional ``hopCount``.  Query network topology:
+
+.. code-block:: none 
+
+          AnyClient
+              ^
+              |
+              v
+           CSW-all
+              ^ 
+              |
+              v
+       /-------------\
+       ^      ^      ^
+       |      |      |
+       v      v      v
+     CSW-1  CSW-2  CSW-3
+ 
+As a result, a pycsw deployment in this scenario may be approached on a per 'theme' basis, or at an aggregate level.
+ 
+All interaction in this scenario is local to the pycsw installation, so network performance would not be problematic.
+ 
+A very important facet of distributed search is as per Annex B of OGC:CSW 2.0.2.  Given that all the CSW endpoints are managed locally, duplicates and infinite looping are not deemed to present an issue.
diff --git a/docs/_build/html/_sources/geonode.txt b/docs/_build/html/_sources/geonode.txt
new file mode 100644
index 0000000..55c6645
--- /dev/null
+++ b/docs/_build/html/_sources/geonode.txt
@@ -0,0 +1,15 @@
+.. _geonode:
+
+GeoNode Configuration
+======================
+
+GeoNode (http://geonode.org/) is a platform for the management and publication of geospatial data. It brings together mature and stable open-source software projects under a consistent and easy-to-use interface allowing users, with little training, to quickly and easily share data and create interactive maps. GeoNode provides a cost-effective and scalable tool for developing information management systems.  GeoNode uses CSW as a cataloguing mechanism to query and present geospatial metadata.
+
+pycsw supports binding to an existing GeoNode repository for metadata query.  The binding is read-only (transactions are not in scope, as GeoNode manages repository metadata changes in the application proper).
+
+GeoNode Setup
+-------------
+
+pycsw is enabled and configured by default in GeoNode, so there are no additional steps required once GeoNode is setup.  See the ``CATALOGUE`` and ``PYCSW`` `settings.py entries`_ at http://docs.geonode.org/en/latest/developers/reference/django-apps.html#id1 for customizing pycsw within GeoNode.
+
+.. _`settings.py entries`: http://docs.geonode.org/en/latest/developers/reference/django-apps.html#id1
diff --git a/docs/_build/html/_sources/index.txt b/docs/_build/html/_sources/index.txt
new file mode 100644
index 0000000..0ec3ea0
--- /dev/null
+++ b/docs/_build/html/_sources/index.txt
@@ -0,0 +1,36 @@
+.. _index:
+
+=============================
+pycsw |release| Documentation
+=============================
+
+:Author: Tom Kralidis
+:Contact: tomkralidis at gmail.com
+:Release: |release|
+:Date: |today|
+
+.. toctree::
+   :maxdepth: 2
+
+   introduction
+   installation
+   configuration
+   administration
+   distributedsearching
+   sru
+   opensearch
+   soap
+   sitemaps
+   transactions
+   repofilters
+   profiles
+   outputschemas
+   geonode
+   odc
+   ckan
+   testing
+   tools
+   support
+   contributing
+   license
+   committers
diff --git a/docs/_build/html/_sources/installation.txt b/docs/_build/html/_sources/installation.txt
new file mode 100644
index 0000000..acec200
--- /dev/null
+++ b/docs/_build/html/_sources/installation.txt
@@ -0,0 +1,197 @@
+.. _installation:
+
+Installation
+============
+
+System Requirements
+-------------------
+
+pycsw is written in `Python <http://python.org>`_, and works with (tested) version 2.6 and 2.7
+
+pycsw requires the following Python supporting libraries:
+
+- `lxml`_ for XML support
+- `SQLAlchemy`_ for database bindings
+- `pyproj`_ for coordinate transformations
+- `Shapely`_ for spatial query / geometry support
+- `OWSLib`_ for CSW client and metadata parser
+
+.. note::
+
+  You can install these dependencies via `easy_install`_ or `pip`_
+
+.. note::
+
+  For :ref:`GeoNode <geonode>` or :ref:`Open Data Catalog <odc>` deployments, SQLAlchemy is not required
+
+Installing from Source
+----------------------
+
+`Download </download.html>`_ the latest stable version or fetch from Git.
+
+For Developers and the Truly Impatient
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The 4 minute install:
+
+.. code-block:: bash
+
+  $ virtualenv pycsw && cd pycsw && . bin/activate
+  $ git clone https://github.com/geopython/pycsw.git && cd pycsw
+  $ pip install -e . && pip install -r requirements-standalone.txt
+  $ cp default-sample.cfg default.cfg
+  $ vi default.cfg
+  # adjust paths in
+  # - server.home
+  # - repository.database
+  # set server.url to http://localhost:8000/
+  $ python csw.wsgi
+  $ curl http://localhost:8000/?service=CSW&version=2.0.2&request=GetCapabilities
+
+
+The Quick and Dirty Way
+^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code-block:: bash
+
+  $ git clone git://github.com/geopython/pycsw.git
+
+Ensure that CGI is enabled for the install directory.  For example, on Apache, if pycsw is installed in ``/srv/www/htdocs/pycsw`` (where the URL will be ``http://host/pycsw/csw.py``), add the following to ``httpd.conf``:
+
+.. code-block:: none
+
+  <Location /pycsw/>
+   Options FollowSymLinks +ExecCGI
+   Allow from all
+   AddHandler cgi-script .py
+  </Location>
+
+.. note::
+  If pycsw is installed in ``cgi-bin``, this should work as expected.  In this case, the :ref:`tests <tests>` application must be moved to a different location to serve static HTML documents.
+
+Make shure, you have all the dependences from ``requirements.txt and requirements-standalone.txt``
+
+The Clean and Proper Way
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code-block:: bash
+
+  $ git clone git://github.com/geopython/pycsw.git
+  $ python setup.py build
+  $ python setup.py install
+
+At this point, pycsw is installed as a library and requires a CGI ``csw.py`` or WSGI ``csw.wsgi`` script to be served into your web server environment (see below for WSGI configuration/deployment).
+
+.. _pypi:
+
+Installing from the Python Package Index (PyPi)
+-----------------------------------------------
+
+.. code-block:: bash
+
+  # easy_install or pip will do the trick
+  $ easy_install pycsw
+  # or
+  $ pip install pycsw
+
+.. _opensuse:
+
+Installing from OpenSUSE Build Service
+--------------------------------------
+
+In order to install the OBS package in openSUSE 12.3, one can run the following commands as user ``root``:
+
+.. code-block:: bash
+
+  # zypper -ar http://download.opensuse.org/repositories/Application:/Geo/openSUSE_12.3/ GEO
+  # zypper -ar http://download.opensuse.org/repositories/devel:/languages:/python/openSUSE_12.3/ python
+  # zypper refresh
+  # zypper install python-pycsw pycsw-cgi
+
+For earlier openSUSE versions change ``12.3`` with ``12.2``. For future openSUSE version use ``Factory``.
+
+An alternative method is to use the `One-Click Installer <http://software.opensuse.org/search?q=pycsw&baseproject=openSUSE%3A12.3&lang=en&include_home=true&exclude_debug=true>`_.
+
+.. _ubuntu:
+
+Installing on Ubuntu/Xubuntu/Kubuntu
+------------------------------------
+
+In order to install pycsw to an Ubuntu based distribution, one can run the following commands:
+
+.. code-block:: bash
+
+  # sudo add-apt-repository ppa:pycsw/stable
+  # sudo apt-get update
+  # sudo apt-get install python-pycsw pycsw-cgi
+
+An alternative method is to use the OSGeoLive installation script located in ``pycsw/etc/dist/osgeolive``:
+
+.. code-block:: bash
+
+  # cd pycsw/etc/dist
+  # sudo ./install_pycsw.sh
+
+The script installs the dependencies (Apache, lxml, sqlalchemy, shapely, pyproj) and then pycsw to ``/var/www``. 
+  
+Running on Windows
+------------------
+
+For Windows installs, change the first line of ``csw.py`` to:
+
+.. code-block:: python
+
+  #!/Python27/python -u
+
+.. note::
+  The use of ``-u`` is required to properly output gzip-compressed responses.
+
+Security
+--------
+
+By default, ``default.cfg`` is at the root of the pycsw install.  If pycsw is setup outside an HTTP server's ``cgi-bin`` area, this file could be read.  The following options protect the configuration:
+
+- move ``default.cfg`` to a non HTTP accessible area, and modify ``csw.py`` to point to the updated location
+- configure web server to deny access to the configuration.  For example, in Apache, add the following to ``httpd.conf``:
+
+.. code-block:: none
+
+  <Files ~ "\.(cfg)$">
+   order allow,deny
+   deny from all
+  </Files>
+
+
+Running on WSGI
+---------------
+
+pycsw supports the `Web Server Gateway Interface`_ (WSGI).  To run pycsw in WSGI mode, use ``csw.wsgi`` in your WSGI server environment.  Below is an example of configuring with Apache:
+
+.. code-block:: none
+
+  WSGIDaemonProcess host1 home=/var/www/pycsw processes=2
+  WSGIProcessGroup host1
+  WSGIScriptAlias /pycsw-wsgi /var/www/pycsw/csw.wsgi
+  <Directory /var/www/pycsw>
+    Order deny,allow
+    Allow from all
+  </Directory>
+
+or use the `WSGI reference implementation`_:
+
+.. code-block:: bash
+
+  $ python ./csw.wsgi
+  Serving on port 8000...
+
+which will publish pycsw to ``http://localhost:8000/``
+
+.. _`lxml`: http://lxml.de/
+.. _`SQLAlchemy`: http://www.sqlalchemy.org/
+.. _`Shapely`: http://toblerity.github.io/shapely/
+.. _`pyproj`: http://code.google.com/p/pyproj/
+.. _`OWSLib`: https://github.com/geopython/OWSLib
+.. _`easy_install`: http://packages.python.org/distribute/easy_install.html
+.. _`pip`: http://www.pip-installer.org
+.. _`Web Server Gateway Interface`: http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface
+.. _`WSGI reference implementation`: http://docs.python.org/library/wsgiref.html
diff --git a/docs/_build/html/_sources/introduction.txt b/docs/_build/html/_sources/introduction.txt
new file mode 100644
index 0000000..df07d52
--- /dev/null
+++ b/docs/_build/html/_sources/introduction.txt
@@ -0,0 +1,190 @@
+.. _introduction:
+
+Introduction
+============
+
+pycsw is an OGC CSW server implementation written in Python.
+
+Features
+========
+
+- certified OGC `Compliant`_ and OGC Reference Implementation
+- harvesting support for WMS, WFS, WCS, WPS, WAF, CSW, SOS
+- implements `INSPIRE Discovery Services 3.0`_
+- implements `ISO Metadata Application Profile 1.0.0`_
+- implements `FGDC CSDGM Application Profile for CSW 2.0`_
+- implements the Search/Retrieval via URL (`SRU`_) search protocol
+- implements Full Text Search capabilities
+- implements OpenSearch
+- supports ISO, Dublin Core, DIF, FGDC and Atom metadata models
+- CGI or WSGI deployment
+- simple configuration
+- transactional capabilities (CSW-T)
+- flexible repository configuration
+- `GeoNode`_ connectivity
+- `Open Data Catalog`_ connectivity
+- `CKAN`_ connectivity
+- federated catalogue distributed searching
+- realtime XML Schema validation
+- extensible profile plugin architecture
+
+Standards Support
+-----------------
+
++-------------------+------------+
+| Standard          | Version(s) |
++===================+============+
+| `OGC CSW`_        | 2.0.2      |
++-------------------+------------+
+| `OGC Filter`_     | 1.1.0      |
++-------------------+------------+
+| `OGC OWS Common`_ | 1.0.0      |
++-------------------+------------+
+| `OGC GML`_        | 3.1.1      |
++-------------------+------------+
+| `OGC SFSQL`_      | 1.2.1      |
++-------------------+------------+
+| `Dublin Core`_    | 1.1        |
++-------------------+------------+
+| `SOAP`_           | 1.2        |
++-------------------+------------+
+| `ISO 19115`_      | 2003       |
++-------------------+------------+
+| `ISO 19139`_      | 2007       |
++-------------------+------------+
+| `ISO 19119`_      | 2005       |
++-------------------+------------+
+| `NASA DIF`_       | 9.7        | 
++-------------------+------------+
+| `FGDC CSDGM`_     | 1998       | 
++-------------------+------------+
+| `SRU`_            | 1.1        | 
++-------------------+------------+
+| `A9 OpenSearch`_  | 1.1        | 
++-------------------+------------+
+
+Supported Operations
+--------------------
+
+.. csv-table::
+  :header: Request,Optionality,Supported,HTTP method binding(s)
+
+  GetCapabilities,mandatory,yes,GET (KVP) / POST (XML) / SOAP
+  DescribeRecord,mandatory,yes,GET (KVP) / POST (XML) / SOAP
+  GetRecords,mandatory,yes,GET (KVP) / POST (XML) / SOAP
+  GetRecordById,optional,yes,GET (KVP) / POST (XML) / SOAP
+  GetRepositoryItem,optional,yes,GET (KVP)
+  GetDomain,optional,yes,GET (KVP) / POST (XML) / SOAP
+  Harvest,optional,yes,GET (KVP) / POST (XML) / SOAP
+  Transaction,optional,yes,POST (XML) / SOAP
+
+.. note::
+
+  Asynchronous processing supported for GetRecords and Harvest requests (via ``csw:ResponseHandler``)
+
+.. note::
+
+  Supported Harvest Resource Types are listed in :ref:`transactions`
+
+Supported Output Formats
+------------------------
+
+- XML (default)
+- JSON
+
+Supported Output Schemas
+------------------------
+
+- Dublin Core
+- ISO 19139
+- FGDC CSDGM
+- NASA DIF
+- Atom
+
+Supported Sorting Functionality
+-------------------------------
+
+- ogc:SortBy
+- ascending or descending
+- aspatial (queryable properties)
+- spatial (geometric area)
+
+Supported Filters
+-----------------
+
+Full Text
+^^^^^^^^^
+
+- csw:AnyText
+
+Geometry Operands
+^^^^^^^^^^^^^^^^^
+
+- gml:Point
+- gml:LineString
+- gml:Polygon
+- gml:Envelope
+
+.. note::
+
+  Coordinate transformations are supported
+
+Spatial Operators
+^^^^^^^^^^^^^^^^^
+
+- BBOX
+- Beyond
+- Contains
+- Crosses
+- Disjoint
+- DWithin
+- Equals
+- Intersects
+- Overlaps
+- Touches
+- Within
+
+Logical Operators
+^^^^^^^^^^^^^^^^^
+
+- Between
+- EqualTo
+- LessThanEqualTo
+- GreaterThan
+- Like
+- LessThan
+- GreaterThanEqualTo
+- NotEqualTo
+- NullCheck
+
+Functions
+^^^^^^^^^
+- length
+- lower
+- ltrim
+- rtrim
+- trim
+- upper
+
+.. _`OGC CSW`: http://www.opengeospatial.org/standards/cat
+.. _`ISO Metadata Application Profile 1.0.0`: http://portal.opengeospatial.org/files/?artifact_id=21460
+.. _`OGC Filter`: http://www.opengeospatial.org/standards/filter
+.. _`OGC OWS Common`: http://www.opengeospatial.org/standards/common
+.. _`OGC GML`: http://www.opengeospatial.org/standards/gml
+.. _`OGC SFSQL`: http://www.opengeospatial.org/standards/sfs
+.. _`Dublin Core`: http://www.dublincore.org/
+.. _`OGC CITE CSW`: http://cite.opengeospatial.org/test_engine/csw/2.0.2
+.. _`SOAP`: http://www.w3.org/TR/soap/
+.. _`INSPIRE Discovery Services 3.0`: http://inspire.jrc.ec.europa.eu/documents/Network_Services/TechnicalGuidance_DiscoveryServices_v3.0.pdf
+.. _`ISO 19115`: http://www.iso.org/iso/catalogue_detail.htm?csnumber=26020
+.. _`ISO 19139`: http://www.iso.org/iso/catalogue_detail.htm?csnumber=32557
+.. _`ISO 19119`: http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=39890
+.. _`NASA DIF`: http://gcmd.gsfc.nasa.gov/add/difguide/index.html
+.. _`FGDC CSDGM`: http://www.fgdc.gov/metadata/csdgm
+.. _`FGDC CSDGM Application Profile for CSW 2.0`: http://portal.opengeospatial.org/files/?artifact_id=16936
+.. _`SRU`: http://www.loc.gov/standards/sru/
+.. _`A9 OpenSearch`: http://www.opensearch.org/Home
+.. _`GeoNode`: http://geonode.org/
+.. _`Open Data Catalog`: https://github.com/azavea/Open-Data-Catalog/
+.. _`CKAN`: http://ckan.org/
+.. _`Compliant`: http://www.opengeospatial.org/resource/products/details/?pid=1104
diff --git a/docs/_build/html/_sources/license.txt b/docs/_build/html/_sources/license.txt
new file mode 100644
index 0000000..eeb2337
--- /dev/null
+++ b/docs/_build/html/_sources/license.txt
@@ -0,0 +1,6 @@
+.. _license:
+
+License
+=======
+
+.. include:: ../LICENSE.txt
diff --git a/docs/_build/html/_sources/odc.txt b/docs/_build/html/_sources/odc.txt
new file mode 100644
index 0000000..73757aa
--- /dev/null
+++ b/docs/_build/html/_sources/odc.txt
@@ -0,0 +1,15 @@
+.. _odc:
+
+Open Data Catalog Configuration
+===============================
+
+Open Data Catalog (https://github.com/azavea/Open-Data-Catalog/) is an open data catalog based on Django, Python and PostgreSQL. It was originally developed for OpenDataPhilly.org, a portal that provides access to open data sets, applications, and APIs related to the Philadelphia region. The Open Data Catalog is a generalized version of the original source code with a simple skin. It is intended to display information and links to publicly available data in an easily searchable format. T [...]
+
+pycsw supports binding to an existing Open Data Catalog repository for metadata query.  The binding is read-only (transactions are not in scope, as Open Data Catalog manages repository metadata changes in the application proper).
+
+Open Data Catalog Setup
+-----------------------
+
+Open Data Catalog provides CSW functionality using pycsw out of the box (installing ODC will also install pycsw).  Settings are defined in https://github.com/azavea/Open-Data-Catalog/blob/master/OpenDataCatalog/settings.py#L165.
+
+At this point, pycsw is able to read from the Open Data Catalog repository using the Django ORM.
diff --git a/docs/_build/html/_sources/opensearch.txt b/docs/_build/html/_sources/opensearch.txt
new file mode 100644
index 0000000..ac334ca
--- /dev/null
+++ b/docs/_build/html/_sources/opensearch.txt
@@ -0,0 +1,27 @@
+.. _opensearch:
+
+OpenSearch Support
+==================
+
+pycsw supports the `A9 OpenSearch`_ 1.1 implementation in support of aggregated searching.
+
+Description Document
+--------------------
+
+To generate an OpenSearch Description Document:
+
+.. code-block:: bash
+
+  $ cd /path/to/pycsw
+  $ export PYTHONPATH=`pwd` 
+  $ python-admin.py -c gen_opensearch_description -f default.cfg -o /path/to/opensearch.xml
+
+This will create the document which can then be `autodiscovered <http://www.opensearch.org/Specifications/OpenSearch/1.1#Autodiscovery>`_.
+
+OpenSearch support is enabled by default.  HTTP requests must be specified with ``mode=opensearch`` in the base URL for OpenSearch requests, e.g.:
+
+.. code-block:: bash
+
+  http://localhost/pycsw/csw.py?mode=opensearch&service=CSW&verison=2.0.2&request=GetRecords&elementsetname=brief&typenames=csw:Record&resulttype=results
+
+.. _`A9 OpenSearch`: http://www.opensearch.org/Home
diff --git a/docs/_build/html/_sources/outputschemas.txt b/docs/_build/html/_sources/outputschemas.txt
new file mode 100644
index 0000000..f364547
--- /dev/null
+++ b/docs/_build/html/_sources/outputschemas.txt
@@ -0,0 +1,42 @@
+.. _outputschemas:
+
+Output Schema Plugins
+=====================
+
+Overview
+--------
+
+pycsw allows for extending the implementation of output schemas to the core standard.  outputschemas allow for a client to request metadata in a specific format (ISO, Dublin Core, FGDC, NASA DIF and Atom are default).
+
+All outputschemas must be placed in the ``pycsw/plugins/outputschemas`` directory.
+
+Requirements
+------------
+
+.. code-block:: none
+
+   pycsw/
+     plugins/
+     __init__.py # empty
+     outputschemas/
+       __init__.py # __all__ is a list of all provided outputschemas
+       atom.py # default
+       dif.py # default
+       fgdc.py # default
+
+Implementing a new outputschema
+-------------------------------
+
+Create a file in ``pycsw/plugins/outputschemas``, which defines the following:
+
+- ``NAMESPACE``: the default namespace of the outputschema which will be advertised
+- ``NAMESPACE``: dict of all applicable namespaces to outputschema
+- ``XPATH_MAPPINGS``: dict of pycsw core queryables mapped to the equivalent XPath of the outputschema
+- ``write_record``: function which returns a record as an ``lxml.etree.Element`` object
+
+Add the name of the file to ``__init__.py:__all__``.  The new outputschema is now supported in pycsw.
+
+Testing
+-------
+
+New outputschemas must add examples to the :ref:`tests` interface, which must provide example requests specific to the profile.
diff --git a/docs/_build/html/_sources/profiles.txt b/docs/_build/html/_sources/profiles.txt
new file mode 100644
index 0000000..8993969
--- /dev/null
+++ b/docs/_build/html/_sources/profiles.txt
@@ -0,0 +1,69 @@
+.. _profiles:
+
+Profile Plugins
+===============
+
+Overview
+--------
+
+pycsw allows for the implementation of profiles to the core standard. Profiles allow specification of additional metadata format types (i.e. ISO 19139:2007, NASA DIF, INSPIRE, etc.) to the repository, which can be queried and presented to the client.  pycsw supports a plugin architecture which allows for runtime loading of Python code.
+
+All profiles must be placed in the ``pycsw/plugins/profiles`` directory.
+
+Requirements
+------------
+
+.. code-block:: none
+
+   pycsw/
+     plugins/
+     __init__.py # empty
+     profiles/ # directory to store profiles
+       __init__.py # empty
+       profile.py # defines abstract profile object (properties and methods) and functions to load plugins
+       apiso/ # profile directory
+         __init__.py # empty
+         apiso.py # profile code
+         ... # supporting files, etc.
+
+Abstract Base Class Definition
+------------------------------
+
+All profile code must be instantiated as a subclass of ``profile.Profile``.  Below is an example to add a ``Foo`` profile:
+
+.. code-block:: python
+
+   from pycsw.plugins.profiles import profile
+
+   class FooProfile(profile.Profile):
+       profile.Profile.__init__(self,
+           name='foo',
+           version='1.0.3',
+           title='My Foo Profile',
+           url='http://example.org/fooprofile/docs',
+           namespace='http://example.org/foons',
+           typename='foo:RootElement',
+           outputschema=http://example.org/foons',
+           prefixes=['foo'],
+           model=model,
+           core_namespaces=namespaces,
+           added_namespaces={'foo': 'http://example.org/foons'}
+           repository=REPOSITORY['foo:RootElement'])
+
+Your profile plugin class (``FooProfile``) must implement all methods as per ``profile.Profile``.  Profile methods must always return ``lxml.etree.Element`` types, or ``None``.
+
+Enabling Profiles
+-----------------
+
+All profiles are disabled by default.  To specify profiles at runtime, set the ``server.profiles`` value in the :ref:`configuration` to the name of the package (in the ``pycsw/plugins/profiles`` directory).  To enable multiple profiles, specify as a comma separated value (see :ref:`configuration`).
+
+Testing
+-------
+
+Profiles must add examples to the :ref:`tests` interface, which must provide example requests specific to the profile.
+
+Supported Profiles
+==================
+
+.. include:: ../pycsw/plugins/profiles/apiso/docs/apiso.rst
+.. include:: ../pycsw/plugins/profiles/ebrim/docs/ebrim.rst
diff --git a/docs/_build/html/_sources/repofilters.txt b/docs/_build/html/_sources/repofilters.txt
new file mode 100644
index 0000000..27851f9
--- /dev/null
+++ b/docs/_build/html/_sources/repofilters.txt
@@ -0,0 +1,74 @@
+.. _repofilters:
+
+Repository Filters
+==================
+
+pycsw has the ability to perform server side repository / database filters as a means to mask all CSW requests to query against a specific subset of the metadata repository, thus providing the ability to deploy multiple pycsw instances pointing to the same database in different ways via the ``repository.filter`` configuration option.
+
+Repository filters are a convenient way to subset your repository at the server level without the hassle of creating proper database views.  For large repositories, it may be better to subset at the database level for performance.
+
+Scenario: One Database, Many Views
+----------------------------------
+
+Imagine a sample database table of records (subset below for brevity):
+
+.. csv-table::
+  :header: identifier,parentidentifier,title,abstract
+
+  1,33,foo1,bar1
+  2,33,foo2,bar2
+  3,55,foo3,bar3
+  4,55,foo1,bar1
+  5,21,foo5,bar5
+  5,21,foo6,bar6
+
+A default pycsw instance (with no ``repository.filters`` option) will always process CSW requests against the entire table.  So a CSW `GetRecords` filter like:
+
+.. code-block:: xml
+
+  <ogc:Filter>
+      <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>apiso:Title</ogc:PropertyName>
+          <ogc:Literal>foo1</ogc:Literal>
+      </ogc:PropertyIsEqualTo>
+  </ogc:Filter>
+
+...will return:
+
+.. csv-table::
+  :header: identifier,parentidentifier,title,abstract
+
+  1,33,foo1,bar1
+  4,55,foo1,bar1
+
+Suppose you wanted to deploy another pycsw instance which serves metadata from the same database, but only from a specific subset.  Here we set the ``repository.filter`` option:
+
+.. code-block:: text
+
+  [repository]
+  database=sqlite:///records.db
+  filter=pycsw:ParentIdentifier = '33'
+
+The same CSW `GetRecords` filter as per above then yields the following results:
+
+.. csv-table::
+  :header: identifier,parentidentifier,title,abstract
+
+  1,33,foo1,bar1
+
+Another example:
+
+.. code-block:: text
+
+  [repository]
+  database=sqlite:///records.db
+  filter=pycsw:ParentIdentifier != '33'
+
+The same CSW `GetRecords` filter as per above then yields the following results:
+
+.. csv-table::
+  :header: identifier,parentidentifier,title,abstract
+
+  4,55,foo1,bar1
+
+The ``repository.filter`` option accepts all core queryables set in the pycsw core model (see ``pycsw.config.StaticContext.md_core_model`` for the complete list).
diff --git a/docs/_build/html/_sources/sitemaps.txt b/docs/_build/html/_sources/sitemaps.txt
new file mode 100644
index 0000000..3bd1bf5
--- /dev/null
+++ b/docs/_build/html/_sources/sitemaps.txt
@@ -0,0 +1,14 @@
+.. _sitemaps:
+
+XML Sitemaps
+============
+
+`XML Sitemaps`_ can be generated by running:
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c gen_sitemap -f default.cfg -o sitemap.xml
+
+The ``sitemap.xml`` file should be saved to an an area on your web server (parallel to or above your pycsw install location) to enable web crawlers to index your repository. 
+
+.. _`XML Sitemaps`: http://www.sitemaps.org/
diff --git a/docs/_build/html/_sources/soap.txt b/docs/_build/html/_sources/soap.txt
new file mode 100644
index 0000000..b007c0b
--- /dev/null
+++ b/docs/_build/html/_sources/soap.txt
@@ -0,0 +1,7 @@
+.. _soap:
+
+SOAP
+====
+
+pycsw supports handling of SOAP encoded requests and responses as per subclause 10.3.2 of OGC:CSW 2.0.2.  SOAP request examples can be found in ``tests/index.html``.
+
diff --git a/docs/_build/html/_sources/sru.txt b/docs/_build/html/_sources/sru.txt
new file mode 100644
index 0000000..909fc85
--- /dev/null
+++ b/docs/_build/html/_sources/sru.txt
@@ -0,0 +1,16 @@
+.. _sru:
+
+Search/Retrieval via URL (SRU) Support
+======================================
+
+pycsw supports the `Search/Retrieval via URL`_ search protocol implementation as per subclause 8.4 of the OpenGIS Catalogue Service Implementation Specification.
+
+SRU support is enabled by default.  HTTP GET requests must be specified with ``mode=sru`` for SRU requests, e.g.:
+
+.. code-block:: bash
+
+  http://localhost/pycsw/csw.py?mode=sru&operation=searchRetrieve&query=foo
+
+See http://www.loc.gov/standards/sru/simple.html for example SRU requests.
+
+.. _`Search/Retrieval via URL`: http://www.loc.gov/standards/sru/
diff --git a/docs/_build/html/_sources/support.txt b/docs/_build/html/_sources/support.txt
new file mode 100644
index 0000000..e7093c3
--- /dev/null
+++ b/docs/_build/html/_sources/support.txt
@@ -0,0 +1,9 @@
+.. _support:
+
+Support
+=======
+
+Community
+---------
+
+Please see the `Community </community.html>`_ page for information on the pycsw community, getting support, and how to get involved.
diff --git a/docs/_build/html/_sources/testing.txt b/docs/_build/html/_sources/testing.txt
new file mode 100644
index 0000000..c5c90d3
--- /dev/null
+++ b/docs/_build/html/_sources/testing.txt
@@ -0,0 +1,97 @@
+.. _testing:
+
+Testing
+=======
+
+.. _ogc-cite:
+
+OGC CITE
+--------
+
+Compliance benchmarking is done via the OGC `Compliance & Interoperability Testing & Evaluation Initiative`_.  The pycsw `wiki <https://github.com/geopython/pycsw/wiki/OGC-CITE-Compliance>`_ documents testing procedures and status.
+
+.. _tests:
+
+Tester
+------
+
+The pycsw tests framework (in ``tests``) is a collection of testsuites to perform automated regession testing of the codebase.  Test are run against all pushes to the GitHub repository via `Travis CI`_.
+
+Running Locally
+^^^^^^^^^^^^^^^
+
+The tests framework can be run from ``tests`` using `Paver`_ (see ``pavement.py``) tasks for convenience:
+
+.. code-block:: bash
+
+  $ cd /path/to/pycsw
+  # run all tests (starts up http://localhost:8000)
+  $ paver test
+  # run tests only against specific testsuites 
+  $ paver test -s apiso,fgdc
+  # run all tests, including harvesting (this is turned off by default given the volatility of remote services/data testing)
+  $ paver test -r
+
+The tests perform HTTP GET and POST requests against ``http://localhost:8000``.  The expected output for each test can be found in ``expected``.  Results are categorized as ``passed``, ``failed``, or ``initialized``.  A summary of results is output at the end of the run.
+
+Failed Tests
+^^^^^^^^^^^^
+
+If a given test has failed, the output is saved in ``results``.  The resulting failure can be analyzed by running ``diff tests/expected/name_of_test.xml tests/results/name_of_test.xml`` to find variances.  The Paver task returns a status code which indicates the number of tests which have failed (i.e. ``echo $?``).
+
+Test Suites
+^^^^^^^^^^^
+
+The tests framework is run against a series of 'suites' (in ``tests/suites``), each of which specifies a given configuration to test various functionality of the codebase.  Each suite is structured as follows:
+
+* ``tests/suites/suite/default.cfg``: the configuration for the suite
+* ``tests/suites/suite/post``: directory of XML documents for HTTP POST requests
+* ``tests/suites/suite/get/requests.txt``: directory and text file of KVP for HTTP GET requests
+* ``tests/suites/suite/data``: directory of sample XML data required for the test suite.  Database and test data are setup/loaded automatically as part of testing
+
+When the tests are invoked, the following operations are run:
+
+* pycsw configuration is set to ``tests/suites/suite/default.cfg``
+* HTTP POST requests are run against ``tests/suites/suite/post/*.xml``
+* HTTP GET requests are run against each request in ``tests/suites/suite/get/requests.txt``
+
+The CSV format of ``tests/suites/suite/get/requests.txt`` is ``testname,request``, with one line for each test.  The ``testname`` value is a unique test name (this value sets the name of the output file in the test results).  The ``request`` value is the HTTP GET request.  The ``PYCSW_SERVER`` token is replaced at runtime with the URL to the pycsw install.
+
+Adding New Tests
+^^^^^^^^^^^^^^^^
+
+To add tests to an existing suite:
+
+* for HTTP POST tests, add XML documents to ``tests/suites/suite/post``
+* for HTTP GET tests, add tests (one per line) to ``tests/suites/suite/get/requests.txt``
+* run ``paver test``
+
+To add a new test suite:
+
+* create a new directory under ``tests/suites`` (e.g. ``foo``)
+* create a new configuration in ``tests/suites/foo/default.cfg``
+
+  * Ensure that all file paths are relative to ``path/to/pycsw``
+  * Ensure that ``repository.database`` points to an SQLite3 database called ``tests/suites/foo/data/records.db``.  The database *must* be called ``records.db`` and the directory ``tests/suites/foo/data`` *must* exist
+
+* populate HTTP POST requests in ``tests/suites/foo/post``
+* populate HTTP GET requests in ``tests/suites/foo/get/requests.txt``
+* if the testsuite requires test data, create ``tests/suites/foo/data`` are store XML file there
+* run ``paver test`` (or ``paver test -s foo`` to test only the new test suite)
+
+The new test suite database will be created automatically and used as part of tests.
+
+Web Testing
+^^^^^^^^^^^
+
+You can also use the pycsw tests via your web browser to perform sample requests against your pycsw install.  The tests are is located in ``tests/``.  To generate the HTML page:
+
+.. code-block:: bash
+
+  $ paver gen_tests_html
+
+Then navigate to ``http://host/path/to/pycsw/tests/index.html``.
+
+.. _`Compliance & Interoperability Testing & Evaluation Initiative`: http://cite.opengeospatial.org/
+.. _`Travis CI`: http://travis-ci.org/geopython/pycsw
+.. _`Paver`: http://paver.github.io/paver/
diff --git a/docs/_build/html/_sources/tools.txt b/docs/_build/html/_sources/tools.txt
new file mode 100644
index 0000000..fe8e79f
--- /dev/null
+++ b/docs/_build/html/_sources/tools.txt
@@ -0,0 +1,26 @@
+.. _tools:
+
+Cataloguing and Metadata Tools
+==============================
+
+CSW Clients
+-----------
+
+- `Geoportal CSW Clients <http://sourceforge.net/apps/mediawiki/geoportal/index.php?title=Geoportal_CSW_Clients>`_
+- `OWSLib <http://geopython.github.io/OWSLib>`_
+- `qgcsw <http://geopython.github.io/qgcsw>`_ (`QGIS <http://qgis.org/>`_ plugin)
+
+CSW Servers
+-----------
+
+- `deegree <http://deegree.org/>`_
+- `eXcat <http://gdsc.nlr.nl/gdsc/en/tools/excat>`_
+- `GeoNetwork opensource <http://geonetwork-opensource.org/>`_
+
+Metadata Editing Tools
+----------------------
+
+- `CatMDEdit <http://catmdedit.sourceforge.net/>`_
+- `EUOSME <https://joinup.ec.europa.eu/software/euosme/description>`_
+- `GIMED <http://sourceforge.net/projects/gimed/>`_
+- `Metatools <http://hub.qgis.org/projects/metatools>`_ (`QGIS <http://qgis.org/>`_ plugin)
diff --git a/docs/_build/html/_sources/transactions.txt b/docs/_build/html/_sources/transactions.txt
new file mode 100644
index 0000000..ebc1bf0
--- /dev/null
+++ b/docs/_build/html/_sources/transactions.txt
@@ -0,0 +1,77 @@
+.. _transactions:
+
+Transactions
+============
+
+pycsw has the ability to process CSW Harvest and Transaction requests (CSW-T).  Transactions are disabled by default; to enable, ``manager.transactions`` must be set to ``true``.  Access to transactional functionality is limited to IP addresses which must be set in ``manager.allowed_ips``.
+
+Supported Resource Types
+------------------------
+
+For transactions and harvesting, pycsw supports the following metadata resource types by default:
+
+.. csv-table::
+  :header: Resource Type,Namespace,Transaction,Harvest
+
+  Dublin Core,``http://www.opengis.net/cat/csw/2.0.2``,yes,yes
+  FGDC,``http://www.opengis.net/cat/csw/csdgm``,yes,yes
+  ISO 19139,``http://www.isotc211.org/2005/gmd``,yes,yes
+  ISO GMI,``http://www.isotc211.org/2005/gmi``,yes,yes
+  OGC:CSW 2.0.2,``http://www.opengis.net/cat/csw/2.0.2``,,yes
+  OGC:WMS 1.1.1,``http://www.opengis.net/wms``,,yes
+  OGC:WFS 1.1.0,``http://www.opengis.net/wfs``,,yes
+  OGC:WCS 1.0.0,``http://www.opengis.net/wcs``,,yes
+  OGC:WPS 1.0.0,``http://www.opengis.net/wps/1.0.0``,,yes
+  OGC:SOS 1.0.0,``http://www.opengis.net/sos/1.0``,,yes
+  OGC:SOS 2.0.0,``http://www.opengis.net/sos/2.0``,,yes
+  `WAF`_,``urn:geoss:urn``,,yes
+
+Additional metadata models are supported by enabling the appropriate :ref:`profiles`.
+
+.. note::
+
+   For transactions to be functional when using SQLite3, the SQLite3 database file (**and its parent directory**) must be fully writable.  For example:
+
+.. code-block:: bash
+
+  $ mkdir /path/data
+  $ chmod 777 /path/data
+  $ chmod 666 test.db
+  $ mv test.db /path/data
+
+For CSW-T deployments, it is strongly advised that this directory reside in an area that is not accessible by HTTP.
+
+Harvesting
+----------
+
+.. note::
+
+   Your server must be able to make outgoing HTTP requests for this functionality.
+
+pycsw supports the CSW-T ``Harvest`` operation.  Records which are harvested require to setup a cronjob to periodically refresh records in the local repository.  A sample cronjob is available in ``etc/harvest-all.cron`` which points to ``pycsw-admin.py`` (you must specify the correct path to your configuration).  Harvest operation results can be sent by email (via ``mailto:``) or ftp (via ``ftp://``) if the Harvest request specifies ``csw:ResponseHandler``.
+
+.. note::
+
+  For ``csw:ResponseHandler`` values using the ``mailto:`` protocol, you must have ``server.smtp_host`` set in your :ref:`configuration <configuration>`.
+
+OGC Web Services
+^^^^^^^^^^^^^^^^
+
+When harvesting OGC web services, requests can provide the base URL of the service as part of the Harvest request.  pycsw will construct a ``GetCapabilities`` request dynamically.
+
+When harvesting other CSW servers, pycsw pages through the entire CSW in default increments of 10.  This value can be modified via the ``manager.csw_harvest_pagesize`` :ref:`configuration <configuration>` option.  It is strongly advised to use the ``csw:ResponseHandler`` parameter for harvesting large CSW catalogues to prevent HTTP timeouts.
+
+Transactions
+------------
+
+pycsw supports 3 modes of the ``Transaction`` operation (``Insert``, ``Update``, ``Delete``):
+
+- **Insert**: full XML documents can be inserted as per CSW-T
+- **Update**: updates can be made as full record updates or record properties against a ``csw:Constraint``
+- **Delete**: deletes can be made against a ``csw:Constraint``
+
+Transaction operation results can be sent by email (via ``mailto:``) or ftp (via ``ftp://``) if the Transaction request specifies ``csw:ResponseHandler``.
+
+The :ref:`tests` contain CSW-T request examples.
+
+.. _`WAF`: http://seabass.ieee.org/groups/geoss/index.php?option=com_sir_200&Itemid=157&ID=183
diff --git a/docs/_build/html/_static/ajax-loader.gif b/docs/_build/html/_static/ajax-loader.gif
new file mode 100644
index 0000000..61faf8c
Binary files /dev/null and b/docs/_build/html/_static/ajax-loader.gif differ
diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css
new file mode 100644
index 0000000..967e36c
--- /dev/null
+++ b/docs/_build/html/_static/basic.css
@@ -0,0 +1,537 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+    clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+    width: 170px;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+    width: 30px;
+}
+
+img {
+    border: 0;
+    max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+    width: 100%;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+div.modindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+img.align-left, .figure.align-left, object.align-left {
+    clear: left;
+    float: left;
+    margin-right: 1em;
+}
+
+img.align-right, .figure.align-right, object.align-right {
+    clear: right;
+    float: right;
+    margin-left: 1em;
+}
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+    text-align: left;
+}
+
+.align-center {
+    text-align: center;
+}
+
+.align-right {
+    text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 5px;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+table.citation {
+    border-left: solid 1px gray;
+    margin-left: 1px;
+}
+
+table.citation td {
+    border-bottom: none;
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+    list-style: decimal;
+}
+
+ol.loweralpha {
+    list-style: lower-alpha;
+}
+
+ol.upperalpha {
+    list-style: upper-alpha;
+}
+
+ol.lowerroman {
+    list-style: lower-roman;
+}
+
+ol.upperroman {
+    list-style: upper-roman;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dt:target, .highlighted {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa;
+}
+
+.line-block {
+    display: block;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.line-block .line-block {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+    font-family: sans-serif;
+}
+
+.accelerator {
+    text-decoration: underline;
+}
+
+.classifier {
+    font-style: oblique;
+}
+
+abbr, acronym {
+    border-bottom: dotted 1px;
+    cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+    overflow: auto;
+    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.viewcode-link {
+    float: right;
+}
+
+.viewcode-back {
+    float: right;
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    margin: -1px -10px;
+    padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+    vertical-align: middle;
+}
+
+div.body div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+ at media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0 !important;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}
\ No newline at end of file
diff --git a/docs/_build/html/_static/comment-bright.png b/docs/_build/html/_static/comment-bright.png
new file mode 100644
index 0000000..551517b
Binary files /dev/null and b/docs/_build/html/_static/comment-bright.png differ
diff --git a/docs/_build/html/_static/comment-close.png b/docs/_build/html/_static/comment-close.png
new file mode 100644
index 0000000..09b54be
Binary files /dev/null and b/docs/_build/html/_static/comment-close.png differ
diff --git a/docs/_build/html/_static/comment.png b/docs/_build/html/_static/comment.png
new file mode 100644
index 0000000..92feb52
Binary files /dev/null and b/docs/_build/html/_static/comment.png differ
diff --git a/docs/_build/html/_static/default.css b/docs/_build/html/_static/default.css
new file mode 100644
index 0000000..6f8f769
--- /dev/null
+++ b/docs/_build/html/_static/default.css
@@ -0,0 +1,256 @@
+/*
+ * default.css_t
+ * ~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- default theme.
+ *
+ * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+ at import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #356aa0;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+div.document {
+    background-color: #356aa0;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.body {
+    background-color: #ffffff;
+    color: #000000;
+    padding: 0 20px 30px 20px;
+}
+
+div.footer {
+    color: #ffffff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #ffffff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    line-height: 30px;
+    color: #ffffff;
+}
+
+div.related a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar {
+}
+
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: #ffffff;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    color: #ffffff;
+}
+
+div.sphinxsidebar a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #ffffff;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+
+
+/* -- hyperlink styles ------------------------------------------------------ */
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:visited {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+
+
+/* -- body styles ----------------------------------------------------------- */
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.admonition p {
+    margin-bottom: 5px;
+}
+
+div.admonition pre {
+    margin-bottom: 5px;
+}
+
+div.admonition ul, div.admonition ol {
+    margin-bottom: 5px;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.topic {
+    background-color: #eee;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+p.admonition-title {
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+pre {
+    padding: 5px;
+    background-color: #eeffcc;
+    color: #333333;
+    line-height: 120%;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
+
+th {
+    background-color: #ede;
+}
+
+.warning tt {
+    background: #efc2c2;
+}
+
+.note tt {
+    background: #d6d6d6;
+}
+
+.viewcode-back {
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    background-color: #f4debf;
+    border-top: 1px solid #ac9;
+    border-bottom: 1px solid #ac9;
+}
\ No newline at end of file
diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js
new file mode 100644
index 0000000..c5455c9
--- /dev/null
+++ b/docs/_build/html/_static/doctools.js
@@ -0,0 +1,238 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for all documentation.
+ *
+ * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/**
+ * select a different prefix for underscore
+ */
+$u = _.noConflict();
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
+    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
+    "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {};
+}
+ */
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+};
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s == 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+};
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node) {
+    if (node.nodeType == 3) {
+      var val = node.nodeValue;
+      var pos = val.toLowerCase().indexOf(text);
+      if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
+        var span = document.createElement("span");
+        span.className = className;
+        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling));
+        node.nodeValue = val.substr(0, pos);
+      }
+    }
+    else if (!jQuery(node).is("button, select, textarea")) {
+      jQuery.each(node.childNodes, function() {
+        highlight(this);
+      });
+    }
+  }
+  return this.each(function() {
+    highlight(this);
+  });
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+  init : function() {
+    this.fixFirefoxAnchorBug();
+    this.highlightSearchWords();
+    this.initIndexTable();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS : {},
+  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+  LOCALE : 'unknown',
+
+  // gettext and ngettext don't access this so that the functions
+  // can safely bound to a different name (_ = Documentation.gettext)
+  gettext : function(string) {
+    var translated = Documentation.TRANSLATIONS[string];
+    if (typeof translated == 'undefined')
+      return string;
+    return (typeof translated == 'string') ? translated : translated[0];
+  },
+
+  ngettext : function(singular, plural, n) {
+    var translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated == 'undefined')
+      return (n == 1) ? singular : plural;
+    return translated[Documentation.PLURALEXPR(n)];
+  },
+
+  addTranslations : function(catalog) {
+    for (var key in catalog.messages)
+      this.TRANSLATIONS[key] = catalog.messages[key];
+    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+    this.LOCALE = catalog.locale;
+  },
+
+  /**
+   * add context elements like header anchor links
+   */
+  addContextElements : function() {
+    $('div[id] > :header:first').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this headline')).
+      appendTo(this);
+    });
+    $('dt[id]').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this definition')).
+      appendTo(this);
+    });
+  },
+
+  /**
+   * workaround a firefox stupidity
+   */
+  fixFirefoxAnchorBug : function() {
+    if (document.location.hash && $.browser.mozilla)
+      window.setTimeout(function() {
+        document.location.href += '';
+      }, 10);
+  },
+
+  /**
+   * highlight the search words provided in the url in the text
+   */
+  highlightSearchWords : function() {
+    var params = $.getQueryParameters();
+    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+    if (terms.length) {
+      var body = $('div.body');
+      if (!body.length) {
+        body = $('body');
+      }
+      window.setTimeout(function() {
+        $.each(terms, function() {
+          body.highlightText(this.toLowerCase(), 'highlighted');
+        });
+      }, 10);
+      $('<p class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
+          .appendTo($('#searchbox'));
+    }
+  },
+
+  /**
+   * init the domain index toggle buttons
+   */
+  initIndexTable : function() {
+    var togglers = $('img.toggler').click(function() {
+      var src = $(this).attr('src');
+      var idnum = $(this).attr('id').substr(7);
+      $('tr.cg-' + idnum).toggle();
+      if (src.substr(-9) == 'minus.png')
+        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+      else
+        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+    }).css('display', '');
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
+        togglers.click();
+    }
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords : function() {
+    $('#searchbox .highlight-link').fadeOut(300);
+    $('span.highlighted').removeClass('highlighted');
+  },
+
+  /**
+   * make the url absolute
+   */
+  makeURL : function(relativeURL) {
+    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+  },
+
+  /**
+   * get the current relative url
+   */
+  getCurrentURL : function() {
+    var path = document.location.pathname;
+    var parts = path.split(/\//);
+    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+      if (this == '..')
+        parts.pop();
+    });
+    var url = parts.join('/');
+    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+  }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+  Documentation.init();
+});
diff --git a/docs/_build/html/_static/down-pressed.png b/docs/_build/html/_static/down-pressed.png
new file mode 100644
index 0000000..6f7ad78
Binary files /dev/null and b/docs/_build/html/_static/down-pressed.png differ
diff --git a/docs/_build/html/_static/down.png b/docs/_build/html/_static/down.png
new file mode 100644
index 0000000..3003a88
Binary files /dev/null and b/docs/_build/html/_static/down.png differ
diff --git a/docs/_build/html/_static/favicon.ico b/docs/_build/html/_static/favicon.ico
new file mode 100644
index 0000000..fec0b7f
Binary files /dev/null and b/docs/_build/html/_static/favicon.ico differ
diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png
new file mode 100644
index 0000000..d18082e
Binary files /dev/null and b/docs/_build/html/_static/file.png differ
diff --git a/docs/_build/html/_static/jquery.js b/docs/_build/html/_static/jquery.js
new file mode 100644
index 0000000..83589da
--- /dev/null
+++ b/docs/_build/html/_static/jquery.js
@@ -0,0 +1,2 @@
+/*! jQuery v1.8.3 jquery.com | jquery.org/license */
+(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){retur [...]
\ No newline at end of file
diff --git a/docs/_build/html/_static/minus.png b/docs/_build/html/_static/minus.png
new file mode 100644
index 0000000..da1c562
Binary files /dev/null and b/docs/_build/html/_static/minus.png differ
diff --git a/docs/_build/html/_static/plus.png b/docs/_build/html/_static/plus.png
new file mode 100644
index 0000000..b3cb374
Binary files /dev/null and b/docs/_build/html/_static/plus.png differ
diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css
new file mode 100644
index 0000000..d79caa1
--- /dev/null
+++ b/docs/_build/html/_static/pygments.css
@@ -0,0 +1,62 @@
+.highlight .hll { background-color: #ffffcc }
+.highlight  { background: #eeffcc; }
+.highlight .c { color: #408090; font-style: italic } /* Comment */
+.highlight .err { border: 1px solid #FF0000 } /* Error */
+.highlight .k { color: #007020; font-weight: bold } /* Keyword */
+.highlight .o { color: #666666 } /* Operator */
+.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #007020 } /* Comment.Preproc */
+.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
+.highlight .gd { color: #A00000 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #FF0000 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00A000 } /* Generic.Inserted */
+.highlight .go { color: #333333 } /* Generic.Output */
+.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #0044DD } /* Generic.Traceback */
+.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #007020 } /* Keyword.Pseudo */
+.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #902000 } /* Keyword.Type */
+.highlight .m { color: #208050 } /* Literal.Number */
+.highlight .s { color: #4070a0 } /* Literal.String */
+.highlight .na { color: #4070a0 } /* Name.Attribute */
+.highlight .nb { color: #007020 } /* Name.Builtin */
+.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.highlight .no { color: #60add5 } /* Name.Constant */
+.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.highlight .ne { color: #007020 } /* Name.Exception */
+.highlight .nf { color: #06287e } /* Name.Function */
+.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
+.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #bb60d5 } /* Name.Variable */
+.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mf { color: #208050 } /* Literal.Number.Float */
+.highlight .mh { color: #208050 } /* Literal.Number.Hex */
+.highlight .mi { color: #208050 } /* Literal.Number.Integer */
+.highlight .mo { color: #208050 } /* Literal.Number.Oct */
+.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
+.highlight .sc { color: #4070a0 } /* Literal.String.Char */
+.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
+.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
+.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.highlight .sx { color: #c65d09 } /* Literal.String.Other */
+.highlight .sr { color: #235388 } /* Literal.String.Regex */
+.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
+.highlight .ss { color: #517918 } /* Literal.String.Symbol */
+.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
+.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
+.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
+.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js
new file mode 100644
index 0000000..6e1f06b
--- /dev/null
+++ b/docs/_build/html/_static/searchtools.js
@@ -0,0 +1,622 @@
+/*
+ * searchtools.js_t
+ * ~~~~~~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilties for the full-text search.
+ *
+ * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
+
+
+/**
+ * Simple result scoring code.
+ */
+var Scorer = {
+  // Implement the following function to further tweak the score for each result
+  // The function takes a result array [filename, title, anchor, descr, score]
+  // and returns the new score.
+  /*
+  score: function(result) {
+    return result[4];
+  },
+  */
+
+  // query matches the full name of an object
+  objNameMatch: 11,
+  // or matches in the last dotted part of the object name
+  objPartialMatch: 6,
+  // Additive scores depending on the priority of the object
+  objPrio: {0:  15,   // used to be importantResults
+            1:  5,   // used to be objectResults
+            2: -5},  // used to be unimportantResults
+  //  Used when the priority is not in the mapping.
+  objPrioDefault: 0,
+
+  // query found in title
+  title: 15,
+  // query found in terms
+  term: 5
+};
+
+
+/**
+ * Search Module
+ */
+var Search = {
+
+  _index : null,
+  _queued_query : null,
+  _pulse_status : -1,
+
+  init : function() {
+      var params = $.getQueryParameters();
+      if (params.q) {
+          var query = params.q[0];
+          $('input[name="q"]')[0].value = query;
+          this.performSearch(query);
+      }
+  },
+
+  loadIndex : function(url) {
+    $.ajax({type: "GET", url: url, data: null,
+            dataType: "script", cache: true,
+            complete: function(jqxhr, textstatus) {
+              if (textstatus != "success") {
+                document.getElementById("searchindexloader").src = url;
+              }
+            }});
+  },
+
+  setIndex : function(index) {
+    var q;
+    this._index = index;
+    if ((q = this._queued_query) !== null) {
+      this._queued_query = null;
+      Search.query(q);
+    }
+  },
+
+  hasIndex : function() {
+      return this._index !== null;
+  },
+
+  deferQuery : function(query) {
+      this._queued_query = query;
+  },
+
+  stopPulse : function() {
+      this._pulse_status = 0;
+  },
+
+  startPulse : function() {
+    if (this._pulse_status >= 0)
+        return;
+    function pulse() {
+      var i;
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      var dotString = '';
+      for (i = 0; i < Search._pulse_status; i++)
+        dotString += '.';
+      Search.dots.text(dotString);
+      if (Search._pulse_status > -1)
+        window.setTimeout(pulse, 500);
+    }
+    pulse();
+  },
+
+  /**
+   * perform a search for something (or wait until index is loaded)
+   */
+  performSearch : function(query) {
+    // create the required interface elements
+    this.out = $('#search-results');
+    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
+    this.dots = $('<span></span>').appendTo(this.title);
+    this.status = $('<p style="display: none"></p>').appendTo(this.out);
+    this.output = $('<ul class="search"/>').appendTo(this.out);
+
+    $('#search-progress').text(_('Preparing search...'));
+    this.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (this.hasIndex())
+      this.query(query);
+    else
+      this.deferQuery(query);
+  },
+
+  /**
+   * execute search (requires search index to be loaded)
+   */
+  query : function(query) {
+    var i;
+    var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
+
+    // stem the searchterms and add them to the correct list
+    var stemmer = new Stemmer();
+    var searchterms = [];
+    var excluded = [];
+    var hlterms = [];
+    var tmp = query.split(/\s+/);
+    var objectterms = [];
+    for (i = 0; i < tmp.length; i++) {
+      if (tmp[i] !== "") {
+          objectterms.push(tmp[i].toLowerCase());
+      }
+
+      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
+          tmp[i] === "") {
+        // skip this "word"
+        continue;
+      }
+      // stem the word
+      var word = stemmer.stemWord(tmp[i].toLowerCase());
+      var toAppend;
+      // select the correct list
+      if (word[0] == '-') {
+        toAppend = excluded;
+        word = word.substr(1);
+      }
+      else {
+        toAppend = searchterms;
+        hlterms.push(tmp[i].toLowerCase());
+      }
+      // only add if not already in the list
+      if (!$u.contains(toAppend, word))
+        toAppend.push(word);
+    }
+    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
+
+    // console.debug('SEARCH: searching for:');
+    // console.info('required: ', searchterms);
+    // console.info('excluded: ', excluded);
+
+    // prepare search
+    var terms = this._index.terms;
+    var titleterms = this._index.titleterms;
+
+    // array of [filename, title, anchor, descr, score]
+    var results = [];
+    $('#search-progress').empty();
+
+    // lookup as object
+    for (i = 0; i < objectterms.length; i++) {
+      var others = [].concat(objectterms.slice(0, i),
+                             objectterms.slice(i+1, objectterms.length));
+      results = results.concat(this.performObjectSearch(objectterms[i], others));
+    }
+
+    // lookup as search terms in fulltext
+    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, Scorer.term))
+                     .concat(this.performTermsSearch(searchterms, excluded, titleterms, Scorer.title));
+
+    // let the scorer override scores with a custom scoring function
+    if (Scorer.score) {
+      for (i = 0; i < results.length; i++)
+        results[i][4] = Scorer.score(results[i]);
+    }
+
+    // now sort the results by score (in opposite order of appearance, since the
+    // display function below uses pop() to retrieve items) and then
+    // alphabetically
+    results.sort(function(a, b) {
+      var left = a[4];
+      var right = b[4];
+      if (left > right) {
+        return 1;
+      } else if (left < right) {
+        return -1;
+      } else {
+        // same score: sort alphabetically
+        left = a[1].toLowerCase();
+        right = b[1].toLowerCase();
+        return (left > right) ? -1 : ((left < right) ? 1 : 0);
+      }
+    });
+
+    // for debugging
+    //Search.lastresults = results.slice();  // a copy
+    //console.info('search results:', Search.lastresults);
+
+    // print the results
+    var resultCount = results.length;
+    function displayNextItem() {
+      // results left, load the summary and display it
+      if (results.length) {
+        var item = results.pop();
+        var listItem = $('<li style="display:none"></li>');
+        if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
+          // dirhtml builder
+          var dirname = item[0] + '/';
+          if (dirname.match(/\/index\/$/)) {
+            dirname = dirname.substring(0, dirname.length-6);
+          } else if (dirname == 'index/') {
+            dirname = '';
+          }
+          listItem.append($('<a/>').attr('href',
+            DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
+            highlightstring + item[2]).html(item[1]));
+        } else {
+          // normal html builders
+          listItem.append($('<a/>').attr('href',
+            item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
+            highlightstring + item[2]).html(item[1]));
+        }
+        if (item[3]) {
+          listItem.append($('<span> (' + item[3] + ')</span>'));
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+          $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[0] + '.txt',
+                  dataType: "text",
+                  complete: function(jqxhr, textstatus) {
+                    var data = jqxhr.responseText;
+                    if (data !== '') {
+                      listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
+                    }
+                    Search.output.append(listItem);
+                    listItem.slideDown(5, function() {
+                      displayNextItem();
+                    });
+                  }});
+        } else {
+          // no source available, just display title
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        }
+      }
+      // search finished, update title and status message
+      else {
+        Search.stopPulse();
+        Search.title.text(_('Search Results'));
+        if (!resultCount)
+          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
+        else
+            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
+        Search.status.fadeIn(500);
+      }
+    }
+    displayNextItem();
+  },
+
+  /**
+   * search for object names
+   */
+  performObjectSearch : function(object, otherterms) {
+    var filenames = this._index.filenames;
+    var objects = this._index.objects;
+    var objnames = this._index.objnames;
+    var titles = this._index.titles;
+
+    var i;
+    var results = [];
+
+    for (var prefix in objects) {
+      for (var name in objects[prefix]) {
+        var fullname = (prefix ? prefix + '.' : '') + name;
+        if (fullname.toLowerCase().indexOf(object) > -1) {
+          var score = 0;
+          var parts = fullname.split('.');
+          // check for different match types: exact matches of full name or
+          // "last name" (i.e. last dotted part)
+          if (fullname == object || parts[parts.length - 1] == object) {
+            score += Scorer.objNameMatch;
+          // matches in last name
+          } else if (parts[parts.length - 1].indexOf(object) > -1) {
+            score += Scorer.objPartialMatch;
+          }
+          var match = objects[prefix][name];
+          var objname = objnames[match[1]][2];
+          var title = titles[match[0]];
+          // If more than one term searched for, we require other words to be
+          // found in the name/title/description
+          if (otherterms.length > 0) {
+            var haystack = (prefix + ' ' + name + ' ' +
+                            objname + ' ' + title).toLowerCase();
+            var allfound = true;
+            for (i = 0; i < otherterms.length; i++) {
+              if (haystack.indexOf(otherterms[i]) == -1) {
+                allfound = false;
+                break;
+              }
+            }
+            if (!allfound) {
+              continue;
+            }
+          }
+          var descr = objname + _(', in ') + title;
+
+          var anchor = match[3];
+          if (anchor === '')
+            anchor = fullname;
+          else if (anchor == '-')
+            anchor = objnames[match[1]][1] + '-' + fullname;
+          // add custom score for some objects according to scorer
+          if (Scorer.objPrio.hasOwnProperty(match[2])) {
+            score += Scorer.objPrio[match[2]];
+          } else {
+            score += Scorer.objPrioDefault;
+          }
+          results.push([filenames[match[0]], fullname, '#'+anchor, descr, score]);
+        }
+      }
+    }
+
+    return results;
+  },
+
+  /**
+   * search for full-text terms in the index
+   */
+  performTermsSearch : function(searchterms, excluded, terms, score) {
+    var filenames = this._index.filenames;
+    var titles = this._index.titles;
+
+    var i, j, file, files;
+    var fileMap = {};
+    var results = [];
+
+    // perform the search on the required terms
+    for (i = 0; i < searchterms.length; i++) {
+      var word = searchterms[i];
+      // no match but word was a required one
+      if ((files = terms[word]) === undefined)
+        break;
+      if (files.length === undefined) {
+        files = [files];
+      }
+      // create the mapping
+      for (j = 0; j < files.length; j++) {
+        file = files[j];
+        if (file in fileMap)
+          fileMap[file].push(word);
+        else
+          fileMap[file] = [word];
+      }
+    }
+
+    // now check if the files don't contain excluded terms
+    for (file in fileMap) {
+      var valid = true;
+
+      // check if all requirements are matched
+      if (fileMap[file].length != searchterms.length)
+          continue;
+
+      // ensure that none of the excluded terms is in the search result
+      for (i = 0; i < excluded.length; i++) {
+        if (terms[excluded[i]] == file ||
+          $u.contains(terms[excluded[i]] || [], file)) {
+          valid = false;
+          break;
+        }
+      }
+
+      // if we have still a valid result we can add it to the result list
+      if (valid) {
+        results.push([filenames[file], titles[file], '', null, score]);
+      }
+    }
+    return results;
+  },
+
+  /**
+   * helper function to return a node containing the
+   * search summary for a given text. keywords is a list
+   * of stemmed words, hlwords is the list of normal, unstemmed
+   * words. the first one is used to find the occurance, the
+   * latter for highlighting it.
+   */
+  makeSearchSummary : function(text, keywords, hlwords) {
+    var textLower = text.toLowerCase();
+    var start = 0;
+    $.each(keywords, function() {
+      var i = textLower.indexOf(this.toLowerCase());
+      if (i > -1)
+        start = i;
+    });
+    start = Math.max(start - 120, 0);
+    var excerpt = ((start > 0) ? '...' : '') +
+      $.trim(text.substr(start, 240)) +
+      ((start + 240 - text.length) ? '...' : '');
+    var rv = $('<div class="context"></div>').text(excerpt);
+    $.each(hlwords, function() {
+      rv = rv.highlightText(this, 'highlighted');
+    });
+    return rv;
+  }
+};
+
+$(document).ready(function() {
+  Search.init();
+});
\ No newline at end of file
diff --git a/docs/_build/html/_static/sidebar.js b/docs/_build/html/_static/sidebar.js
new file mode 100644
index 0000000..4f09a0d
--- /dev/null
+++ b/docs/_build/html/_static/sidebar.js
@@ -0,0 +1,159 @@
+/*
+ * sidebar.js
+ * ~~~~~~~~~~
+ *
+ * This script makes the Sphinx sidebar collapsible.
+ *
+ * .sphinxsidebar contains .sphinxsidebarwrapper.  This script adds
+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
+ * used to collapse and expand the sidebar.
+ *
+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
+ * and the width of the sidebar and the margin-left of the document
+ * are decreased. When the sidebar is expanded the opposite happens.
+ * This script saves a per-browser/per-session cookie used to
+ * remember the position of the sidebar among the pages.
+ * Once the browser is closed the cookie is deleted and the position
+ * reset to the default (expanded).
+ *
+ * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+$(function() {
+  
+  
+  
+  
+  
+  
+  
+
+  // global elements used by the functions.
+  // the 'sidebarbutton' element is defined as global after its
+  // creation, in the add_sidebar_button function
+  var bodywrapper = $('.bodywrapper');
+  var sidebar = $('.sphinxsidebar');
+  var sidebarwrapper = $('.sphinxsidebarwrapper');
+
+  // for some reason, the document has no sidebar; do not run into errors
+  if (!sidebar.length) return;
+
+  // original margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar expanded
+  var bw_margin_expanded = bodywrapper.css('margin-left');
+  var ssb_width_expanded = sidebar.width();
+
+  // margin-left of the bodywrapper and width of the sidebar
+  // with the sidebar collapsed
+  var bw_margin_collapsed = '.8em';
+  var ssb_width_collapsed = '.8em';
+
+  // colors used by the current theme
+  var dark_color = $('.related').css('background-color');
+  var light_color = $('.document').css('background-color');
+
+  function sidebar_is_collapsed() {
+    return sidebarwrapper.is(':not(:visible)');
+  }
+
+  function toggle_sidebar() {
+    if (sidebar_is_collapsed())
+      expand_sidebar();
+    else
+      collapse_sidebar();
+  }
+
+  function collapse_sidebar() {
+    sidebarwrapper.hide();
+    sidebar.css('width', ssb_width_collapsed);
+    bodywrapper.css('margin-left', bw_margin_collapsed);
+    sidebarbutton.css({
+        'margin-left': '0',
+        'height': bodywrapper.height()
+    });
+    sidebarbutton.find('span').text('»');
+    sidebarbutton.attr('title', _('Expand sidebar'));
+    document.cookie = 'sidebar=collapsed';
+  }
+
+  function expand_sidebar() {
+    bodywrapper.css('margin-left', bw_margin_expanded);
+    sidebar.css('width', ssb_width_expanded);
+    sidebarwrapper.show();
+    sidebarbutton.css({
+        'margin-left': ssb_width_expanded-12,
+        'height': bodywrapper.height()
+    });
+    sidebarbutton.find('span').text('«');
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    document.cookie = 'sidebar=expanded';
+  }
+
+  function add_sidebar_button() {
+    sidebarwrapper.css({
+        'float': 'left',
+        'margin-right': '0',
+        'width': ssb_width_expanded - 28
+    });
+    // create the button
+    sidebar.append(
+        '<div id="sidebarbutton"><span>«</span></div>'
+    );
+    var sidebarbutton = $('#sidebarbutton');
+    light_color = sidebarbutton.css('background-color');
+    // find the height of the viewport to center the '<<' in the page
+    var viewport_height;
+    if (window.innerHeight)
+ 	  viewport_height = window.innerHeight;
+    else
+	  viewport_height = $(window).height();
+    sidebarbutton.find('span').css({
+        'display': 'block',
+        'margin-top': (viewport_height - sidebar.position().top - 20) / 2
+    });
+
+    sidebarbutton.click(toggle_sidebar);
+    sidebarbutton.attr('title', _('Collapse sidebar'));
+    sidebarbutton.css({
+        'color': '#FFFFFF',
+        'border-left': '1px solid ' + dark_color,
+        'font-size': '1.2em',
+        'cursor': 'pointer',
+        'height': bodywrapper.height(),
+        'padding-top': '1px',
+        'margin-left': ssb_width_expanded - 12
+    });
+
+    sidebarbutton.hover(
+      function () {
+          $(this).css('background-color', dark_color);
+      },
+      function () {
+          $(this).css('background-color', light_color);
+      }
+    );
+  }
+
+  function set_position_from_cookie() {
+    if (!document.cookie)
+      return;
+    var items = document.cookie.split(';');
+    for(var k=0; k<items.length; k++) {
+      var key_val = items[k].split('=');
+      var key = key_val[0].replace(/ /, "");  // strip leading spaces
+      if (key == 'sidebar') {
+        var value = key_val[1];
+        if ((value == 'collapsed') && (!sidebar_is_collapsed()))
+          collapse_sidebar();
+        else if ((value == 'expanded') && (sidebar_is_collapsed()))
+          expand_sidebar();
+      }
+    }
+  }
+
+  add_sidebar_button();
+  var sidebarbutton = $('#sidebarbutton');
+  set_position_from_cookie();
+});
\ No newline at end of file
diff --git a/docs/_build/html/_static/underscore.js b/docs/_build/html/_static/underscore.js
new file mode 100644
index 0000000..5b55f32
--- /dev/null
+++ b/docs/_build/html/_static/underscore.js
@@ -0,0 +1,31 @@
+// Underscore.js 1.3.1
+// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the MIT license.
+// Portions of Underscore are inspired or borrowed from Prototype,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore
+(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object [...]
+c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h i [...]
+h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var [...]
+b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.l [...]
+null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.f [...]
+function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g, [...]
+e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d) [...]
+function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a [...]
+return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedInd [...]
+c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length- [...]
+b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];retur [...]
+return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=func [...]
+d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d; [...]
+var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.mem [...]
+c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c)) [...]
+a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)] [...]
+b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function( [...]
+1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){ret [...]
+b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a) [...]
+b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin [...]
+function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return [...]
+u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=func [...]
+function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.ch [...]
+true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
diff --git a/docs/_build/html/_static/up-pressed.png b/docs/_build/html/_static/up-pressed.png
new file mode 100644
index 0000000..8bd587a
Binary files /dev/null and b/docs/_build/html/_static/up-pressed.png differ
diff --git a/docs/_build/html/_static/up.png b/docs/_build/html/_static/up.png
new file mode 100644
index 0000000..b946256
Binary files /dev/null and b/docs/_build/html/_static/up.png differ
diff --git a/docs/_build/html/_static/websupport.js b/docs/_build/html/_static/websupport.js
new file mode 100644
index 0000000..71c0a13
--- /dev/null
+++ b/docs/_build/html/_static/websupport.js
@@ -0,0 +1,808 @@
+/*
+ * websupport.js
+ * ~~~~~~~~~~~~~
+ *
+ * sphinx.websupport utilties for all documentation.
+ *
+ * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+(function($) {
+  $.fn.autogrow = function() {
+    return this.each(function() {
+    var textarea = this;
+
+    $.fn.autogrow.resize(textarea);
+
+    $(textarea)
+      .focus(function() {
+        textarea.interval = setInterval(function() {
+          $.fn.autogrow.resize(textarea);
+        }, 500);
+      })
+      .blur(function() {
+        clearInterval(textarea.interval);
+      });
+    });
+  };
+
+  $.fn.autogrow.resize = function(textarea) {
+    var lineHeight = parseInt($(textarea).css('line-height'), 10);
+    var lines = textarea.value.split('\n');
+    var columns = textarea.cols;
+    var lineCount = 0;
+    $.each(lines, function() {
+      lineCount += Math.ceil(this.length / columns) || 1;
+    });
+    var height = lineHeight * (lineCount + 1);
+    $(textarea).css('height', height);
+  };
+})(jQuery);
+
+(function($) {
+  var comp, by;
+
+  function init() {
+    initEvents();
+    initComparator();
+  }
+
+  function initEvents() {
+    $('a.comment-close').live("click", function(event) {
+      event.preventDefault();
+      hide($(this).attr('id').substring(2));
+    });
+    $('a.vote').live("click", function(event) {
+      event.preventDefault();
+      handleVote($(this));
+    });
+    $('a.reply').live("click", function(event) {
+      event.preventDefault();
+      openReply($(this).attr('id').substring(2));
+    });
+    $('a.close-reply').live("click", function(event) {
+      event.preventDefault();
+      closeReply($(this).attr('id').substring(2));
+    });
+    $('a.sort-option').live("click", function(event) {
+      event.preventDefault();
+      handleReSort($(this));
+    });
+    $('a.show-proposal').live("click", function(event) {
+      event.preventDefault();
+      showProposal($(this).attr('id').substring(2));
+    });
+    $('a.hide-proposal').live("click", function(event) {
+      event.preventDefault();
+      hideProposal($(this).attr('id').substring(2));
+    });
+    $('a.show-propose-change').live("click", function(event) {
+      event.preventDefault();
+      showProposeChange($(this).attr('id').substring(2));
+    });
+    $('a.hide-propose-change').live("click", function(event) {
+      event.preventDefault();
+      hideProposeChange($(this).attr('id').substring(2));
+    });
+    $('a.accept-comment').live("click", function(event) {
+      event.preventDefault();
+      acceptComment($(this).attr('id').substring(2));
+    });
+    $('a.delete-comment').live("click", function(event) {
+      event.preventDefault();
+      deleteComment($(this).attr('id').substring(2));
+    });
+    $('a.comment-markup').live("click", function(event) {
+      event.preventDefault();
+      toggleCommentMarkupBox($(this).attr('id').substring(2));
+    });
+  }
+
+  /**
+   * Set comp, which is a comparator function used for sorting and
+   * inserting comments into the list.
+   */
+  function setComparator() {
+    // If the first three letters are "asc", sort in ascending order
+    // and remove the prefix.
+    if (by.substring(0,3) == 'asc') {
+      var i = by.substring(3);
+      comp = function(a, b) { return a[i] - b[i]; };
+    } else {
+      // Otherwise sort in descending order.
+      comp = function(a, b) { return b[by] - a[by]; };
+    }
+
+    // Reset link styles and format the selected sort option.
+    $('a.sel').attr('href', '#').removeClass('sel');
+    $('a.by' + by).removeAttr('href').addClass('sel');
+  }
+
+  /**
+   * Create a comp function. If the user has preferences stored in
+   * the sortBy cookie, use those, otherwise use the default.
+   */
+  function initComparator() {
+    by = 'rating'; // Default to sort by rating.
+    // If the sortBy cookie is set, use that instead.
+    if (document.cookie.length > 0) {
+      var start = document.cookie.indexOf('sortBy=');
+      if (start != -1) {
+        start = start + 7;
+        var end = document.cookie.indexOf(";", start);
+        if (end == -1) {
+          end = document.cookie.length;
+          by = unescape(document.cookie.substring(start, end));
+        }
+      }
+    }
+    setComparator();
+  }
+
+  /**
+   * Show a comment div.
+   */
+  function show(id) {
+    $('#ao' + id).hide();
+    $('#ah' + id).show();
+    var context = $.extend({id: id}, opts);
+    var popup = $(renderTemplate(popupTemplate, context)).hide();
+    popup.find('textarea[name="proposal"]').hide();
+    popup.find('a.by' + by).addClass('sel');
+    var form = popup.find('#cf' + id);
+    form.submit(function(event) {
+      event.preventDefault();
+      addComment(form);
+    });
+    $('#s' + id).after(popup);
+    popup.slideDown('fast', function() {
+      getComments(id);
+    });
+  }
+
+  /**
+   * Hide a comment div.
+   */
+  function hide(id) {
+    $('#ah' + id).hide();
+    $('#ao' + id).show();
+    var div = $('#sc' + id);
+    div.slideUp('fast', function() {
+      div.remove();
+    });
+  }
+
+  /**
+   * Perform an ajax request to get comments for a node
+   * and insert the comments into the comments tree.
+   */
+  function getComments(id) {
+    $.ajax({
+     type: 'GET',
+     url: opts.getCommentsURL,
+     data: {node: id},
+     success: function(data, textStatus, request) {
+       var ul = $('#cl' + id);
+       var speed = 100;
+       $('#cf' + id)
+         .find('textarea[name="proposal"]')
+         .data('source', data.source);
+
+       if (data.comments.length === 0) {
+         ul.html('<li>No comments yet.</li>');
+         ul.data('empty', true);
+       } else {
+         // If there are comments, sort them and put them in the list.
+         var comments = sortComments(data.comments);
+         speed = data.comments.length * 100;
+         appendComments(comments, ul);
+         ul.data('empty', false);
+       }
+       $('#cn' + id).slideUp(speed + 200);
+       ul.slideDown(speed);
+     },
+     error: function(request, textStatus, error) {
+       showError('Oops, there was a problem retrieving the comments.');
+     },
+     dataType: 'json'
+    });
+  }
+
+  /**
+   * Add a comment via ajax and insert the comment into the comment tree.
+   */
+  function addComment(form) {
+    var node_id = form.find('input[name="node"]').val();
+    var parent_id = form.find('input[name="parent"]').val();
+    var text = form.find('textarea[name="comment"]').val();
+    var proposal = form.find('textarea[name="proposal"]').val();
+
+    if (text == '') {
+      showError('Please enter a comment.');
+      return;
+    }
+
+    // Disable the form that is being submitted.
+    form.find('textarea,input').attr('disabled', 'disabled');
+
+    // Send the comment to the server.
+    $.ajax({
+      type: "POST",
+      url: opts.addCommentURL,
+      dataType: 'json',
+      data: {
+        node: node_id,
+        parent: parent_id,
+        text: text,
+        proposal: proposal
+      },
+      success: function(data, textStatus, error) {
+        // Reset the form.
+        if (node_id) {
+          hideProposeChange(node_id);
+        }
+        form.find('textarea')
+          .val('')
+          .add(form.find('input'))
+          .removeAttr('disabled');
+	var ul = $('#cl' + (node_id || parent_id));
+        if (ul.data('empty')) {
+          $(ul).empty();
+          ul.data('empty', false);
+        }
+        insertComment(data.comment);
+        var ao = $('#ao' + node_id);
+        ao.find('img').attr({'src': opts.commentBrightImage});
+        if (node_id) {
+          // if this was a "root" comment, remove the commenting box
+          // (the user can get it back by reopening the comment popup)
+          $('#ca' + node_id).slideUp();
+        }
+      },
+      error: function(request, textStatus, error) {
+        form.find('textarea,input').removeAttr('disabled');
+        showError('Oops, there was a problem adding the comment.');
+      }
+    });
+  }
+
+  /**
+   * Recursively append comments to the main comment list and children
+   * lists, creating the comment tree.
+   */
+  function appendComments(comments, ul) {
+    $.each(comments, function() {
+      var div = createCommentDiv(this);
+      ul.append($(document.createElement('li')).html(div));
+      appendComments(this.children, div.find('ul.comment-children'));
+      // To avoid stagnating data, don't store the comments children in data.
+      this.children = null;
+      div.data('comment', this);
+    });
+  }
+
+  /**
+   * After adding a new comment, it must be inserted in the correct
+   * location in the comment tree.
+   */
+  function insertComment(comment) {
+    var div = createCommentDiv(comment);
+
+    // To avoid stagnating data, don't store the comments children in data.
+    comment.children = null;
+    div.data('comment', comment);
+
+    var ul = $('#cl' + (comment.node || comment.parent));
+    var siblings = getChildren(ul);
+
+    var li = $(document.createElement('li'));
+    li.hide();
+
+    // Determine where in the parents children list to insert this comment.
+    for(i=0; i < siblings.length; i++) {
+      if (comp(comment, siblings[i]) <= 0) {
+        $('#cd' + siblings[i].id)
+          .parent()
+          .before(li.html(div));
+        li.slideDown('fast');
+        return;
+      }
+    }
+
+    // If we get here, this comment rates lower than all the others,
+    // or it is the only comment in the list.
+    ul.append(li.html(div));
+    li.slideDown('fast');
+  }
+
+  function acceptComment(id) {
+    $.ajax({
+      type: 'POST',
+      url: opts.acceptCommentURL,
+      data: {id: id},
+      success: function(data, textStatus, request) {
+        $('#cm' + id).fadeOut('fast');
+        $('#cd' + id).removeClass('moderate');
+      },
+      error: function(request, textStatus, error) {
+        showError('Oops, there was a problem accepting the comment.');
+      }
+    });
+  }
+
+  function deleteComment(id) {
+    $.ajax({
+      type: 'POST',
+      url: opts.deleteCommentURL,
+      data: {id: id},
+      success: function(data, textStatus, request) {
+        var div = $('#cd' + id);
+        if (data == 'delete') {
+          // Moderator mode: remove the comment and all children immediately
+          div.slideUp('fast', function() {
+            div.remove();
+          });
+          return;
+        }
+        // User mode: only mark the comment as deleted
+        div
+          .find('span.user-id:first')
+          .text('[deleted]').end()
+          .find('div.comment-text:first')
+          .text('[deleted]').end()
+          .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
+                ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
+          .remove();
+        var comment = div.data('comment');
+        comment.username = '[deleted]';
+        comment.text = '[deleted]';
+        div.data('comment', comment);
+      },
+      error: function(request, textStatus, error) {
+        showError('Oops, there was a problem deleting the comment.');
+      }
+    });
+  }
+
+  function showProposal(id) {
+    $('#sp' + id).hide();
+    $('#hp' + id).show();
+    $('#pr' + id).slideDown('fast');
+  }
+
+  function hideProposal(id) {
+    $('#hp' + id).hide();
+    $('#sp' + id).show();
+    $('#pr' + id).slideUp('fast');
+  }
+
+  function showProposeChange(id) {
+    $('#pc' + id).hide();
+    $('#hc' + id).show();
+    var textarea = $('#pt' + id);
+    textarea.val(textarea.data('source'));
+    $.fn.autogrow.resize(textarea[0]);
+    textarea.slideDown('fast');
+  }
+
+  function hideProposeChange(id) {
+    $('#hc' + id).hide();
+    $('#pc' + id).show();
+    var textarea = $('#pt' + id);
+    textarea.val('').removeAttr('disabled');
+    textarea.slideUp('fast');
+  }
+
+  function toggleCommentMarkupBox(id) {
+    $('#mb' + id).toggle();
+  }
+
+  /** Handle when the user clicks on a sort by link. */
+  function handleReSort(link) {
+    var classes = link.attr('class').split(/\s+/);
+    for (var i=0; i<classes.length; i++) {
+      if (classes[i] != 'sort-option') {
+	by = classes[i].substring(2);
+      }
+    }
+    setComparator();
+    // Save/update the sortBy cookie.
+    var expiration = new Date();
+    expiration.setDate(expiration.getDate() + 365);
+    document.cookie= 'sortBy=' + escape(by) +
+                     ';expires=' + expiration.toUTCString();
+    $('ul.comment-ul').each(function(index, ul) {
+      var comments = getChildren($(ul), true);
+      comments = sortComments(comments);
+      appendComments(comments, $(ul).empty());
+    });
+  }
+
+  /**
+   * Function to process a vote when a user clicks an arrow.
+   */
+  function handleVote(link) {
+    if (!opts.voting) {
+      showError("You'll need to login to vote.");
+      return;
+    }
+
+    var id = link.attr('id');
+    if (!id) {
+      // Didn't click on one of the voting arrows.
+      return;
+    }
+    // If it is an unvote, the new vote value is 0,
+    // Otherwise it's 1 for an upvote, or -1 for a downvote.
+    var value = 0;
+    if (id.charAt(1) != 'u') {
+      value = id.charAt(0) == 'u' ? 1 : -1;
+    }
+    // The data to be sent to the server.
+    var d = {
+      comment_id: id.substring(2),
+      value: value
+    };
+
+    // Swap the vote and unvote links.
+    link.hide();
+    $('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
+      .show();
+
+    // The div the comment is displayed in.
+    var div = $('div#cd' + d.comment_id);
+    var data = div.data('comment');
+
+    // If this is not an unvote, and the other vote arrow has
+    // already been pressed, unpress it.
+    if ((d.value !== 0) && (data.vote === d.value * -1)) {
+      $('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
+      $('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
+    }
+
+    // Update the comments rating in the local data.
+    data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
+    data.vote = d.value;
+    div.data('comment', data);
+
+    // Change the rating text.
+    div.find('.rating:first')
+      .text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
+
+    // Send the vote information to the server.
+    $.ajax({
+      type: "POST",
+      url: opts.processVoteURL,
+      data: d,
+      error: function(request, textStatus, error) {
+        showError('Oops, there was a problem casting that vote.');
+      }
+    });
+  }
+
+  /**
+   * Open a reply form used to reply to an existing comment.
+   */
+  function openReply(id) {
+    // Swap out the reply link for the hide link
+    $('#rl' + id).hide();
+    $('#cr' + id).show();
+
+    // Add the reply li to the children ul.
+    var div = $(renderTemplate(replyTemplate, {id: id})).hide();
+    $('#cl' + id)
+      .prepend(div)
+      // Setup the submit handler for the reply form.
+      .find('#rf' + id)
+      .submit(function(event) {
+        event.preventDefault();
+        addComment($('#rf' + id));
+        closeReply(id);
+      })
+      .find('input[type=button]')
+      .click(function() {
+        closeReply(id);
+      });
+    div.slideDown('fast', function() {
+      $('#rf' + id).find('textarea').focus();
+    });
+  }
+
+  /**
+   * Close the reply form opened with openReply.
+   */
+  function closeReply(id) {
+    // Remove the reply div from the DOM.
+    $('#rd' + id).slideUp('fast', function() {
+      $(this).remove();
+    });
+
+    // Swap out the hide link for the reply link
+    $('#cr' + id).hide();
+    $('#rl' + id).show();
+  }
+
+  /**
+   * Recursively sort a tree of comments using the comp comparator.
+   */
+  function sortComments(comments) {
+    comments.sort(comp);
+    $.each(comments, function() {
+      this.children = sortComments(this.children);
+    });
+    return comments;
+  }
+
+  /**
+   * Get the children comments from a ul. If recursive is true,
+   * recursively include childrens' children.
+   */
+  function getChildren(ul, recursive) {
+    var children = [];
+    ul.children().children("[id^='cd']")
+      .each(function() {
+        var comment = $(this).data('comment');
+        if (recursive)
+          comment.children = getChildren($(this).find('#cl' + comment.id), true);
+        children.push(comment);
+      });
+    return children;
+  }
+
+  /** Create a div to display a comment in. */
+  function createCommentDiv(comment) {
+    if (!comment.displayed && !opts.moderator) {
+      return $('<div class="moderate">Thank you!  Your comment will show up '
+               + 'once it is has been approved by a moderator.</div>');
+    }
+    // Prettify the comment rating.
+    comment.pretty_rating = comment.rating + ' point' +
+      (comment.rating == 1 ? '' : 's');
+    // Make a class (for displaying not yet moderated comments differently)
+    comment.css_class = comment.displayed ? '' : ' moderate';
+    // Create a div for this comment.
+    var context = $.extend({}, opts, comment);
+    var div = $(renderTemplate(commentTemplate, context));
+
+    // If the user has voted on this comment, highlight the correct arrow.
+    if (comment.vote) {
+      var direction = (comment.vote == 1) ? 'u' : 'd';
+      div.find('#' + direction + 'v' + comment.id).hide();
+      div.find('#' + direction + 'u' + comment.id).show();
+    }
+
+    if (opts.moderator || comment.text != '[deleted]') {
+      div.find('a.reply').show();
+      if (comment.proposal_diff)
+        div.find('#sp' + comment.id).show();
+      if (opts.moderator && !comment.displayed)
+        div.find('#cm' + comment.id).show();
+      if (opts.moderator || (opts.username == comment.username))
+        div.find('#dc' + comment.id).show();
+    }
+    return div;
+  }
+
+  /**
+   * A simple template renderer. Placeholders such as <%id%> are replaced
+   * by context['id'] with items being escaped. Placeholders such as <#id#>
+   * are not escaped.
+   */
+  function renderTemplate(template, context) {
+    var esc = $(document.createElement('div'));
+
+    function handle(ph, escape) {
+      var cur = context;
+      $.each(ph.split('.'), function() {
+        cur = cur[this];
+      });
+      return escape ? esc.text(cur || "").html() : cur;
+    }
+
+    return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
+      return handle(arguments[2], arguments[1] == '%' ? true : false);
+    });
+  }
+
+  /** Flash an error message briefly. */
+  function showError(message) {
+    $(document.createElement('div')).attr({'class': 'popup-error'})
+      .append($(document.createElement('div'))
+               .attr({'class': 'error-message'}).text(message))
+      .appendTo('body')
+      .fadeIn("slow")
+      .delay(2000)
+      .fadeOut("slow");
+  }
+
+  /** Add a link the user uses to open the comments popup. */
+  $.fn.comment = function() {
+    return this.each(function() {
+      var id = $(this).attr('id').substring(1);
+      var count = COMMENT_METADATA[id];
+      var title = count + ' comment' + (count == 1 ? '' : 's');
+      var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
+      var addcls = count == 0 ? ' nocomment' : '';
+      $(this)
+        .append(
+          $(document.createElement('a')).attr({
+            href: '#',
+            'class': 'sphinx-comment-open' + addcls,
+            id: 'ao' + id
+          })
+            .append($(document.createElement('img')).attr({
+              src: image,
+              alt: 'comment',
+              title: title
+            }))
+            .click(function(event) {
+              event.preventDefault();
+              show($(this).attr('id').substring(2));
+            })
+        )
+        .append(
+          $(document.createElement('a')).attr({
+            href: '#',
+            'class': 'sphinx-comment-close hidden',
+            id: 'ah' + id
+          })
+            .append($(document.createElement('img')).attr({
+              src: opts.closeCommentImage,
+              alt: 'close',
+              title: 'close'
+            }))
+            .click(function(event) {
+              event.preventDefault();
+              hide($(this).attr('id').substring(2));
+            })
+        );
+    });
+  };
+
+  var opts = {
+    processVoteURL: '/_process_vote',
+    addCommentURL: '/_add_comment',
+    getCommentsURL: '/_get_comments',
+    acceptCommentURL: '/_accept_comment',
+    deleteCommentURL: '/_delete_comment',
+    commentImage: '/static/_static/comment.png',
+    closeCommentImage: '/static/_static/comment-close.png',
+    loadingImage: '/static/_static/ajax-loader.gif',
+    commentBrightImage: '/static/_static/comment-bright.png',
+    upArrow: '/static/_static/up.png',
+    downArrow: '/static/_static/down.png',
+    upArrowPressed: '/static/_static/up-pressed.png',
+    downArrowPressed: '/static/_static/down-pressed.png',
+    voting: false,
+    moderator: false
+  };
+
+  if (typeof COMMENT_OPTIONS != "undefined") {
+    opts = jQuery.extend(opts, COMMENT_OPTIONS);
+  }
+
+  var popupTemplate = '\
+    <div class="sphinx-comments" id="sc<%id%>">\
+      <p class="sort-options">\
+        Sort by:\
+        <a href="#" class="sort-option byrating">best rated</a>\
+        <a href="#" class="sort-option byascage">newest</a>\
+        <a href="#" class="sort-option byage">oldest</a>\
+      </p>\
+      <div class="comment-header">Comments</div>\
+      <div class="comment-loading" id="cn<%id%>">\
+        loading comments... <img src="<%loadingImage%>" alt="" /></div>\
+      <ul id="cl<%id%>" class="comment-ul"></ul>\
+      <div id="ca<%id%>">\
+      <p class="add-a-comment">Add a comment\
+        (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
+      <div class="comment-markup-box" id="mb<%id%>">\
+        reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
+        <tt>``code``</tt>, \
+        code blocks: <tt>::</tt> and an indented block after blank line</div>\
+      <form method="post" id="cf<%id%>" class="comment-form" action="">\
+        <textarea name="comment" cols="80"></textarea>\
+        <p class="propose-button">\
+          <a href="#" id="pc<%id%>" class="show-propose-change">\
+            Propose a change ▹\
+          </a>\
+          <a href="#" id="hc<%id%>" class="hide-propose-change">\
+            Propose a change ▿\
+          </a>\
+        </p>\
+        <textarea name="proposal" id="pt<%id%>" cols="80"\
+                  spellcheck="false"></textarea>\
+        <input type="submit" value="Add comment" />\
+        <input type="hidden" name="node" value="<%id%>" />\
+        <input type="hidden" name="parent" value="" />\
+      </form>\
+      </div>\
+    </div>';
+
+  var commentTemplate = '\
+    <div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
+      <div class="vote">\
+        <div class="arrow">\
+          <a href="#" id="uv<%id%>" class="vote" title="vote up">\
+            <img src="<%upArrow%>" />\
+          </a>\
+          <a href="#" id="uu<%id%>" class="un vote" title="vote up">\
+            <img src="<%upArrowPressed%>" />\
+          </a>\
+        </div>\
+        <div class="arrow">\
+          <a href="#" id="dv<%id%>" class="vote" title="vote down">\
+            <img src="<%downArrow%>" id="da<%id%>" />\
+          </a>\
+          <a href="#" id="du<%id%>" class="un vote" title="vote down">\
+            <img src="<%downArrowPressed%>" />\
+          </a>\
+        </div>\
+      </div>\
+      <div class="comment-content">\
+        <p class="tagline comment">\
+          <span class="user-id"><%username%></span>\
+          <span class="rating"><%pretty_rating%></span>\
+          <span class="delta"><%time.delta%></span>\
+        </p>\
+        <div class="comment-text comment"><#text#></div>\
+        <p class="comment-opts comment">\
+          <a href="#" class="reply hidden" id="rl<%id%>">reply ▹</a>\
+          <a href="#" class="close-reply" id="cr<%id%>">reply ▿</a>\
+          <a href="#" id="sp<%id%>" class="show-proposal">proposal ▹</a>\
+          <a href="#" id="hp<%id%>" class="hide-proposal">proposal ▿</a>\
+          <a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
+          <span id="cm<%id%>" class="moderation hidden">\
+            <a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
+          </span>\
+        </p>\
+        <pre class="proposal" id="pr<%id%>">\
+<#proposal_diff#>\
+        </pre>\
+          <ul class="comment-children" id="cl<%id%>"></ul>\
+        </div>\
+        <div class="clearleft"></div>\
+      </div>\
+    </div>';
+
+  var replyTemplate = '\
+    <li>\
+      <div class="reply-div" id="rd<%id%>">\
+        <form id="rf<%id%>">\
+          <textarea name="comment" cols="80"></textarea>\
+          <input type="submit" value="Add reply" />\
+          <input type="button" value="Cancel" />\
+          <input type="hidden" name="parent" value="<%id%>" />\
+          <input type="hidden" name="node" value="" />\
+        </form>\
+      </div>\
+    </li>';
+
+  $(document).ready(function() {
+    init();
+  });
+})(jQuery);
+
+$(document).ready(function() {
+  // add comment anchors for all paragraphs that are commentable
+  $('.sphinx-has-comment').comment();
+
+  // highlight search words in search results
+  $("div.context").each(function() {
+    var params = $.getQueryParameters();
+    var terms = (params.q) ? params.q[0].split(/\s+/) : [];
+    var result = $(this);
+    $.each(terms, function() {
+      result.highlightText(this.toLowerCase(), 'highlighted');
+    });
+  });
+
+  // directly open comment window if requested
+  var anchor = document.location.hash;
+  if (anchor.substring(0, 9) == '#comment-') {
+    $('#ao' + anchor.substring(9)).click();
+    document.location.hash = '#s' + anchor.substring(9);
+  }
+});
diff --git a/docs/_build/html/administration.html b/docs/_build/html/administration.html
new file mode 100644
index 0000000..eb5a1ef
--- /dev/null
+++ b/docs/_build/html/administration.html
@@ -0,0 +1,325 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Administration — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Distributed Searching" href="distributedsearching.html" />
+    <link rel="prev" title="Configuration" href="configuration.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="distributedsearching.html" title="Distributed Searching"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="configuration.html" title="Configuration"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="administration">
+<span id="id1"></span><h1>Administration<a class="headerlink" href="#administration" title="Permalink to this headline">¶</a></h1>
+<p>pycsw administration is handled by the <tt class="docutils literal"><span class="pre">pycsw-admin.py</span></tt> utility.  <tt class="docutils literal"><span class="pre">pycsw-admin.py</span></tt>
+is installed as part of the pycsw install process and should be available in your
+PATH.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Run <tt class="docutils literal"><span class="pre">pycsw-admin.py</span> <span class="pre">-h</span></tt> to see all administration operations and parameters</p>
+</div>
+<div class="section" id="metadata-repository-setup">
+<h2>Metadata Repository Setup<a class="headerlink" href="#metadata-repository-setup" title="Permalink to this headline">¶</a></h2>
+<p>pycsw supports the following databases:</p>
+<ul class="simple">
+<li>SQLite3</li>
+<li>PostgreSQL</li>
+<li>PostgreSQL with PostGIS enabled</li>
+<li>MySQL</li>
+</ul>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">The easiest and fastest way to deploy pycsw is to use SQLite3 as the backend.</p>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">PostgreSQL support includes support for PostGIS functions if enabled</p>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">If PostGIS (1.x or 2.x) is activated before setting up the pycsw/PostgreSQL database, then native PostGIS geometries will be enabled.</p>
+</div>
+<p>To expose your geospatial metadata via pycsw, perform the following actions:</p>
+<ul class="simple">
+<li>setup the database</li>
+<li>import metadata</li>
+<li>publish the repository</li>
+</ul>
+</div>
+<div class="section" id="supported-information-models">
+<h2>Supported Information Models<a class="headerlink" href="#supported-information-models" title="Permalink to this headline">¶</a></h2>
+<p>By default, pycsw supports the <tt class="docutils literal"><span class="pre">csw:Record</span></tt> information model.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">See <a class="reference internal" href="profiles.html#profiles"><em>Profile Plugins</em></a> for information on enabling profiles</p>
+</div>
+</div>
+<div class="section" id="setting-up-the-database">
+<h2>Setting up the Database<a class="headerlink" href="#setting-up-the-database" title="Permalink to this headline">¶</a></h2>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>pycsw-admin.py -c setup_db -f default.cfg
+</pre></div>
+</div>
+<p>This will create the necessary tables and values for the repository.</p>
+<p>The database created is an <a class="reference external" href="http://www.opengeospatial.org/standards/sfs">OGC SFSQL</a> compliant database, and can be used with any implementing software.  For example, to use with <a class="reference external" href="http://www.gdal.org/ogr">OGR</a>:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>ogrinfo /path/to/records.db
+INFO: Open of <span class="s1">'records.db'</span>
+using driver <span class="s1">'SQLite'</span> successful.
+1: records <span class="o">(</span>Polygon<span class="o">)</span>
+<span class="nv">$ </span>ogrinfo -al /path/to/records.db
+<span class="c"># lots of output</span>
+</pre></div>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">If PostGIS is detected, the pycsw-admin.py script does not create the SFSQL tables as they are already in the database.</p>
+</div>
+</div>
+<div class="section" id="loading-records">
+<h2>Loading Records<a class="headerlink" href="#loading-records" title="Permalink to this headline">¶</a></h2>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>pycsw-admin.py -c load_records -f default.cfg -p /path/to/records
+</pre></div>
+</div>
+<p>This will import all <tt class="docutils literal"><span class="pre">*.xml</span></tt> records from <tt class="docutils literal"><span class="pre">/path/to/records</span></tt> into the database specified in <tt class="docutils literal"><span class="pre">default.cfg</span></tt> (<tt class="docutils literal"><span class="pre">repository.database</span></tt>).  Passing <tt class="docutils literal"><span class="pre">-r</span></tt> to the script will process <tt class="docutils literal"><sp [...]
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Records can also be imported using CSW-T (see <a class="reference internal" href="transactions.html#transactions"><em>Transactions</em></a>).</p>
+</div>
+</div>
+<div class="section" id="exporting-the-repository">
+<h2>Exporting the Repository<a class="headerlink" href="#exporting-the-repository" title="Permalink to this headline">¶</a></h2>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>pycsw-admin.py -c export_records -f default.cfg -p /path/to/output_dir
+</pre></div>
+</div>
+<p>This will write each record in the database specified in <tt class="docutils literal"><span class="pre">default.cfg</span></tt> (<tt class="docutils literal"><span class="pre">repository.database</span></tt>) to an XML document on disk, in directory <tt class="docutils literal"><span class="pre">/path/to/output_dir</span></tt>.</p>
+</div>
+<div class="section" id="optimizing-the-database">
+<h2>Optimizing the Database<a class="headerlink" href="#optimizing-the-database" title="Permalink to this headline">¶</a></h2>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>pycsw-admin.py -c optimize_db -f default.cfg
+</pre></div>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">This feature is relevant only for PostgreSQL and MySQL</p>
+</div>
+</div>
+<div class="section" id="database-specific-notes">
+<h2>Database Specific Notes<a class="headerlink" href="#database-specific-notes" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="postgresql">
+<h3>PostgreSQL<a class="headerlink" href="#postgresql" title="Permalink to this headline">¶</a></h3>
+<ul class="simple">
+<li>if PostGIS is not enabled, pycsw makes uses of PL/Python functions.  To enable PostgreSQL support, the database user must be able to create functions within the database. In case of recent PostgreSQL versions (9.x), the PL/Python extension must be enabled prior to pycsw setup</li>
+<li><a class="reference external" href="http://www.postgresql.org/docs/9.2/static/textsearch.html">PostgreSQL Full Text Search</a> is supported for <tt class="docutils literal"><span class="pre">csw:AnyText</span></tt> based queries.  pycsw creates a tsvector column based on the text from anytext column. Then pycsw creates a GIN index against the anytext_tsvector column.  This is created automatically in <tt class="docutils literal"><span class="pre">pycsw.admin.setup_db</span></tt>.  An [...]
+</ul>
+</div>
+<div class="section" id="postgis">
+<h3>PostGIS<a class="headerlink" href="#postgis" title="Permalink to this headline">¶</a></h3>
+<ul class="simple">
+<li>pycsw makes use of PostGIS spatial functions and native geometry data type.</li>
+<li>It is advised to install the PostGIS extension before setting up the pycsw database</li>
+<li>If PostGIS is detected, the pycsw-admin.py script will create both a native geometry column and a WKT column, as well as a trigger to keep both synchronized.</li>
+<li>In case PostGIS gets disabled, pycsw will continue to work with the <a class="reference external" href="http://en.wikipedia.org/wiki/Well-known_text">WKT</a> column</li>
+<li>In case of migration from plain PostgreSQL database to PostGIS, the spatial functions of PostGIS will be used automatically</li>
+<li>When migrating from plain PostgreSQL database to PostGIS, in order to enable native geometry support, a “GEOMETRY” column named “wkb_geometry” needs to be created manually (along with the update trigger in <tt class="docutils literal"><span class="pre">pycsw.admin.setup_db</span></tt>). Also the native geometries must be filled manually from the <a class="reference external" href="http://en.wikipedia.org/wiki/Well-known_text">WKT</a> field. Next versions of py [...]
+</ul>
+</div>
+</div>
+<div class="section" id="mapping-to-an-existing-repository">
+<span id="custom-repository"></span><h2>Mapping to an Existing Repository<a class="headerlink" href="#mapping-to-an-existing-repository" title="Permalink to this headline">¶</a></h2>
+<p>pycsw supports publishing metadata from an existing repository.  To enable this functionality, the default database mappings must be modified to represent the existing database columns mapping to the abstract core model (the default mappings are in <tt class="docutils literal"><span class="pre">pycsw/config.py:MD_CORE_MODEL</span></tt>).</p>
+<p>To override the default settings:</p>
+<ul class="simple">
+<li>define a custom database mapping based on <tt class="docutils literal"><span class="pre">etc/mappings.py</span></tt></li>
+<li>in <tt class="docutils literal"><span class="pre">default.cfg</span></tt>, set <tt class="docutils literal"><span class="pre">repository.mappings</span></tt> to the location of the mappings.py file:</li>
+</ul>
+<div class="highlight-none"><div class="highlight"><pre>[repository]
+...
+mappings=path/to/mappings.py
+</pre></div>
+</div>
+<p>See the <a class="reference internal" href="geonode.html#geonode"><em>GeoNode Configuration</em></a> and <a class="reference internal" href="odc.html#odc"><em>Open Data Catalog Configuration</em></a> for further examples.</p>
+<div class="section" id="existing-repository-requirements">
+<h3>Existing Repository Requirements<a class="headerlink" href="#existing-repository-requirements" title="Permalink to this headline">¶</a></h3>
+<p>pycsw requires certain repository attributes and semantics to exist in any repository to operate as follows:</p>
+<ul class="simple">
+<li><tt class="docutils literal"><span class="pre">pycsw:Identifier</span></tt>: unique identifier</li>
+<li><tt class="docutils literal"><span class="pre">pycsw:Typename</span></tt>: typename for the metadata; typically the value of the root element tag (e.g. <tt class="docutils literal"><span class="pre">csw:Record</span></tt>, <tt class="docutils literal"><span class="pre">gmd:MD_Metadata</span></tt>)</li>
+<li><tt class="docutils literal"><span class="pre">pycsw:Schema</span></tt>: schema for the metadata; typically the target namespace (e.g. <tt class="docutils literal"><span class="pre">http://www.opengis.net/cat/csw/2.0.2</span></tt>, <tt class="docutils literal"><span class="pre">http://www.isotc211.org/2005/gmd</span></tt>)</li>
+<li><tt class="docutils literal"><span class="pre">pycsw:InsertDate</span></tt>: date of insertion</li>
+<li><tt class="docutils literal"><span class="pre">pycsw:XML</span></tt>: full XML representation</li>
+<li><tt class="docutils literal"><span class="pre">pycsw:AnyText</span></tt>: bag of XML element text values, used for full text search.  Realized with the following design pattern:<ul>
+<li>capture all XML element and attribute values</li>
+<li>store in repository</li>
+</ul>
+</li>
+<li><tt class="docutils literal"><span class="pre">pycsw:BoundingBox</span></tt>: string of <a class="reference external" href="http://en.wikipedia.org/wiki/Well-known_text">WKT</a> or <a class="reference external" href="http://en.wikipedia.org/wiki/Well-known_text#Variations">EWKT</a> geometry</li>
+</ul>
+<p>The following repository semantics exist if the attributes are specified:</p>
+<ul class="simple">
+<li><tt class="docutils literal"><span class="pre">pycsw:Keywords</span></tt>: comma delimited list of keywords</li>
+<li><tt class="docutils literal"><span class="pre">pycsw:Links</span></tt>: structure of links in the format “name,description,protocol,url[^,,,[^,,,]]”</li>
+</ul>
+<p>Values of mappings can be derived from the following mechanisms:</p>
+<ul class="simple">
+<li>text fields</li>
+<li>Python datetime.datetime or datetime.date objects</li>
+<li>Python functions</li>
+</ul>
+<p>Further information is provided in <tt class="docutils literal"><span class="pre">pycsw/config.py:MD_CORE_MODEL</span></tt>.</p>
+</div>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Administration</a><ul>
+<li><a class="reference internal" href="#metadata-repository-setup">Metadata Repository Setup</a></li>
+<li><a class="reference internal" href="#supported-information-models">Supported Information Models</a></li>
+<li><a class="reference internal" href="#setting-up-the-database">Setting up the Database</a></li>
+<li><a class="reference internal" href="#loading-records">Loading Records</a></li>
+<li><a class="reference internal" href="#exporting-the-repository">Exporting the Repository</a></li>
+<li><a class="reference internal" href="#optimizing-the-database">Optimizing the Database</a></li>
+<li><a class="reference internal" href="#database-specific-notes">Database Specific Notes</a><ul>
+<li><a class="reference internal" href="#postgresql">PostgreSQL</a></li>
+<li><a class="reference internal" href="#postgis">PostGIS</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#mapping-to-an-existing-repository">Mapping to an Existing Repository</a><ul>
+<li><a class="reference internal" href="#existing-repository-requirements">Existing Repository Requirements</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="configuration.html"
+                        title="previous chapter">Configuration</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="distributedsearching.html"
+                        title="next chapter">Distributed Searching</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/administration.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="distributedsearching.html" title="Distributed Searching"
+             >next</a></li>
+        <li class="right" >
+          <a href="configuration.html" title="Configuration"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/ckan.html b/docs/_build/html/ckan.html
new file mode 100644
index 0000000..74ca224
--- /dev/null
+++ b/docs/_build/html/ckan.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>CKAN Configuration — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Testing" href="testing.html" />
+    <link rel="prev" title="Open Data Catalog Configuration" href="odc.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="testing.html" title="Testing"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="odc.html" title="Open Data Catalog Configuration"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="ckan-configuration">
+<span id="ckan"></span><h1>CKAN Configuration<a class="headerlink" href="#ckan-configuration" title="Permalink to this headline">¶</a></h1>
+<p>CKAN (<a class="reference external" href="http://ckan.org">http://ckan.org</a>) is a powerful data management system that makes data accessible – by providing tools to streamline publishing, sharing, finding and using data. CKAN is aimed at data publishers (national and regional governments, companies and organizations) wanting to make their data open and available.</p>
+<p><a class="reference external" href="https://github.com/okfn/ckanext-spatial">ckanext-spatial</a> is CKAN’s geospatial extension.  The extension adds a spatial field to the default CKAN dataset schema, using PostGIS as the backend. This allows to perform spatial queries and display the dataset extent on the frontend. It also provides harvesters to import geospatial metadata into CKAN from other sources, as well as commands to support the CSW standard. Finally, it also includes pl [...]
+<div class="section" id="ckan-setup">
+<h2>CKAN Setup<a class="headerlink" href="#ckan-setup" title="Permalink to this headline">¶</a></h2>
+<p>Installation and configuration Instructions are provided as part of the ckanext-spatial <a class="reference external" href="http://docs.ckan.org/projects/ckanext-spatial/en/latest/csw.html">documentation</a>.</p>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">CKAN Configuration</a><ul>
+<li><a class="reference internal" href="#ckan-setup">CKAN Setup</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="odc.html"
+                        title="previous chapter">Open Data Catalog Configuration</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="testing.html"
+                        title="next chapter">Testing</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/ckan.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="testing.html" title="Testing"
+             >next</a></li>
+        <li class="right" >
+          <a href="odc.html" title="Open Data Catalog Configuration"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/committers.html b/docs/_build/html/committers.html
new file mode 100644
index 0000000..984fd3f
--- /dev/null
+++ b/docs/_build/html/committers.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Committers — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="prev" title="License" href="license.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="license.html" title="License"
+             accesskey="P">previous</a></li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="committers">
+<span id="id1"></span><h1>Committers<a class="headerlink" href="#committers" title="Permalink to this headline">¶</a></h1>
+<table border="1" class="docutils">
+<colgroup>
+<col width="13%" />
+<col width="22%" />
+<col width="29%" />
+<col width="36%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Login(s)</th>
+<th class="head">Name</th>
+<th class="head">Email / Contact</th>
+<th class="head">Area(s)</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>tomkralidis</td>
+<td>Tom Kralidis</td>
+<td>tomkralidis at gmail.com</td>
+<td>Overall</td>
+</tr>
+<tr class="row-odd"><td>kalxas</td>
+<td>Angelos Tzotsos</td>
+<td>tzotsos at gmail.com</td>
+<td>INSPIRE, APISO profiles, Packaging</td>
+</tr>
+<tr class="row-even"><td>adamhinz</td>
+<td>Adam Hinz</td>
+<td>hinz dot adam at gmail.com</td>
+<td>WSGI/Server Deployment</td>
+</tr>
+</tbody>
+</table>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="license.html"
+                        title="previous chapter">License</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/committers.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="license.html" title="License"
+             >previous</a></li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/configuration.html b/docs/_build/html/configuration.html
new file mode 100644
index 0000000..1e66eff
--- /dev/null
+++ b/docs/_build/html/configuration.html
@@ -0,0 +1,259 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Configuration — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Administration" href="administration.html" />
+    <link rel="prev" title="Installation" href="installation.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="administration.html" title="Administration"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="installation.html" title="Installation"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="configuration">
+<span id="id1"></span><h1>Configuration<a class="headerlink" href="#configuration" title="Permalink to this headline">¶</a></h1>
+<p>pycsw’s runtime configuration is defined by <tt class="docutils literal"><span class="pre">default.cfg</span></tt>.  pycsw ships with a sample configuration (<tt class="docutils literal"><span class="pre">default-sample.cfg</span></tt>).  Copy the file to <tt class="docutils literal"><span class="pre">default.cfg</span></tt> and edit the following:</p>
+<p><strong>[server]</strong></p>
+<ul class="simple">
+<li><strong>home</strong>: the full filesystem path to pycsw</li>
+<li><strong>url</strong>: the URL of the resulting service</li>
+<li><strong>mimetype</strong>: the MIME type when returning HTTP responses</li>
+<li><strong>language</strong>: the ISO 639-1 language and ISO 3166-1 alpha2 country code of the service (e.g. <tt class="docutils literal"><span class="pre">en-CA</span></tt>, <tt class="docutils literal"><span class="pre">fr-CA</span></tt>, <tt class="docutils literal"><span class="pre">en-US</span></tt>)</li>
+<li><strong>encoding</strong>: the content type encoding (e.g. <tt class="docutils literal"><span class="pre">ISO-8859-1</span></tt>)</li>
+<li><strong>maxrecords</strong>: the maximum number of records to return by default</li>
+<li><strong>loglevel</strong>: the logging level (see <a class="reference external" href="http://docs.python.org/library/logging.html#logging-levels">http://docs.python.org/library/logging.html#logging-levels</a>)</li>
+<li><strong>logfile</strong>: the full file path to the logfile</li>
+<li><strong>ogc_schemas_base</strong>: base URL of OGC XML schemas tree file structure (default is <a class="reference external" href="http://schemas.opengis.net">http://schemas.opengis.net</a>)</li>
+<li><strong>federatedcatalogues</strong>: comma delimited list of CSW endpoints to be used for distributed searching, if requested by the client (see <a class="reference internal" href="distributedsearching.html#distributedsearching"><em>Distributed Searching</em></a>)</li>
+<li><strong>pretty_print</strong>: whether to pretty print the output (<tt class="docutils literal"><span class="pre">true</span></tt> or <tt class="docutils literal"><span class="pre">false</span></tt>).  Default is <tt class="docutils literal"><span class="pre">false</span></tt></li>
+<li><strong>gzip_compresslevel</strong>: gzip compression level, lowest is <tt class="docutils literal"><span class="pre">1</span></tt>, highest is <tt class="docutils literal"><span class="pre">9</span></tt>.  Default is off</li>
+<li><strong>domainquerytype</strong>: for GetDomain operations, how to output domain values.  Accepted values are <tt class="docutils literal"><span class="pre">list</span></tt> and <tt class="docutils literal"><span class="pre">range</span></tt> (min/max). Default is <tt class="docutils literal"><span class="pre">list</span></tt></li>
+<li><strong>domaincounts</strong>: for GetDomain operations, whether to provide frequency counts for values.  Accepted values are <tt class="docutils literal"><span class="pre">true</span></tt> and <tt class="docutils literal"><span class="pre">False</span></tt>. Default is <tt class="docutils literal"><span class="pre">false</span></tt></li>
+<li><strong>profiles</strong>: comma delimited list of profiles to load at runtime (default is none).  See <a class="reference internal" href="profiles.html#profiles"><em>Profile Plugins</em></a></li>
+<li><strong>smtp_host</strong>: SMTP host for processing <tt class="docutils literal"><span class="pre">csw:ResponseHandler</span></tt> parameter via outgoing email requests (default is <tt class="docutils literal"><span class="pre">localhost</span></tt>)</li>
+<li><strong>spatial_ranking</strong>: parameter that enables (<tt class="docutils literal"><span class="pre">true</span></tt> or <tt class="docutils literal"><span class="pre">false</span></tt>) ranking of spatial query results as per <a class="reference external" href="http://pubs.usgs.gov/of/2006/1279/2006-1279.pdf">K.J. Lanfear 2006 - A Spatial Overlay Ranking Method for a Geospatial Search of Text Objects</a>.</li>
+</ul>
+<p><strong>[manager]</strong></p>
+<ul class="simple">
+<li><strong>transactions</strong>: whether to enable transactions (<tt class="docutils literal"><span class="pre">true</span></tt> or <tt class="docutils literal"><span class="pre">false</span></tt>).  Default is <tt class="docutils literal"><span class="pre">false</span></tt> (see <a class="reference internal" href="transactions.html#transactions"><em>Transactions</em></a>)</li>
+<li><strong>allowed_ips</strong>: comma delimited list of IP addresses (e.g. 192.168.0.103), wildcards (e.g. 192.168.0.*) or CIDR notations (e.g. 192.168.100.0/24) allowed to perform transactions (see <a class="reference internal" href="transactions.html#transactions"><em>Transactions</em></a>)</li>
+<li><strong>csw_harvest_pagesize</strong>: when harvesting other CSW servers, the number of records per request to page by (default is 10)</li>
+</ul>
+<p><strong>[metadata:main]</strong></p>
+<ul class="simple">
+<li><strong>identification_title</strong>: the title of the service</li>
+<li><strong>identification_abstract</strong>: some descriptive text about the service</li>
+<li><strong>identification_keywords</strong>: comma delimited list of keywords about the service</li>
+<li><strong>identification_keywords_type</strong>: keyword type as per the <a class="reference external" href="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode">ISO 19115 MD_KeywordTypeCode codelist</a>).  Accepted values are <tt class="docutils literal"><span class="pre">discipline</span></tt>, <tt class="docutils literal"><span class="pre">temporal</span></tt>, <tt class="docutils literal"><span class="pre">place</span></tt>, <tt class="docutils liter [...]
+<li><strong>identification_fees</strong>: fees associated with the service</li>
+<li><strong>identification_accessconstraints</strong>: access constraints associated with the service</li>
+<li><strong>provider_name</strong>: the name of the service provider</li>
+<li><strong>provider_url</strong>: the URL of the service provider</li>
+<li><strong>contact_name</strong>: the name of the provider contact</li>
+<li><strong>contact_position</strong>: the position title of the provider contact</li>
+<li><strong>contact_address</strong>: the address of the provider contact</li>
+<li><strong>contact_city</strong>: the city of the provider contact</li>
+<li><strong>contact_stateorprovince</strong>: the province or territory of the provider contact</li>
+<li><strong>contact_postalcode</strong>: the postal code of the provider contact</li>
+<li><strong>contact_country</strong>: the country of the provider contact</li>
+<li><strong>contact_phone</strong>: the phone number of the provider contact</li>
+<li><strong>contact_fax</strong>: the facsimile number of the provider contact</li>
+<li><strong>contact_email</strong>: the email address of the provider contact</li>
+<li><strong>contact_url</strong>: the URL to more information about the provider contact</li>
+<li><strong>contact_hours</strong>: the hours of service to contact the provider</li>
+<li><strong>contact_instructions</strong>: the how to contact the provider contact</li>
+<li><strong>contact_role</strong>: the role of the provider contact as per the <a class="reference external" href="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode">ISO 19115 CI_RoleCode codelist</a>).  Accepted values are <tt class="docutils literal"><span class="pre">author</span></tt>, <tt class="docutils literal"><span class="pre">processor</span></tt>, <tt class="docutils literal"><span class="pre">publisher</span></tt>, <tt class="docutils literal"><span [...]
+</ul>
+<p><strong>[repository]</strong></p>
+<ul class="simple">
+<li><strong>database</strong>: the full file path to the metadata database, in database URL format (see <a class="reference external" href="http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls">http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls</a>)</li>
+<li><strong>table</strong>: the table name for metadata records (default is <tt class="docutils literal"><span class="pre">records</span></tt>).  If you are using PostgreSQL with a DB schema other than <tt class="docutils literal"><span class="pre">public</span></tt>, qualify the table like <tt class="docutils literal"><span class="pre">myschema.table</span></tt></li>
+<li><strong>mappings</strong>: custom repository mappings (see <a class="reference internal" href="administration.html#custom-repository"><em>Mapping to an Existing Repository</em></a>)</li>
+<li><strong>source</strong>: the source of this repository only if not local (e.g. <a class="reference internal" href="geonode.html#geonode"><em>GeoNode Configuration</em></a>, <a class="reference internal" href="odc.html#odc"><em>Open Data Catalog Configuration</em></a>).  Supported values are <tt class="docutils literal"><span class="pre">geonode</span></tt>, <tt class="docutils literal"><span class="pre">odc</span></tt></li>
+<li><strong>filter</strong>: server side database filter to apply as mask to all CSW requests (see <a class="reference internal" href="repofilters.html#repofilters"><em>Repository Filters</em></a>)</li>
+</ul>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">See <a class="reference internal" href="administration.html#administration"><em>Administration</em></a> for connecting your metadata repository and supported information models.</p>
+</div>
+<div class="section" id="alternate-configurations">
+<span id="id2"></span><h2>Alternate Configurations<a class="headerlink" href="#alternate-configurations" title="Permalink to this headline">¶</a></h2>
+<p>By default, pycsw loads <tt class="docutils literal"><span class="pre">default.cfg</span></tt> at runtime.  To load an alternate configuration, modify <tt class="docutils literal"><span class="pre">csw.py</span></tt> to point to the desired configuration.  Alternatively, pycsw supports explicitly specifiying a configuration by appending <tt class="docutils literal"><span class="pre">config=/path/to/default.cfg</span></tt> to the base URL of the service (e.g. <tt class="docutils litera [...]
+<p>This also provides the functionality to deploy numerous CSW servers with a single pycsw installation.</p>
+<div class="section" id="hiding-the-location">
+<h3>Hiding the Location<a class="headerlink" href="#hiding-the-location" title="Permalink to this headline">¶</a></h3>
+<p>Some deployments with alternate configurations prefer not to advertise the base URL with the <tt class="docutils literal"><span class="pre">config=</span></tt> approach.  In this case, there are many options to advertise the base URL.</p>
+<div class="section" id="environment-variables">
+<h4>Environment Variables<a class="headerlink" href="#environment-variables" title="Permalink to this headline">¶</a></h4>
+<p>One option is using Apache’s <tt class="docutils literal"><span class="pre">Alias</span></tt> and <tt class="docutils literal"><span class="pre">SetEnvIf</span></tt> directives.  For example, given the base URL <tt class="docutils literal"><span class="pre">http://localhost/pycsw/csw.py?config=foo.cfg</span></tt>, set the following in Apache’s <tt class="docutils literal"><span class="pre">httpd.conf</span></tt>:</p>
+<div class="highlight-none"><div class="highlight"><pre>Alias /pycsw/csw-foo.py /var/www/pycsw/csw.py
+SetEnvIf Request_URI "/pycsw/csw-foo.py" PYCSW_CONFIG=/var/www/pycsw/csw-foo.cfg
+</pre></div>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Apache must be restarted after changes to <tt class="docutils literal"><span class="pre">httpd.conf</span></tt></p>
+</div>
+<p>pycsw will use the configuration as set in the <tt class="docutils literal"><span class="pre">PYCSW_CONFIG</span></tt> environment variable in the same manner as if it was specified in the base URL.  Note that the configuration value <tt class="docutils literal"><span class="pre">server.url</span></tt> value must match the <tt class="docutils literal"><span class="pre">Request_URI</span></tt> value so as to advertise correctly in pycsw’s Capabilities XML.</p>
+</div>
+<div class="section" id="wrapper-script">
+<h4>Wrapper Script<a class="headerlink" href="#wrapper-script" title="Permalink to this headline">¶</a></h4>
+<p>Another option is to write a simple wrapper (e.g. <tt class="docutils literal"><span class="pre">csw-foo.sh</span></tt>), which provides the same functionality and can be deployed without restarting Apache:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="c">#!/bin/sh</span>
+
+<span class="nb">export </span><span class="nv">PYCSW_CONFIG</span><span class="o">=</span>/var/www/pycsw/csw-foo.cfg
+
+/var/www/pycsw/csw.py
+</pre></div>
+</div>
+</div>
+</div>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Configuration</a><ul>
+<li><a class="reference internal" href="#alternate-configurations">Alternate Configurations</a><ul>
+<li><a class="reference internal" href="#hiding-the-location">Hiding the Location</a><ul>
+<li><a class="reference internal" href="#environment-variables">Environment Variables</a></li>
+<li><a class="reference internal" href="#wrapper-script">Wrapper Script</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="installation.html"
+                        title="previous chapter">Installation</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="administration.html"
+                        title="next chapter">Administration</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/configuration.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="administration.html" title="Administration"
+             >next</a></li>
+        <li class="right" >
+          <a href="installation.html" title="Installation"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/contributing.html b/docs/_build/html/contributing.html
new file mode 100644
index 0000000..1dbcf48
--- /dev/null
+++ b/docs/_build/html/contributing.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Contributing to pycsw — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="License" href="license.html" />
+    <link rel="prev" title="Support" href="support.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="license.html" title="License"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="support.html" title="Support"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="contributing-to-pycsw">
+<span id="contributing"></span><h1>Contributing to pycsw<a class="headerlink" href="#contributing-to-pycsw" title="Permalink to this headline">¶</a></h1>
+<p>The pycsw project openly welcomes contributions (bug reports, bug fixes, code
+enhancements/features, etc.).  This document will outline some guidelines on
+contributing to pycsw.  As well, pycsw <a class="reference external" href="/community.html">community</a> is a great place to
+get an idea of how to connect and participate in pycsw community and development.</p>
+<div class="section" id="github">
+<h2>GitHub<a class="headerlink" href="#github" title="Permalink to this headline">¶</a></h2>
+<p>Code, tests, documentation, wiki and issue tracking are all managed on GitHub.
+Make sure you have a <a class="reference external" href="https://github.com/signup/free">GitHub account</a>.</p>
+</div>
+<div class="section" id="code-overview">
+<h2>Code Overview<a class="headerlink" href="#code-overview" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>the pycsw <a class="reference external" href="https://github.com/geopython/pycsw/wiki/Code-Architecture">wiki</a> documents an overview of the codebase</li>
+</ul>
+</div>
+<div class="section" id="documentation">
+<h2>Documentation<a class="headerlink" href="#documentation" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>documentation is managed in <tt class="docutils literal"><span class="pre">docs/</span></tt>, in reStructuredText format</li>
+<li><a class="reference external" href="http://sphinx-doc.org/">Sphinx</a> is used to generate the documentation</li>
+<li>See the <a class="reference external" href="http://sphinx-doc.org/rest.html">reStructuredText Primer</a> on rST markup and syntax.</li>
+</ul>
+</div>
+<div class="section" id="bugs">
+<h2>Bugs<a class="headerlink" href="#bugs" title="Permalink to this headline">¶</a></h2>
+<p>pycsw’s <a class="reference external" href="https://github.com/geopython/pycsw/issues">issue tracker</a> 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 <tt class="docutils literal"><span class="pre">pycsw-admin.py</span> <span class="pre">-c</span> <span class="pre">g [...]
+</div>
+<div class="section" id="forking-pycsw">
+<h2>Forking pycsw<a class="headerlink" href="#forking-pycsw" title="Permalink to this headline">¶</a></h2>
+<p>Contributions are most easily managed via GitHub pull requests.  <a class="reference external" href="https://github.com/geopython/pycsw/fork">Fork</a>
+pycsw into your own GitHub repository to be able to commit your work and submit pull requests.</p>
+</div>
+<div class="section" id="development">
+<h2>Development<a class="headerlink" href="#development" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="github-commit-guidelines">
+<h3>GitHub Commit Guidelines<a class="headerlink" href="#github-commit-guidelines" title="Permalink to this headline">¶</a></h3>
+<ul class="simple">
+<li>enhancements and bug fixes should be identified with a GitHub issue</li>
+<li>commits should be granular enough for other developers to understand the nature / implications of the change(s)</li>
+<li>for trivial commits that do not need <a class="reference external" href="https://travis-ci.org/geopython/pycsw">Travis CI</a> to run, include <tt class="docutils literal"><span class="pre">[ci</span> <span class="pre">skip]</span></tt> as part of the commit message</li>
+<li>non-trivial Git commits shall be associated with a GitHub issue.  As documentation can always be improved, tickets need not be opened for improving the docs</li>
+<li>Git commits shall include a description of changes</li>
+<li>Git commits shall include the GitHub issue number (i.e. <tt class="docutils literal"><span class="pre">#1234</span></tt>) in the Git commit log message</li>
+<li>all enhancements or bug fixes must successfully pass all <a class="reference internal" href="testing.html#ogc-cite"><em>OGC CITE</em></a> tests before they are committed</li>
+<li>all enhancements or bug fixes must successfully pass all <a class="reference internal" href="testing.html#tests"><em>Tester</em></a> tests before they are committed</li>
+<li>enhancements which can be demonstrated from the pycsw <a class="reference internal" href="testing.html#tests"><em>Tester</em></a> should be accompanied by example CSW request XML</li>
+</ul>
+</div>
+<div class="section" id="coding-guidelines">
+<h3>Coding Guidelines<a class="headerlink" href="#coding-guidelines" title="Permalink to this headline">¶</a></h3>
+<ul class="simple">
+<li>pycsw instead of PyCSW, pyCSW, Pycsw</li>
+<li>always code with <a class="reference external" href="http://www.python.org/dev/peps/pep-0008/">PEP 8</a> conventions</li>
+<li>always run source code through <tt class="docutils literal"><span class="pre">pep8</span></tt> and <a class="reference external" href="http://www.logilab.org/857">pylint</a>, using all pylint defaults except for <tt class="docutils literal"><span class="pre">C0111</span></tt>.  <tt class="docutils literal"><span class="pre">sbin/pycsw-pylint.sh</span></tt> is included for convenience</li>
+<li>for exceptions which make their way to OGC <tt class="docutils literal"><span class="pre">ExceptionReport</span></tt> XML, always specify the appropriate <tt class="docutils literal"><span class="pre">locator</span></tt> and <tt class="docutils literal"><span class="pre">code</span></tt> parameters</li>
+<li>the pycsw wiki documents <a class="reference external" href="https://github.com/geopython/pycsw/wiki/Developer-Tasks">developer tasks</a> for things like releasing documentation, testing, etc.</li>
+</ul>
+</div>
+<div class="section" id="submitting-a-pull-request">
+<h3>Submitting a Pull Request<a class="headerlink" href="#submitting-a-pull-request" title="Permalink to this headline">¶</a></h3>
+<p>This section will guide you through steps of working on pycsw.  This section assumes you have forked pycsw into your own GitHub repository.</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="c"># setup a virtualenv</span>
+<span class="nv">$ </span>virtualenv mypycsw <span class="o">&&</span> <span class="nb">cd </span>mypycsw
+<span class="nv">$ </span>. ./bin/activate
+<span class="c"># clone the repository locally</span>
+<span class="nv">$ </span>git clone git at github.com:USERNAME/pycsw.git
+<span class="nv">$ </span><span class="nb">cd </span>pycsw
+<span class="nv">$ </span>pip install -e . <span class="o">&&</span> pip install -r requirements-standalone.txt
+<span class="c"># add the main pycsw master branch to keep up to date with upstream changes</span>
+<span class="nv">$ </span>git remote add upstream https://github.com/geopython/pycsw.git
+<span class="nv">$ </span>git pull upstream master
+<span class="c"># create a local branch off master</span>
+<span class="c"># The name of the branch should include the issue number if it exists</span>
+<span class="nv">$ </span>git branch 72-foo
+<span class="nv">$ </span>git checkout 72-foo
+<span class="c">#</span>
+<span class="c"># make code/doc changes</span>
+<span class="c">#</span>
+<span class="nv">$ </span>git commit -am <span class="s1">'fix xyz (#72-foo)'</span>
+<span class="nv">$ </span>git push origin 72-foo
+</pre></div>
+</div>
+<p>Your changes are now visible on your pycsw repository on GitHub.  You are now ready to create a pull request.
+A member of the pycsw team will review the pull request and provide feedback / suggestions if required.  If changes are
+required, make them against the same branch and push as per above (all changes to the branch in the pull request apply).</p>
+<p>The pull request will then be merged by the pycsw team.  You can then delete your local branch (on GitHub), and then update
+your own repository to ensure your pycsw repository is up to date with pycsw master:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>git checkout master
+<span class="nv">$ </span>git pull upstream master
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="github-commit-access">
+<h2>GitHub Commit Access<a class="headerlink" href="#github-commit-access" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>proposals to provide developers with GitHub commit access shall be emailed to the pycsw-devel <a class="reference external" href="/community.html#mailing_list">mailing list</a>.  Proposals shall be approved by the pycsw development team.  Committers shall be added by the project admin</li>
+<li>removal of commit access shall be handled in the same manner</li>
+<li>each committer shall be listed in <a class="reference external" href="https://github.com/geopython/pycsw/blob/master/COMMITTERS.txt">https://github.com/geopython/pycsw/blob/master/COMMITTERS.txt</a></li>
+</ul>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Contributing to pycsw</a><ul>
+<li><a class="reference internal" href="#github">GitHub</a></li>
+<li><a class="reference internal" href="#code-overview">Code Overview</a></li>
+<li><a class="reference internal" href="#documentation">Documentation</a></li>
+<li><a class="reference internal" href="#bugs">Bugs</a></li>
+<li><a class="reference internal" href="#forking-pycsw">Forking pycsw</a></li>
+<li><a class="reference internal" href="#development">Development</a><ul>
+<li><a class="reference internal" href="#github-commit-guidelines">GitHub Commit Guidelines</a></li>
+<li><a class="reference internal" href="#coding-guidelines">Coding Guidelines</a></li>
+<li><a class="reference internal" href="#submitting-a-pull-request">Submitting a Pull Request</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#github-commit-access">GitHub Commit Access</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="support.html"
+                        title="previous chapter">Support</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="license.html"
+                        title="next chapter">License</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/contributing.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="license.html" title="License"
+             >next</a></li>
+        <li class="right" >
+          <a href="support.html" title="Support"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/distributedsearching.html b/docs/_build/html/distributedsearching.html
new file mode 100644
index 0000000..a95e03d
--- /dev/null
+++ b/docs/_build/html/distributedsearching.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Distributed Searching — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Search/Retrieval via URL (SRU) Support" href="sru.html" />
+    <link rel="prev" title="Administration" href="administration.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="sru.html" title="Search/Retrieval via URL (SRU) Support"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="administration.html" title="Administration"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="distributed-searching">
+<span id="distributedsearching"></span><h1>Distributed Searching<a class="headerlink" href="#distributed-searching" title="Permalink to this headline">¶</a></h1>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Your server must be able to make outgoing HTTP requests for this functionality.</p>
+</div>
+<p>pycsw has the ability to perform distributed searching against other CSW servers.  Distributed searching is disabled by default; to enable, <tt class="docutils literal"><span class="pre">server.federatedcatalogues</span></tt> must be set.  A CSW client must issue a GetRecords request with <tt class="docutils literal"><span class="pre">csw:DistributedSearch</span></tt> specified, along with an optional <tt class="docutils literal"><span class="pre">hopCount</span></tt> attribute (see s [...]
+<div class="section" id="scenario-federated-search">
+<h2>Scenario: Federated Search<a class="headerlink" href="#scenario-federated-search" title="Permalink to this headline">¶</a></h2>
+<p>pycsw deployment with 3 configurations (CSW-1, CSW-2, CSW-3), subsequently providing three (3) endpoints.  Each endpoint is based on an opaque metadata repository (based on theme/place/discipline, etc.).  Goal is to perform a single search against all endpoints.</p>
+<p>pycsw realizes this functionality by supporting <a class="reference internal" href="configuration.html#alternate-configurations"><em>alternate configurations</em></a>, and exposes the additional CSW endpoint(s) with the following design pattern:</p>
+<p>CSW-1: <tt class="docutils literal"><span class="pre">http://localhost/pycsw/csw.py?config=CSW-1.cfg</span></tt></p>
+<p>CSW-2: <tt class="docutils literal"><span class="pre">http://localhost/pycsw/csw.py?config=CSW-2.cfg</span></tt></p>
+<p>CSW-3: <tt class="docutils literal"><span class="pre">http://localhost/pycsw/csw.py?config=CSW-3.cfg</span></tt></p>
+<p>...where the <tt class="docutils literal"><span class="pre">*.cfg</span></tt> configuration files are configured for each respective metadata repository.  The above CSW endpoints can be interacted with as usual.</p>
+<p>To federate the discovery of the three (3) portals into a unified search, pycsw realizes this functionality by deploying an additional configuration which acts as the superset of CSW-1, CSW-2, CSW-3:</p>
+<p>CSW-all: <tt class="docutils literal"><span class="pre">http://localhost/pycsw/csw.py?config=CSW-all.cfg</span></tt></p>
+<p>This allows the client to invoke one (1) CSW GetRecords request, in which the CSW endpoint spawns the same GetRecords request to 1..n distributed CSW endpoints.  Distributed CSW endpoints are advertised in CSW Capabilities XML via <tt class="docutils literal"><span class="pre">ows:Constraint</span></tt>:</p>
+<div class="highlight-xml"><div class="highlight"><pre><span class="nt"><ows:OperationsMetadata></span>
+...
+    <span class="nt"><ows:Constraint</span> <span class="na">name=</span><span class="s">"FederatedCatalogues"</span><span class="nt">></span>
+        <span class="nt"><ows:Value></span>http://localhost/pycsw/csw.py?config=CSW-1.cfg<span class="nt"></ows:Value></span>
+        <span class="nt"><ows:Value></span>http://localhost/pycsw/csw.py?config=CSW-2.cfg<span class="nt"></ows:Value></span>
+        <span class="nt"><ows:Value></span>http://localhost/pycsw/csw.py?config=CSW-3.cfg<span class="nt"></ows:Value></span>
+    <span class="nt"></ows:Constraint></span>
+...
+<span class="nt"></ows:OperationsMetadata></span>
+</pre></div>
+</div>
+<p>...which advertises which CSW endpoint(s) the CSW server will spawn if a distributed search is requested by the client.</p>
+<p>in the CSW-all configuration:</p>
+<div class="highlight-none"><div class="highlight"><pre>[server]
+...
+federatedcatalogues=http://localhost/pycsw/csw.py?config=CSW-1.cfg,http://localhost/pycsw/csw.py?config=CSW-2.cfg,http://localhost/pycsw/csw.py?config=CSW-3.cfg
+</pre></div>
+</div>
+<p>At which point a CSW client request to CSW-all with <tt class="docutils literal"><span class="pre">distributedsearch=TRUE</span></tt>, while specifying an optional <tt class="docutils literal"><span class="pre">hopCount</span></tt>.  Query network topology:</p>
+<div class="highlight-none"><div class="highlight"><pre>     AnyClient
+         ^
+         |
+         v
+      CSW-all
+         ^
+         |
+         v
+  /-------------\
+  ^      ^      ^
+  |      |      |
+  v      v      v
+CSW-1  CSW-2  CSW-3
+</pre></div>
+</div>
+<p>As a result, a pycsw deployment in this scenario may be approached on a per ‘theme’ basis, or at an aggregate level.</p>
+<p>All interaction in this scenario is local to the pycsw installation, so network performance would not be problematic.</p>
+<p>A very important facet of distributed search is as per Annex B of OGC:CSW 2.0.2.  Given that all the CSW endpoints are managed locally, duplicates and infinite looping are not deemed to present an issue.</p>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Distributed Searching</a><ul>
+<li><a class="reference internal" href="#scenario-federated-search">Scenario: Federated Search</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="administration.html"
+                        title="previous chapter">Administration</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="sru.html"
+                        title="next chapter">Search/Retrieval via URL (SRU) Support</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/distributedsearching.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="sru.html" title="Search/Retrieval via URL (SRU) Support"
+             >next</a></li>
+        <li class="right" >
+          <a href="administration.html" title="Administration"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/geonode.html b/docs/_build/html/geonode.html
new file mode 100644
index 0000000..7797233
--- /dev/null
+++ b/docs/_build/html/geonode.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>GeoNode Configuration — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Open Data Catalog Configuration" href="odc.html" />
+    <link rel="prev" title="Output Schema Plugins" href="outputschemas.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="odc.html" title="Open Data Catalog Configuration"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="outputschemas.html" title="Output Schema Plugins"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="geonode-configuration">
+<span id="geonode"></span><h1>GeoNode Configuration<a class="headerlink" href="#geonode-configuration" title="Permalink to this headline">¶</a></h1>
+<p>GeoNode (<a class="reference external" href="http://geonode.org/">http://geonode.org/</a>) is a platform for the management and publication of geospatial data. It brings together mature and stable open-source software projects under a consistent and easy-to-use interface allowing users, with little training, to quickly and easily share data and create interactive maps. GeoNode provides a cost-effective and scalable tool for developing information management systems.  GeoNode uses CSW  [...]
+<p>pycsw supports binding to an existing GeoNode repository for metadata query.  The binding is read-only (transactions are not in scope, as GeoNode manages repository metadata changes in the application proper).</p>
+<div class="section" id="geonode-setup">
+<h2>GeoNode Setup<a class="headerlink" href="#geonode-setup" title="Permalink to this headline">¶</a></h2>
+<p>pycsw is enabled and configured by default in GeoNode, so there are no additional steps required once GeoNode is setup.  See the <tt class="docutils literal"><span class="pre">CATALOGUE</span></tt> and <tt class="docutils literal"><span class="pre">PYCSW</span></tt> <a class="reference external" href="http://docs.geonode.org/en/latest/developers/reference/django-apps.html#id1">settings.py entries</a> at <a class="reference external" href="http://docs.geonode.org/en/latest/developers/r [...]
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">GeoNode Configuration</a><ul>
+<li><a class="reference internal" href="#geonode-setup">GeoNode Setup</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="outputschemas.html"
+                        title="previous chapter">Output Schema Plugins</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="odc.html"
+                        title="next chapter">Open Data Catalog Configuration</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/geonode.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="odc.html" title="Open Data Catalog Configuration"
+             >next</a></li>
+        <li class="right" >
+          <a href="outputschemas.html" title="Output Schema Plugins"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html
new file mode 100644
index 0000000..092da69
--- /dev/null
+++ b/docs/_build/html/index.html
@@ -0,0 +1,272 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>pycsw 1.8.2 Documentation — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="#" />
+    <link rel="next" title="Introduction" href="introduction.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="introduction.html" title="Introduction"
+             accesskey="N">next</a></li>
+        <li><a href="#">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="pycsw-release-documentation">
+<span id="index"></span><h1>pycsw 1.8.2 Documentation<a class="headerlink" href="#pycsw-release-documentation" title="Permalink to this headline">¶</a></h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Author:</th><td class="field-body">Tom Kralidis</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Contact:</th><td class="field-body">tomkralidis at gmail.com</td>
+</tr>
+<tr class="field-odd field"><th class="field-name">Release:</th><td class="field-body">1.8.2</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Date:</th><td class="field-body">2014-05-28</td>
+</tr>
+</tbody>
+</table>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="introduction.html">Introduction</a></li>
+<li class="toctree-l1"><a class="reference internal" href="introduction.html#features">Features</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="introduction.html#standards-support">Standards Support</a></li>
+<li class="toctree-l2"><a class="reference internal" href="introduction.html#supported-operations">Supported Operations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="introduction.html#supported-output-formats">Supported Output Formats</a></li>
+<li class="toctree-l2"><a class="reference internal" href="introduction.html#supported-output-schemas">Supported Output Schemas</a></li>
+<li class="toctree-l2"><a class="reference internal" href="introduction.html#supported-sorting-functionality">Supported Sorting Functionality</a></li>
+<li class="toctree-l2"><a class="reference internal" href="introduction.html#supported-filters">Supported Filters</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="installation.html#system-requirements">System Requirements</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html#installing-from-source">Installing from Source</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html#installing-from-the-python-package-index-pypi">Installing from the Python Package Index (PyPi)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html#installing-from-opensuse-build-service">Installing from OpenSUSE Build Service</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html#installing-on-ubuntu-xubuntu-kubuntu">Installing on Ubuntu/Xubuntu/Kubuntu</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html#running-on-windows">Running on Windows</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html#security">Security</a></li>
+<li class="toctree-l2"><a class="reference internal" href="installation.html#running-on-wsgi">Running on WSGI</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="configuration.html">Configuration</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="configuration.html#alternate-configurations">Alternate Configurations</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="administration.html">Administration</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="administration.html#metadata-repository-setup">Metadata Repository Setup</a></li>
+<li class="toctree-l2"><a class="reference internal" href="administration.html#supported-information-models">Supported Information Models</a></li>
+<li class="toctree-l2"><a class="reference internal" href="administration.html#setting-up-the-database">Setting up the Database</a></li>
+<li class="toctree-l2"><a class="reference internal" href="administration.html#loading-records">Loading Records</a></li>
+<li class="toctree-l2"><a class="reference internal" href="administration.html#exporting-the-repository">Exporting the Repository</a></li>
+<li class="toctree-l2"><a class="reference internal" href="administration.html#optimizing-the-database">Optimizing the Database</a></li>
+<li class="toctree-l2"><a class="reference internal" href="administration.html#database-specific-notes">Database Specific Notes</a></li>
+<li class="toctree-l2"><a class="reference internal" href="administration.html#mapping-to-an-existing-repository">Mapping to an Existing Repository</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="distributedsearching.html">Distributed Searching</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="distributedsearching.html#scenario-federated-search">Scenario: Federated Search</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="sru.html">Search/Retrieval via URL (SRU) Support</a></li>
+<li class="toctree-l1"><a class="reference internal" href="opensearch.html">OpenSearch Support</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="opensearch.html#description-document">Description Document</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="soap.html">SOAP</a></li>
+<li class="toctree-l1"><a class="reference internal" href="sitemaps.html">XML Sitemaps</a></li>
+<li class="toctree-l1"><a class="reference internal" href="transactions.html">Transactions</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="transactions.html#supported-resource-types">Supported Resource Types</a></li>
+<li class="toctree-l2"><a class="reference internal" href="transactions.html#harvesting">Harvesting</a></li>
+<li class="toctree-l2"><a class="reference internal" href="transactions.html#id2">Transactions</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="repofilters.html">Repository Filters</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="repofilters.html#scenario-one-database-many-views">Scenario: One Database, Many Views</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="profiles.html">Profile Plugins</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="profiles.html#overview">Overview</a></li>
+<li class="toctree-l2"><a class="reference internal" href="profiles.html#requirements">Requirements</a></li>
+<li class="toctree-l2"><a class="reference internal" href="profiles.html#abstract-base-class-definition">Abstract Base Class Definition</a></li>
+<li class="toctree-l2"><a class="reference internal" href="profiles.html#enabling-profiles">Enabling Profiles</a></li>
+<li class="toctree-l2"><a class="reference internal" href="profiles.html#testing">Testing</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="profiles.html#supported-profiles">Supported Profiles</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="profiles.html#iso-metadata-application-profile-1-0-0">ISO Metadata Application Profile (1.0.0)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="profiles.html#inspire-extension">INSPIRE Extension</a></li>
+<li class="toctree-l2"><a class="reference internal" href="profiles.html#csw-ebrim-registry-service-part-1-ebrim-profile-of-csw">CSW-ebRIM Registry Service - Part 1: ebRIM profile of CSW</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="outputschemas.html">Output Schema Plugins</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="outputschemas.html#overview">Overview</a></li>
+<li class="toctree-l2"><a class="reference internal" href="outputschemas.html#requirements">Requirements</a></li>
+<li class="toctree-l2"><a class="reference internal" href="outputschemas.html#implementing-a-new-outputschema">Implementing a new outputschema</a></li>
+<li class="toctree-l2"><a class="reference internal" href="outputschemas.html#testing">Testing</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="geonode.html">GeoNode Configuration</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="geonode.html#geonode-setup">GeoNode Setup</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="odc.html">Open Data Catalog Configuration</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="odc.html#open-data-catalog-setup">Open Data Catalog Setup</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="ckan.html">CKAN Configuration</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="ckan.html#ckan-setup">CKAN Setup</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="testing.html">Testing</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="testing.html#ogc-cite">OGC CITE</a></li>
+<li class="toctree-l2"><a class="reference internal" href="testing.html#tester">Tester</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="tools.html">Cataloguing and Metadata Tools</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="tools.html#csw-clients">CSW Clients</a></li>
+<li class="toctree-l2"><a class="reference internal" href="tools.html#csw-servers">CSW Servers</a></li>
+<li class="toctree-l2"><a class="reference internal" href="tools.html#metadata-editing-tools">Metadata Editing Tools</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="support.html">Support</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="support.html#community">Community</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="contributing.html">Contributing to pycsw</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="contributing.html#github">GitHub</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contributing.html#code-overview">Code Overview</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contributing.html#documentation">Documentation</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contributing.html#bugs">Bugs</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contributing.html#forking-pycsw">Forking pycsw</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contributing.html#development">Development</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contributing.html#github-commit-access">GitHub Commit Access</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="license.html">License</a></li>
+<li class="toctree-l1"><a class="reference internal" href="committers.html">Committers</a></li>
+</ul>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h4>Next topic</h4>
+  <p class="topless"><a href="introduction.html"
+                        title="next chapter">Introduction</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/index.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="introduction.html" title="Introduction"
+             >next</a></li>
+        <li><a href="#">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/installation.html b/docs/_build/html/installation.html
new file mode 100644
index 0000000..47464f8
--- /dev/null
+++ b/docs/_build/html/installation.html
@@ -0,0 +1,316 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Installation — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Configuration" href="configuration.html" />
+    <link rel="prev" title="Introduction" href="introduction.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="configuration.html" title="Configuration"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="introduction.html" title="Introduction"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="installation">
+<span id="id1"></span><h1>Installation<a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="system-requirements">
+<h2>System Requirements<a class="headerlink" href="#system-requirements" title="Permalink to this headline">¶</a></h2>
+<p>pycsw is written in <a class="reference external" href="http://python.org">Python</a>, and works with (tested) version 2.6 and 2.7</p>
+<p>pycsw requires the following Python supporting libraries:</p>
+<ul class="simple">
+<li><a class="reference external" href="http://lxml.de/">lxml</a> for XML support</li>
+<li><a class="reference external" href="http://www.sqlalchemy.org/">SQLAlchemy</a> for database bindings</li>
+<li><a class="reference external" href="http://code.google.com/p/pyproj/">pyproj</a> for coordinate transformations</li>
+<li><a class="reference external" href="http://toblerity.github.io/shapely/">Shapely</a> for spatial query / geometry support</li>
+<li><a class="reference external" href="https://github.com/geopython/OWSLib">OWSLib</a> for CSW client and metadata parser</li>
+</ul>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">You can install these dependencies via <a class="reference external" href="http://packages.python.org/distribute/easy_install.html">easy_install</a> or <a class="reference external" href="http://www.pip-installer.org">pip</a></p>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">For <a class="reference internal" href="geonode.html#geonode"><em>GeoNode</em></a> or <a class="reference internal" href="odc.html#odc"><em>Open Data Catalog</em></a> deployments, SQLAlchemy is not required</p>
+</div>
+</div>
+<div class="section" id="installing-from-source">
+<h2>Installing from Source<a class="headerlink" href="#installing-from-source" title="Permalink to this headline">¶</a></h2>
+<p><a class="reference external" href="/download.html">Download</a> the latest stable version or fetch from Git.</p>
+<div class="section" id="for-developers-and-the-truly-impatient">
+<h3>For Developers and the Truly Impatient<a class="headerlink" href="#for-developers-and-the-truly-impatient" title="Permalink to this headline">¶</a></h3>
+<p>The 4 minute install:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>virtualenv pycsw <span class="o">&&</span> <span class="nb">cd </span>pycsw <span class="o">&&</span> . bin/activate
+<span class="nv">$ </span>git clone https://github.com/geopython/pycsw.git <span class="o">&&</span> <span class="nb">cd </span>pycsw
+<span class="nv">$ </span>pip install -e . <span class="o">&&</span> pip install -r requirements-standalone.txt
+<span class="nv">$ </span>cp default-sample.cfg default.cfg
+<span class="nv">$ </span>vi default.cfg
+<span class="c"># adjust paths in</span>
+<span class="c"># - server.home</span>
+<span class="c"># - repository.database</span>
+<span class="c"># set server.url to http://localhost:8000/</span>
+<span class="nv">$ </span>python csw.wsgi
+<span class="nv">$ </span>curl http://localhost:8000/?service<span class="o">=</span>CSW&version<span class="o">=</span>2.0.2&request<span class="o">=</span>GetCapabilities
+</pre></div>
+</div>
+</div>
+<div class="section" id="the-quick-and-dirty-way">
+<h3>The Quick and Dirty Way<a class="headerlink" href="#the-quick-and-dirty-way" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>git clone git://github.com/geopython/pycsw.git
+</pre></div>
+</div>
+<p>Ensure that CGI is enabled for the install directory.  For example, on Apache, if pycsw is installed in <tt class="docutils literal"><span class="pre">/srv/www/htdocs/pycsw</span></tt> (where the URL will be <tt class="docutils literal"><span class="pre">http://host/pycsw/csw.py</span></tt>), add the following to <tt class="docutils literal"><span class="pre">httpd.conf</span></tt>:</p>
+<div class="highlight-none"><div class="highlight"><pre><Location /pycsw/>
+ Options FollowSymLinks +ExecCGI
+ Allow from all
+ AddHandler cgi-script .py
+</Location>
+</pre></div>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">If pycsw is installed in <tt class="docutils literal"><span class="pre">cgi-bin</span></tt>, this should work as expected.  In this case, the <a class="reference internal" href="testing.html#tests"><em>tests</em></a> application must be moved to a different location to serve static HTML documents.</p>
+</div>
+<p>Make shure, you have all the dependences from <tt class="docutils literal"><span class="pre">requirements.txt</span> <span class="pre">and</span> <span class="pre">requirements-standalone.txt</span></tt></p>
+</div>
+<div class="section" id="the-clean-and-proper-way">
+<h3>The Clean and Proper Way<a class="headerlink" href="#the-clean-and-proper-way" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>git clone git://github.com/geopython/pycsw.git
+<span class="nv">$ </span>python setup.py build
+<span class="nv">$ </span>python setup.py install
+</pre></div>
+</div>
+<p>At this point, pycsw is installed as a library and requires a CGI <tt class="docutils literal"><span class="pre">csw.py</span></tt> or WSGI <tt class="docutils literal"><span class="pre">csw.wsgi</span></tt> script to be served into your web server environment (see below for WSGI configuration/deployment).</p>
+</div>
+</div>
+<div class="section" id="installing-from-the-python-package-index-pypi">
+<span id="pypi"></span><h2>Installing from the Python Package Index (PyPi)<a class="headerlink" href="#installing-from-the-python-package-index-pypi" title="Permalink to this headline">¶</a></h2>
+<div class="highlight-bash"><div class="highlight"><pre><span class="c"># easy_install or pip will do the trick</span>
+<span class="nv">$ </span>easy_install pycsw
+<span class="c"># or</span>
+<span class="nv">$ </span>pip install pycsw
+</pre></div>
+</div>
+</div>
+<div class="section" id="installing-from-opensuse-build-service">
+<span id="opensuse"></span><h2>Installing from OpenSUSE Build Service<a class="headerlink" href="#installing-from-opensuse-build-service" title="Permalink to this headline">¶</a></h2>
+<p>In order to install the OBS package in openSUSE 12.3, one can run the following commands as user <tt class="docutils literal"><span class="pre">root</span></tt>:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="c"># zypper -ar http://download.opensuse.org/repositories/Application:/Geo/openSUSE_12.3/ GEO</span>
+<span class="c"># zypper -ar http://download.opensuse.org/repositories/devel:/languages:/python/openSUSE_12.3/ python</span>
+<span class="c"># zypper refresh</span>
+<span class="c"># zypper install python-pycsw pycsw-cgi</span>
+</pre></div>
+</div>
+<p>For earlier openSUSE versions change <tt class="docutils literal"><span class="pre">12.3</span></tt> with <tt class="docutils literal"><span class="pre">12.2</span></tt>. For future openSUSE version use <tt class="docutils literal"><span class="pre">Factory</span></tt>.</p>
+<p>An alternative method is to use the <a class="reference external" href="http://software.opensuse.org/search?q=pycsw&baseproject=openSUSE%3A12.3&lang=en&include_home=true&exclude_debug=true">One-Click Installer</a>.</p>
+</div>
+<div class="section" id="installing-on-ubuntu-xubuntu-kubuntu">
+<span id="ubuntu"></span><h2>Installing on Ubuntu/Xubuntu/Kubuntu<a class="headerlink" href="#installing-on-ubuntu-xubuntu-kubuntu" title="Permalink to this headline">¶</a></h2>
+<p>In order to install pycsw to an Ubuntu based distribution, one can run the following commands:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="c"># sudo add-apt-repository ppa:pycsw/stable</span>
+<span class="c"># sudo apt-get update</span>
+<span class="c"># sudo apt-get install python-pycsw pycsw-cgi</span>
+</pre></div>
+</div>
+<p>An alternative method is to use the OSGeoLive installation script located in <tt class="docutils literal"><span class="pre">pycsw/etc/dist/osgeolive</span></tt>:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="c"># cd pycsw/etc/dist</span>
+<span class="c"># sudo ./install_pycsw.sh</span>
+</pre></div>
+</div>
+<p>The script installs the dependencies (Apache, lxml, sqlalchemy, shapely, pyproj) and then pycsw to <tt class="docutils literal"><span class="pre">/var/www</span></tt>.</p>
+</div>
+<div class="section" id="running-on-windows">
+<h2>Running on Windows<a class="headerlink" href="#running-on-windows" title="Permalink to this headline">¶</a></h2>
+<p>For Windows installs, change the first line of <tt class="docutils literal"><span class="pre">csw.py</span></tt> to:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/Python27/python -u</span>
+</pre></div>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">The use of <tt class="docutils literal"><span class="pre">-u</span></tt> is required to properly output gzip-compressed responses.</p>
+</div>
+</div>
+<div class="section" id="security">
+<h2>Security<a class="headerlink" href="#security" title="Permalink to this headline">¶</a></h2>
+<p>By default, <tt class="docutils literal"><span class="pre">default.cfg</span></tt> is at the root of the pycsw install.  If pycsw is setup outside an HTTP server’s <tt class="docutils literal"><span class="pre">cgi-bin</span></tt> area, this file could be read.  The following options protect the configuration:</p>
+<ul class="simple">
+<li>move <tt class="docutils literal"><span class="pre">default.cfg</span></tt> to a non HTTP accessible area, and modify <tt class="docutils literal"><span class="pre">csw.py</span></tt> to point to the updated location</li>
+<li>configure web server to deny access to the configuration.  For example, in Apache, add the following to <tt class="docutils literal"><span class="pre">httpd.conf</span></tt>:</li>
+</ul>
+<div class="highlight-none"><div class="highlight"><pre><Files ~ "\.(cfg)$">
+ order allow,deny
+ deny from all
+</Files>
+</pre></div>
+</div>
+</div>
+<div class="section" id="running-on-wsgi">
+<h2>Running on WSGI<a class="headerlink" href="#running-on-wsgi" title="Permalink to this headline">¶</a></h2>
+<p>pycsw supports the <a class="reference external" href="http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface">Web Server Gateway Interface</a> (WSGI).  To run pycsw in WSGI mode, use <tt class="docutils literal"><span class="pre">csw.wsgi</span></tt> in your WSGI server environment.  Below is an example of configuring with Apache:</p>
+<div class="highlight-none"><div class="highlight"><pre>WSGIDaemonProcess host1 home=/var/www/pycsw processes=2
+WSGIProcessGroup host1
+WSGIScriptAlias /pycsw-wsgi /var/www/pycsw/csw.wsgi
+<Directory /var/www/pycsw>
+  Order deny,allow
+  Allow from all
+</Directory>
+</pre></div>
+</div>
+<p>or use the <a class="reference external" href="http://docs.python.org/library/wsgiref.html">WSGI reference implementation</a>:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>python ./csw.wsgi
+Serving on port 8000...
+</pre></div>
+</div>
+<p>which will publish pycsw to <tt class="docutils literal"><span class="pre">http://localhost:8000/</span></tt></p>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Installation</a><ul>
+<li><a class="reference internal" href="#system-requirements">System Requirements</a></li>
+<li><a class="reference internal" href="#installing-from-source">Installing from Source</a><ul>
+<li><a class="reference internal" href="#for-developers-and-the-truly-impatient">For Developers and the Truly Impatient</a></li>
+<li><a class="reference internal" href="#the-quick-and-dirty-way">The Quick and Dirty Way</a></li>
+<li><a class="reference internal" href="#the-clean-and-proper-way">The Clean and Proper Way</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#installing-from-the-python-package-index-pypi">Installing from the Python Package Index (PyPi)</a></li>
+<li><a class="reference internal" href="#installing-from-opensuse-build-service">Installing from OpenSUSE Build Service</a></li>
+<li><a class="reference internal" href="#installing-on-ubuntu-xubuntu-kubuntu">Installing on Ubuntu/Xubuntu/Kubuntu</a></li>
+<li><a class="reference internal" href="#running-on-windows">Running on Windows</a></li>
+<li><a class="reference internal" href="#security">Security</a></li>
+<li><a class="reference internal" href="#running-on-wsgi">Running on WSGI</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="introduction.html"
+                        title="previous chapter">Introduction</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="configuration.html"
+                        title="next chapter">Configuration</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/installation.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="configuration.html" title="Configuration"
+             >next</a></li>
+        <li class="right" >
+          <a href="introduction.html" title="Introduction"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/introduction.html b/docs/_build/html/introduction.html
new file mode 100644
index 0000000..153c003
--- /dev/null
+++ b/docs/_build/html/introduction.html
@@ -0,0 +1,408 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Introduction — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Installation" href="installation.html" />
+    <link rel="prev" title="pycsw 1.8.2 Documentation" href="index.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="installation.html" title="Installation"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="index.html" title="pycsw 1.8.2 Documentation"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="introduction">
+<span id="id1"></span><h1>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h1>
+<p>pycsw is an OGC CSW server implementation written in Python.</p>
+</div>
+<div class="section" id="features">
+<h1>Features<a class="headerlink" href="#features" title="Permalink to this headline">¶</a></h1>
+<ul class="simple">
+<li>certified OGC <a class="reference external" href="http://www.opengeospatial.org/resource/products/details/?pid=1104">Compliant</a> and OGC Reference Implementation</li>
+<li>harvesting support for WMS, WFS, WCS, WPS, WAF, CSW, SOS</li>
+<li>implements <a class="reference external" href="http://inspire.jrc.ec.europa.eu/documents/Network_Services/TechnicalGuidance_DiscoveryServices_v3.0.pdf">INSPIRE Discovery Services 3.0</a></li>
+<li>implements <a class="reference external" href="http://portal.opengeospatial.org/files/?artifact_id=21460">ISO Metadata Application Profile 1.0.0</a></li>
+<li>implements <a class="reference external" href="http://portal.opengeospatial.org/files/?artifact_id=16936">FGDC CSDGM Application Profile for CSW 2.0</a></li>
+<li>implements the Search/Retrieval via URL (<a class="reference external" href="http://www.loc.gov/standards/sru/">SRU</a>) search protocol</li>
+<li>implements Full Text Search capabilities</li>
+<li>implements OpenSearch</li>
+<li>supports ISO, Dublin Core, DIF, FGDC and Atom metadata models</li>
+<li>CGI or WSGI deployment</li>
+<li>simple configuration</li>
+<li>transactional capabilities (CSW-T)</li>
+<li>flexible repository configuration</li>
+<li><a class="reference external" href="http://geonode.org/">GeoNode</a> connectivity</li>
+<li><a class="reference external" href="https://github.com/azavea/Open-Data-Catalog/">Open Data Catalog</a> connectivity</li>
+<li><a class="reference external" href="http://ckan.org/">CKAN</a> connectivity</li>
+<li>federated catalogue distributed searching</li>
+<li>realtime XML Schema validation</li>
+<li>extensible profile plugin architecture</li>
+</ul>
+<div class="section" id="standards-support">
+<h2>Standards Support<a class="headerlink" href="#standards-support" title="Permalink to this headline">¶</a></h2>
+<table border="1" class="docutils">
+<colgroup>
+<col width="61%" />
+<col width="39%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Standard</th>
+<th class="head">Version(s)</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td><a class="reference external" href="http://www.opengeospatial.org/standards/cat">OGC CSW</a></td>
+<td>2.0.2</td>
+</tr>
+<tr class="row-odd"><td><a class="reference external" href="http://www.opengeospatial.org/standards/filter">OGC Filter</a></td>
+<td>1.1.0</td>
+</tr>
+<tr class="row-even"><td><a class="reference external" href="http://www.opengeospatial.org/standards/common">OGC OWS Common</a></td>
+<td>1.0.0</td>
+</tr>
+<tr class="row-odd"><td><a class="reference external" href="http://www.opengeospatial.org/standards/gml">OGC GML</a></td>
+<td>3.1.1</td>
+</tr>
+<tr class="row-even"><td><a class="reference external" href="http://www.opengeospatial.org/standards/sfs">OGC SFSQL</a></td>
+<td>1.2.1</td>
+</tr>
+<tr class="row-odd"><td><a class="reference external" href="http://www.dublincore.org/">Dublin Core</a></td>
+<td>1.1</td>
+</tr>
+<tr class="row-even"><td><a class="reference external" href="http://www.w3.org/TR/soap/">SOAP</a></td>
+<td>1.2</td>
+</tr>
+<tr class="row-odd"><td><a class="reference external" href="http://www.iso.org/iso/catalogue_detail.htm?csnumber=26020">ISO 19115</a></td>
+<td>2003</td>
+</tr>
+<tr class="row-even"><td><a class="reference external" href="http://www.iso.org/iso/catalogue_detail.htm?csnumber=32557">ISO 19139</a></td>
+<td>2007</td>
+</tr>
+<tr class="row-odd"><td><a class="reference external" href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=39890">ISO 19119</a></td>
+<td>2005</td>
+</tr>
+<tr class="row-even"><td><a class="reference external" href="http://gcmd.gsfc.nasa.gov/add/difguide/index.html">NASA DIF</a></td>
+<td>9.7</td>
+</tr>
+<tr class="row-odd"><td><a class="reference external" href="http://www.fgdc.gov/metadata/csdgm">FGDC CSDGM</a></td>
+<td>1998</td>
+</tr>
+<tr class="row-even"><td><a class="reference external" href="http://www.loc.gov/standards/sru/">SRU</a></td>
+<td>1.1</td>
+</tr>
+<tr class="row-odd"><td><a class="reference external" href="http://www.opensearch.org/Home">A9 OpenSearch</a></td>
+<td>1.1</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="supported-operations">
+<h2>Supported Operations<a class="headerlink" href="#supported-operations" title="Permalink to this headline">¶</a></h2>
+<table border="1" class="docutils">
+<colgroup>
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Request</th>
+<th class="head">Optionality</th>
+<th class="head">Supported</th>
+<th class="head">HTTP method binding(s)</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>GetCapabilities</td>
+<td>mandatory</td>
+<td>yes</td>
+<td>GET (KVP) / POST (XML) / SOAP</td>
+</tr>
+<tr class="row-odd"><td>DescribeRecord</td>
+<td>mandatory</td>
+<td>yes</td>
+<td>GET (KVP) / POST (XML) / SOAP</td>
+</tr>
+<tr class="row-even"><td>GetRecords</td>
+<td>mandatory</td>
+<td>yes</td>
+<td>GET (KVP) / POST (XML) / SOAP</td>
+</tr>
+<tr class="row-odd"><td>GetRecordById</td>
+<td>optional</td>
+<td>yes</td>
+<td>GET (KVP) / POST (XML) / SOAP</td>
+</tr>
+<tr class="row-even"><td>GetRepositoryItem</td>
+<td>optional</td>
+<td>yes</td>
+<td>GET (KVP)</td>
+</tr>
+<tr class="row-odd"><td>GetDomain</td>
+<td>optional</td>
+<td>yes</td>
+<td>GET (KVP) / POST (XML) / SOAP</td>
+</tr>
+<tr class="row-even"><td>Harvest</td>
+<td>optional</td>
+<td>yes</td>
+<td>GET (KVP) / POST (XML) / SOAP</td>
+</tr>
+<tr class="row-odd"><td>Transaction</td>
+<td>optional</td>
+<td>yes</td>
+<td>POST (XML) / SOAP</td>
+</tr>
+</tbody>
+</table>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Asynchronous processing supported for GetRecords and Harvest requests (via <tt class="docutils literal"><span class="pre">csw:ResponseHandler</span></tt>)</p>
+</div>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Supported Harvest Resource Types are listed in <a class="reference internal" href="transactions.html#transactions"><em>Transactions</em></a></p>
+</div>
+</div>
+<div class="section" id="supported-output-formats">
+<h2>Supported Output Formats<a class="headerlink" href="#supported-output-formats" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>XML (default)</li>
+<li>JSON</li>
+</ul>
+</div>
+<div class="section" id="supported-output-schemas">
+<h2>Supported Output Schemas<a class="headerlink" href="#supported-output-schemas" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>Dublin Core</li>
+<li>ISO 19139</li>
+<li>FGDC CSDGM</li>
+<li>NASA DIF</li>
+<li>Atom</li>
+</ul>
+</div>
+<div class="section" id="supported-sorting-functionality">
+<h2>Supported Sorting Functionality<a class="headerlink" href="#supported-sorting-functionality" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li>ogc:SortBy</li>
+<li>ascending or descending</li>
+<li>aspatial (queryable properties)</li>
+<li>spatial (geometric area)</li>
+</ul>
+</div>
+<div class="section" id="supported-filters">
+<h2>Supported Filters<a class="headerlink" href="#supported-filters" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="full-text">
+<h3>Full Text<a class="headerlink" href="#full-text" title="Permalink to this headline">¶</a></h3>
+<ul class="simple">
+<li>csw:AnyText</li>
+</ul>
+</div>
+<div class="section" id="geometry-operands">
+<h3>Geometry Operands<a class="headerlink" href="#geometry-operands" title="Permalink to this headline">¶</a></h3>
+<ul class="simple">
+<li>gml:Point</li>
+<li>gml:LineString</li>
+<li>gml:Polygon</li>
+<li>gml:Envelope</li>
+</ul>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Coordinate transformations are supported</p>
+</div>
+</div>
+<div class="section" id="spatial-operators">
+<h3>Spatial Operators<a class="headerlink" href="#spatial-operators" title="Permalink to this headline">¶</a></h3>
+<ul class="simple">
+<li>BBOX</li>
+<li>Beyond</li>
+<li>Contains</li>
+<li>Crosses</li>
+<li>Disjoint</li>
+<li>DWithin</li>
+<li>Equals</li>
+<li>Intersects</li>
+<li>Overlaps</li>
+<li>Touches</li>
+<li>Within</li>
+</ul>
+</div>
+<div class="section" id="logical-operators">
+<h3>Logical Operators<a class="headerlink" href="#logical-operators" title="Permalink to this headline">¶</a></h3>
+<ul class="simple">
+<li>Between</li>
+<li>EqualTo</li>
+<li>LessThanEqualTo</li>
+<li>GreaterThan</li>
+<li>Like</li>
+<li>LessThan</li>
+<li>GreaterThanEqualTo</li>
+<li>NotEqualTo</li>
+<li>NullCheck</li>
+</ul>
+</div>
+<div class="section" id="functions">
+<h3>Functions<a class="headerlink" href="#functions" title="Permalink to this headline">¶</a></h3>
+<ul class="simple">
+<li>length</li>
+<li>lower</li>
+<li>ltrim</li>
+<li>rtrim</li>
+<li>trim</li>
+<li>upper</li>
+</ul>
+</div>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Introduction</a></li>
+<li><a class="reference internal" href="#features">Features</a><ul>
+<li><a class="reference internal" href="#standards-support">Standards Support</a></li>
+<li><a class="reference internal" href="#supported-operations">Supported Operations</a></li>
+<li><a class="reference internal" href="#supported-output-formats">Supported Output Formats</a></li>
+<li><a class="reference internal" href="#supported-output-schemas">Supported Output Schemas</a></li>
+<li><a class="reference internal" href="#supported-sorting-functionality">Supported Sorting Functionality</a></li>
+<li><a class="reference internal" href="#supported-filters">Supported Filters</a><ul>
+<li><a class="reference internal" href="#full-text">Full Text</a></li>
+<li><a class="reference internal" href="#geometry-operands">Geometry Operands</a></li>
+<li><a class="reference internal" href="#spatial-operators">Spatial Operators</a></li>
+<li><a class="reference internal" href="#logical-operators">Logical Operators</a></li>
+<li><a class="reference internal" href="#functions">Functions</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="index.html"
+                        title="previous chapter">pycsw 1.8.2 Documentation</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="installation.html"
+                        title="next chapter">Installation</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/introduction.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="installation.html" title="Installation"
+             >next</a></li>
+        <li class="right" >
+          <a href="index.html" title="pycsw 1.8.2 Documentation"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/license.html b/docs/_build/html/license.html
new file mode 100644
index 0000000..82a4dab
--- /dev/null
+++ b/docs/_build/html/license.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>License — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Committers" href="committers.html" />
+    <link rel="prev" title="Contributing to pycsw" href="contributing.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="committers.html" title="Committers"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="contributing.html" title="Contributing to pycsw"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="license">
+<span id="id1"></span><h1>License<a class="headerlink" href="#license" title="Permalink to this headline">¶</a></h1>
+<p>The MIT License (MIT)</p>
+<p>Copyright (c) 2010-2013 Tom Kralidis</p>
+<p>Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the “Software”), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:</p>
+<p>The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.</p>
+<p>THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.</p>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="contributing.html"
+                        title="previous chapter">Contributing to pycsw</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="committers.html"
+                        title="next chapter">Committers</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/license.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="committers.html" title="Committers"
+             >next</a></li>
+        <li class="right" >
+          <a href="contributing.html" title="Contributing to pycsw"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/odc.html b/docs/_build/html/odc.html
new file mode 100644
index 0000000..7262419
--- /dev/null
+++ b/docs/_build/html/odc.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Open Data Catalog Configuration — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="CKAN Configuration" href="ckan.html" />
+    <link rel="prev" title="GeoNode Configuration" href="geonode.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="ckan.html" title="CKAN Configuration"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="geonode.html" title="GeoNode Configuration"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="open-data-catalog-configuration">
+<span id="odc"></span><h1>Open Data Catalog Configuration<a class="headerlink" href="#open-data-catalog-configuration" title="Permalink to this headline">¶</a></h1>
+<p>Open Data Catalog (<a class="reference external" href="https://github.com/azavea/Open-Data-Catalog/">https://github.com/azavea/Open-Data-Catalog/</a>) is an open data catalog based on Django, Python and PostgreSQL. It was originally developed for OpenDataPhilly.org, a portal that provides access to open data sets, applications, and APIs related to the Philadelphia region. The Open Data Catalog is a generalized version of the original source code with a simple skin. It is intended to d [...]
+<p>pycsw supports binding to an existing Open Data Catalog repository for metadata query.  The binding is read-only (transactions are not in scope, as Open Data Catalog manages repository metadata changes in the application proper).</p>
+<div class="section" id="open-data-catalog-setup">
+<h2>Open Data Catalog Setup<a class="headerlink" href="#open-data-catalog-setup" title="Permalink to this headline">¶</a></h2>
+<p>Open Data Catalog provides CSW functionality using pycsw out of the box (installing ODC will also install pycsw).  Settings are defined in <a class="reference external" href="https://github.com/azavea/Open-Data-Catalog/blob/master/OpenDataCatalog/settings.py#L165">https://github.com/azavea/Open-Data-Catalog/blob/master/OpenDataCatalog/settings.py#L165</a>.</p>
+<p>At this point, pycsw is able to read from the Open Data Catalog repository using the Django ORM.</p>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Open Data Catalog Configuration</a><ul>
+<li><a class="reference internal" href="#open-data-catalog-setup">Open Data Catalog Setup</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="geonode.html"
+                        title="previous chapter">GeoNode Configuration</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="ckan.html"
+                        title="next chapter">CKAN Configuration</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/odc.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="ckan.html" title="CKAN Configuration"
+             >next</a></li>
+        <li class="right" >
+          <a href="geonode.html" title="GeoNode Configuration"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/opensearch.html b/docs/_build/html/opensearch.html
new file mode 100644
index 0000000..05cd347
--- /dev/null
+++ b/docs/_build/html/opensearch.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>OpenSearch Support — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="SOAP" href="soap.html" />
+    <link rel="prev" title="Search/Retrieval via URL (SRU) Support" href="sru.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="soap.html" title="SOAP"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="sru.html" title="Search/Retrieval via URL (SRU) Support"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="opensearch-support">
+<span id="opensearch"></span><h1>OpenSearch Support<a class="headerlink" href="#opensearch-support" title="Permalink to this headline">¶</a></h1>
+<p>pycsw supports the <a class="reference external" href="http://www.opensearch.org/Home">A9 OpenSearch</a> 1.1 implementation in support of aggregated searching.</p>
+<div class="section" id="description-document">
+<h2>Description Document<a class="headerlink" href="#description-document" title="Permalink to this headline">¶</a></h2>
+<p>To generate an OpenSearch Description Document:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span><span class="nb">cd</span> /path/to/pycsw
+<span class="nv">$ </span><span class="nb">export </span><span class="nv">PYTHONPATH</span><span class="o">=</span><span class="sb">`</span><span class="nb">pwd</span><span class="sb">`</span>
+<span class="nv">$ </span>python-admin.py -c gen_opensearch_description -f default.cfg -o /path/to/opensearch.xml
+</pre></div>
+</div>
+<p>This will create the document which can then be <a class="reference external" href="http://www.opensearch.org/Specifications/OpenSearch/1.1#Autodiscovery">autodiscovered</a>.</p>
+<p>OpenSearch support is enabled by default.  HTTP requests must be specified with <tt class="docutils literal"><span class="pre">mode=opensearch</span></tt> in the base URL for OpenSearch requests, e.g.:</p>
+<div class="highlight-bash"><div class="highlight"><pre>http://localhost/pycsw/csw.py?mode<span class="o">=</span>opensearch&service<span class="o">=</span>CSW&verison<span class="o">=</span>2.0.2&request<span class="o">=</span>GetRecords&elementsetname<span class="o">=</span>brief&typenames<span class="o">=</span>csw:Record&resulttype<span class="o">=</span>results
+</pre></div>
+</div>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">OpenSearch Support</a><ul>
+<li><a class="reference internal" href="#description-document">Description Document</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="sru.html"
+                        title="previous chapter">Search/Retrieval via URL (SRU) Support</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="soap.html"
+                        title="next chapter">SOAP</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/opensearch.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="soap.html" title="SOAP"
+             >next</a></li>
+        <li class="right" >
+          <a href="sru.html" title="Search/Retrieval via URL (SRU) Support"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/outputschemas.html b/docs/_build/html/outputschemas.html
new file mode 100644
index 0000000..8985f36
--- /dev/null
+++ b/docs/_build/html/outputschemas.html
@@ -0,0 +1,191 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Output Schema Plugins — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="GeoNode Configuration" href="geonode.html" />
+    <link rel="prev" title="Profile Plugins" href="profiles.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="geonode.html" title="GeoNode Configuration"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="profiles.html" title="Profile Plugins"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="output-schema-plugins">
+<span id="outputschemas"></span><h1>Output Schema Plugins<a class="headerlink" href="#output-schema-plugins" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="overview">
+<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
+<p>pycsw allows for extending the implementation of output schemas to the core standard.  outputschemas allow for a client to request metadata in a specific format (ISO, Dublin Core, FGDC, NASA DIF and Atom are default).</p>
+<p>All outputschemas must be placed in the <tt class="docutils literal"><span class="pre">pycsw/plugins/outputschemas</span></tt> directory.</p>
+</div>
+<div class="section" id="requirements">
+<h2>Requirements<a class="headerlink" href="#requirements" title="Permalink to this headline">¶</a></h2>
+<div class="highlight-none"><div class="highlight"><pre>pycsw/
+  plugins/
+  __init__.py # empty
+  outputschemas/
+    __init__.py # __all__ is a list of all provided outputschemas
+    atom.py # default
+    dif.py # default
+    fgdc.py # default
+</pre></div>
+</div>
+</div>
+<div class="section" id="implementing-a-new-outputschema">
+<h2>Implementing a new outputschema<a class="headerlink" href="#implementing-a-new-outputschema" title="Permalink to this headline">¶</a></h2>
+<p>Create a file in <tt class="docutils literal"><span class="pre">pycsw/plugins/outputschemas</span></tt>, which defines the following:</p>
+<ul class="simple">
+<li><tt class="docutils literal"><span class="pre">NAMESPACE</span></tt>: the default namespace of the outputschema which will be advertised</li>
+<li><tt class="docutils literal"><span class="pre">NAMESPACE</span></tt>: dict of all applicable namespaces to outputschema</li>
+<li><tt class="docutils literal"><span class="pre">XPATH_MAPPINGS</span></tt>: dict of pycsw core queryables mapped to the equivalent XPath of the outputschema</li>
+<li><tt class="docutils literal"><span class="pre">write_record</span></tt>: function which returns a record as an <tt class="docutils literal"><span class="pre">lxml.etree.Element</span></tt> object</li>
+</ul>
+<p>Add the name of the file to <tt class="docutils literal"><span class="pre">__init__.py:__all__</span></tt>.  The new outputschema is now supported in pycsw.</p>
+</div>
+<div class="section" id="testing">
+<h2>Testing<a class="headerlink" href="#testing" title="Permalink to this headline">¶</a></h2>
+<p>New outputschemas must add examples to the <a class="reference internal" href="testing.html#tests"><em>Tester</em></a> interface, which must provide example requests specific to the profile.</p>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Output Schema Plugins</a><ul>
+<li><a class="reference internal" href="#overview">Overview</a></li>
+<li><a class="reference internal" href="#requirements">Requirements</a></li>
+<li><a class="reference internal" href="#implementing-a-new-outputschema">Implementing a new outputschema</a></li>
+<li><a class="reference internal" href="#testing">Testing</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="profiles.html"
+                        title="previous chapter">Profile Plugins</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="geonode.html"
+                        title="next chapter">GeoNode Configuration</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/outputschemas.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="geonode.html" title="GeoNode Configuration"
+             >next</a></li>
+        <li class="right" >
+          <a href="profiles.html" title="Profile Plugins"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/profiles.html b/docs/_build/html/profiles.html
new file mode 100644
index 0000000..35e38ff
--- /dev/null
+++ b/docs/_build/html/profiles.html
@@ -0,0 +1,315 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Profile Plugins — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Output Schema Plugins" href="outputschemas.html" />
+    <link rel="prev" title="Repository Filters" href="repofilters.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="outputschemas.html" title="Output Schema Plugins"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="repofilters.html" title="Repository Filters"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="profile-plugins">
+<span id="profiles"></span><h1>Profile Plugins<a class="headerlink" href="#profile-plugins" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="overview">
+<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
+<p>pycsw allows for the implementation of profiles to the core standard. Profiles allow specification of additional metadata format types (i.e. ISO 19139:2007, NASA DIF, INSPIRE, etc.) to the repository, which can be queried and presented to the client.  pycsw supports a plugin architecture which allows for runtime loading of Python code.</p>
+<p>All profiles must be placed in the <tt class="docutils literal"><span class="pre">pycsw/plugins/profiles</span></tt> directory.</p>
+</div>
+<div class="section" id="requirements">
+<h2>Requirements<a class="headerlink" href="#requirements" title="Permalink to this headline">¶</a></h2>
+<div class="highlight-none"><div class="highlight"><pre>pycsw/
+  plugins/
+  __init__.py # empty
+  profiles/ # directory to store profiles
+    __init__.py # empty
+    profile.py # defines abstract profile object (properties and methods) and functions to load plugins
+    apiso/ # profile directory
+      __init__.py # empty
+      apiso.py # profile code
+      ... # supporting files, etc.
+</pre></div>
+</div>
+</div>
+<div class="section" id="abstract-base-class-definition">
+<h2>Abstract Base Class Definition<a class="headerlink" href="#abstract-base-class-definition" title="Permalink to this headline">¶</a></h2>
+<p>All profile code must be instantiated as a subclass of <tt class="docutils literal"><span class="pre">profile.Profile</span></tt>.  Below is an example to add a <tt class="docutils literal"><span class="pre">Foo</span></tt> profile:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">pycsw.plugins.profiles</span> <span class="kn">import</span> <span class="n">profile</span>
+
+<span class="k">class</span> <span class="nc">FooProfile</span><span class="p">(</span><span class="n">profile</span><span class="o">.</span><span class="n">Profile</span><span class="p">):</span>
+    <span class="n">profile</span><span class="o">.</span><span class="n">Profile</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
+        <span class="n">name</span><span class="o">=</span><span class="s">'foo'</span><span class="p">,</span>
+        <span class="n">version</span><span class="o">=</span><span class="s">'1.0.3'</span><span class="p">,</span>
+        <span class="n">title</span><span class="o">=</span><span class="s">'My Foo Profile'</span><span class="p">,</span>
+        <span class="n">url</span><span class="o">=</span><span class="s">'http://example.org/fooprofile/docs'</span><span class="p">,</span>
+        <span class="n">namespace</span><span class="o">=</span><span class="s">'http://example.org/foons'</span><span class="p">,</span>
+        <span class="n">typename</span><span class="o">=</span><span class="s">'foo:RootElement'</span><span class="p">,</span>
+        <span class="n">outputschema</span><span class="o">=</span><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">example</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">foons</span><span class="s">',</span>
+        <span class="n">prefixes</span><span class="o">=</span><span class="p">[</span><span class="s">'foo'</span><span class="p">],</span>
+        <span class="n">model</span><span class="o">=</span><span class="n">model</span><span class="p">,</span>
+        <span class="n">core_namespaces</span><span class="o">=</span><span class="n">namespaces</span><span class="p">,</span>
+        <span class="n">added_namespaces</span><span class="o">=</span><span class="p">{</span><span class="s">'foo'</span><span class="p">:</span> <span class="s">'http://example.org/foons'</span><span class="p">}</span>
+        <span class="n">repository</span><span class="o">=</span><span class="n">REPOSITORY</span><span class="p">[</span><span class="s">'foo:RootElement'</span><span class="p">])</span>
+</pre></div>
+</div>
+<p>Your profile plugin class (<tt class="docutils literal"><span class="pre">FooProfile</span></tt>) must implement all methods as per <tt class="docutils literal"><span class="pre">profile.Profile</span></tt>.  Profile methods must always return <tt class="docutils literal"><span class="pre">lxml.etree.Element</span></tt> types, or <tt class="docutils literal"><span class="pre">None</span></tt>.</p>
+</div>
+<div class="section" id="enabling-profiles">
+<h2>Enabling Profiles<a class="headerlink" href="#enabling-profiles" title="Permalink to this headline">¶</a></h2>
+<p>All profiles are disabled by default.  To specify profiles at runtime, set the <tt class="docutils literal"><span class="pre">server.profiles</span></tt> value in the <a class="reference internal" href="configuration.html#configuration"><em>Configuration</em></a> to the name of the package (in the <tt class="docutils literal"><span class="pre">pycsw/plugins/profiles</span></tt> directory).  To enable multiple profiles, specify as a comma separated value (see <a class="reference intern [...]
+</div>
+<div class="section" id="testing">
+<h2>Testing<a class="headerlink" href="#testing" title="Permalink to this headline">¶</a></h2>
+<p>Profiles must add examples to the <a class="reference internal" href="testing.html#tests"><em>Tester</em></a> interface, which must provide example requests specific to the profile.</p>
+</div>
+</div>
+<div class="section" id="supported-profiles">
+<h1>Supported Profiles<a class="headerlink" href="#supported-profiles" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="iso-metadata-application-profile-1-0-0">
+<span id="apiso"></span><h2>ISO Metadata Application Profile (1.0.0)<a class="headerlink" href="#iso-metadata-application-profile-1-0-0" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="id1">
+<h3>Overview<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
+<p>The ISO Metadata Application Profile (APISO) is a profile of CSW 2.0.2 which enables discovery of geospatial metadata following ISO 19139:2007 and ISO 19119:2005/PDAM 1.</p>
+</div>
+<div class="section" id="configuration">
+<h3>Configuration<a class="headerlink" href="#configuration" title="Permalink to this headline">¶</a></h3>
+<p>No extra configuration is required.</p>
+</div>
+<div class="section" id="querying">
+<h3>Querying<a class="headerlink" href="#querying" title="Permalink to this headline">¶</a></h3>
+<blockquote>
+<div><ul class="simple">
+<li><strong>typename</strong>: <tt class="docutils literal"><span class="pre">gmd:MD_Metadata</span></tt></li>
+<li><strong>outputschema</strong>: <tt class="docutils literal"><span class="pre">http://www.isotc211.org/2005/gmd</span></tt></li>
+</ul>
+</div></blockquote>
+</div>
+<div class="section" id="enabling-apiso-support">
+<h3>Enabling APISO Support<a class="headerlink" href="#enabling-apiso-support" title="Permalink to this headline">¶</a></h3>
+<p>To enable APISO support, add <tt class="docutils literal"><span class="pre">apiso</span></tt> to <tt class="docutils literal"><span class="pre">server.profiles</span></tt> as specified in <a class="reference internal" href="configuration.html#configuration"><em>Configuration</em></a>.</p>
+</div>
+<div class="section" id="id2">
+<h3>Testing<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h3>
+<p>A testing interface is available in <tt class="docutils literal"><span class="pre">tests/index.html</span></tt> which contains tests specific to APISO to demonstrate functionality.  See <a class="reference internal" href="testing.html#tests"><em>Tester</em></a> for more information.</p>
+</div>
+</div>
+<div class="section" id="inspire-extension">
+<h2>INSPIRE Extension<a class="headerlink" href="#inspire-extension" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="id3">
+<h3>Overview<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h3>
+<p>APISO includes an extension for enabling <a class="reference external" href="http://inspire.jrc.ec.europa.eu/documents/Network_Services/TechnicalGuidance_DiscoveryServices_v3.0.pdf">INSPIRE Discovery Services 3.0</a> support.  To enable the INSPIRE extension to APISO, create a <tt class="docutils literal"><span class="pre">[metadata:inspire]</span></tt> section in the main configuration with <tt class="docutils literal"><span class="pre">enabled</span></tt> set to <tt class="docutils  [...]
+</div>
+<div class="section" id="id4">
+<h3>Configuration<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h3>
+<p><strong>[metadata:inspire]</strong></p>
+<ul class="simple">
+<li><strong>enabled</strong>: whether to enable the INSPIRE extension (<tt class="docutils literal"><span class="pre">true</span></tt> or <tt class="docutils literal"><span class="pre">false</span></tt>)</li>
+<li><strong>languages_supported</strong>: supported languages (see <a class="reference external" href="http://inspire.ec.europa.eu/schemas/common/1.0/enums/enum_eng.xsd">http://inspire.ec.europa.eu/schemas/common/1.0/enums/enum_eng.xsd</a>, simpleType <tt class="docutils literal"><span class="pre">euLanguageISO6392B</span></tt>)</li>
+<li><strong>default_language</strong>: the default language (see <a class="reference external" href="http://inspire.ec.europa.eu/schemas/common/1.0/enums/enum_eng.xsd">http://inspire.ec.europa.eu/schemas/common/1.0/enums/enum_eng.xsd</a>, simpleType <tt class="docutils literal"><span class="pre">euLanguageISO6392B</span></tt>)</li>
+<li><strong>date</strong>: date of INSPIRE metadata offering (in <a class="reference external" href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> format)</li>
+<li><strong>gemet_keywords</strong>: a comma-seperated keyword list of <a class="reference external" href="http://www.eionet.europa.eu/gemet/inspire_themes">GEMET INSPIRE theme keywords</a> about the service (see <a class="reference external" href="http://inspire.ec.europa.eu/schemas/common/1.0/enums/enum_eng.xsd">http://inspire.ec.europa.eu/schemas/common/1.0/enums/enum_eng.xsd</a>, complexType <tt class="docutils literal"><span class="pre">inspireTheme_eng</span></tt>)</li>
+<li><strong>conformity_service</strong>: the level of INSPIRE conformance for spatial data sets and services (<tt class="docutils literal"><span class="pre">conformant</span></tt>, <tt class="docutils literal"><span class="pre">notConformant</span></tt>, <tt class="docutils literal"><span class="pre">notEvaluated</span></tt>)</li>
+<li><strong>contact_organization</strong>: the organization name responsible for the INSPIRE metadata</li>
+<li><strong>contact_email</strong>: the email address of entity responsible for the INSPIRE metadata</li>
+<li><strong>temp_extent</strong>: temporal extent of the service (in <a class="reference external" href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> format).  Either a single date (i.e. <tt class="docutils literal"><span class="pre">yyyy-mm-dd</span></tt>), or an extent (i.e. <tt class="docutils literal"><span class="pre">yyyy-mm-dd/yyyy-mm-dd</span></tt>)</li>
+</ul>
+</div>
+</div>
+<div class="section" id="csw-ebrim-registry-service-part-1-ebrim-profile-of-csw">
+<span id="ebrim"></span><h2>CSW-ebRIM Registry Service - Part 1: ebRIM profile of CSW<a class="headerlink" href="#csw-ebrim-registry-service-part-1-ebrim-profile-of-csw" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="id5">
+<h3>Overview<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h3>
+<p>The CSW-ebRIM Registry Service is a profile of CSW 2.0.2 which enables discovery of geospatial metadata following the ebXML information model.</p>
+</div>
+<div class="section" id="id6">
+<h3>Configuration<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h3>
+<p>No extra configuration is required.</p>
+</div>
+<div class="section" id="id7">
+<h3>Querying<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h3>
+<blockquote>
+<div><ul class="simple">
+<li><strong>typename</strong>: <tt class="docutils literal"><span class="pre">rim:RegistryObject</span></tt></li>
+<li><strong>outputschema</strong>: <tt class="docutils literal"><span class="pre">urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0</span></tt></li>
+</ul>
+</div></blockquote>
+</div>
+<div class="section" id="enabling-ebrim-support">
+<h3>Enabling ebRIM Support<a class="headerlink" href="#enabling-ebrim-support" title="Permalink to this headline">¶</a></h3>
+<p>To enable ebRIM support, add <tt class="docutils literal"><span class="pre">ebrim</span></tt> to <tt class="docutils literal"><span class="pre">server.profiles</span></tt> as specified in <a class="reference internal" href="configuration.html#configuration"><em>Configuration</em></a>.</p>
+</div>
+<div class="section" id="id8">
+<h3>Testing<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h3>
+<p>A testing interface is available in <tt class="docutils literal"><span class="pre">tests/index.html</span></tt> which contains tests specific to ebRIM to demonstrate functionality.  See <a class="reference internal" href="testing.html#tests"><em>Tester</em></a> for more information.</p>
+</div>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Profile Plugins</a><ul>
+<li><a class="reference internal" href="#overview">Overview</a></li>
+<li><a class="reference internal" href="#requirements">Requirements</a></li>
+<li><a class="reference internal" href="#abstract-base-class-definition">Abstract Base Class Definition</a></li>
+<li><a class="reference internal" href="#enabling-profiles">Enabling Profiles</a></li>
+<li><a class="reference internal" href="#testing">Testing</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#supported-profiles">Supported Profiles</a><ul>
+<li><a class="reference internal" href="#iso-metadata-application-profile-1-0-0">ISO Metadata Application Profile (1.0.0)</a><ul>
+<li><a class="reference internal" href="#id1">Overview</a></li>
+<li><a class="reference internal" href="#configuration">Configuration</a></li>
+<li><a class="reference internal" href="#querying">Querying</a></li>
+<li><a class="reference internal" href="#enabling-apiso-support">Enabling APISO Support</a></li>
+<li><a class="reference internal" href="#id2">Testing</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#inspire-extension">INSPIRE Extension</a><ul>
+<li><a class="reference internal" href="#id3">Overview</a></li>
+<li><a class="reference internal" href="#id4">Configuration</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#csw-ebrim-registry-service-part-1-ebrim-profile-of-csw">CSW-ebRIM Registry Service - Part 1: ebRIM profile of CSW</a><ul>
+<li><a class="reference internal" href="#id5">Overview</a></li>
+<li><a class="reference internal" href="#id6">Configuration</a></li>
+<li><a class="reference internal" href="#id7">Querying</a></li>
+<li><a class="reference internal" href="#enabling-ebrim-support">Enabling ebRIM Support</a></li>
+<li><a class="reference internal" href="#id8">Testing</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="repofilters.html"
+                        title="previous chapter">Repository Filters</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="outputschemas.html"
+                        title="next chapter">Output Schema Plugins</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/profiles.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="outputschemas.html" title="Output Schema Plugins"
+             >next</a></li>
+        <li class="right" >
+          <a href="repofilters.html" title="Repository Filters"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/repofilters.html b/docs/_build/html/repofilters.html
new file mode 100644
index 0000000..389ff15
--- /dev/null
+++ b/docs/_build/html/repofilters.html
@@ -0,0 +1,304 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Repository Filters — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Profile Plugins" href="profiles.html" />
+    <link rel="prev" title="Transactions" href="transactions.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="profiles.html" title="Profile Plugins"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="transactions.html" title="Transactions"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="repository-filters">
+<span id="repofilters"></span><h1>Repository Filters<a class="headerlink" href="#repository-filters" title="Permalink to this headline">¶</a></h1>
+<p>pycsw has the ability to perform server side repository / database filters as a means to mask all CSW requests to query against a specific subset of the metadata repository, thus providing the ability to deploy multiple pycsw instances pointing to the same database in different ways via the <tt class="docutils literal"><span class="pre">repository.filter</span></tt> configuration option.</p>
+<p>Repository filters are a convenient way to subset your repository at the server level without the hassle of creating proper database views.  For large repositories, it may be better to subset at the database level for performance.</p>
+<div class="section" id="scenario-one-database-many-views">
+<h2>Scenario: One Database, Many Views<a class="headerlink" href="#scenario-one-database-many-views" title="Permalink to this headline">¶</a></h2>
+<p>Imagine a sample database table of records (subset below for brevity):</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">identifier</th>
+<th class="head">parentidentifier</th>
+<th class="head">title</th>
+<th class="head">abstract</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>1</td>
+<td>33</td>
+<td>foo1</td>
+<td>bar1</td>
+</tr>
+<tr class="row-odd"><td>2</td>
+<td>33</td>
+<td>foo2</td>
+<td>bar2</td>
+</tr>
+<tr class="row-even"><td>3</td>
+<td>55</td>
+<td>foo3</td>
+<td>bar3</td>
+</tr>
+<tr class="row-odd"><td>4</td>
+<td>55</td>
+<td>foo1</td>
+<td>bar1</td>
+</tr>
+<tr class="row-even"><td>5</td>
+<td>21</td>
+<td>foo5</td>
+<td>bar5</td>
+</tr>
+<tr class="row-odd"><td>5</td>
+<td>21</td>
+<td>foo6</td>
+<td>bar6</td>
+</tr>
+</tbody>
+</table>
+<p>A default pycsw instance (with no <tt class="docutils literal"><span class="pre">repository.filters</span></tt> option) will always process CSW requests against the entire table.  So a CSW <cite>GetRecords</cite> filter like:</p>
+<div class="highlight-xml"><div class="highlight"><pre><span class="nt"><ogc:Filter></span>
+    <span class="nt"><ogc:PropertyIsEqualTo></span>
+        <span class="nt"><ogc:PropertyName></span>apiso:Title<span class="nt"></ogc:PropertyName></span>
+        <span class="nt"><ogc:Literal></span>foo1<span class="nt"></ogc:Literal></span>
+    <span class="nt"></ogc:PropertyIsEqualTo></span>
+<span class="nt"></ogc:Filter></span>
+</pre></div>
+</div>
+<p>...will return:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">identifier</th>
+<th class="head">parentidentifier</th>
+<th class="head">title</th>
+<th class="head">abstract</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>1</td>
+<td>33</td>
+<td>foo1</td>
+<td>bar1</td>
+</tr>
+<tr class="row-odd"><td>4</td>
+<td>55</td>
+<td>foo1</td>
+<td>bar1</td>
+</tr>
+</tbody>
+</table>
+<p>Suppose you wanted to deploy another pycsw instance which serves metadata from the same database, but only from a specific subset.  Here we set the <tt class="docutils literal"><span class="pre">repository.filter</span></tt> option:</p>
+<div class="highlight-text"><div class="highlight"><pre>[repository]
+database=sqlite:///records.db
+filter=pycsw:ParentIdentifier = '33'
+</pre></div>
+</div>
+<p>The same CSW <cite>GetRecords</cite> filter as per above then yields the following results:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">identifier</th>
+<th class="head">parentidentifier</th>
+<th class="head">title</th>
+<th class="head">abstract</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>1</td>
+<td>33</td>
+<td>foo1</td>
+<td>bar1</td>
+</tr>
+</tbody>
+</table>
+<p>Another example:</p>
+<div class="highlight-text"><div class="highlight"><pre>[repository]
+database=sqlite:///records.db
+filter=pycsw:ParentIdentifier != '33'
+</pre></div>
+</div>
+<p>The same CSW <cite>GetRecords</cite> filter as per above then yields the following results:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">identifier</th>
+<th class="head">parentidentifier</th>
+<th class="head">title</th>
+<th class="head">abstract</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>4</td>
+<td>55</td>
+<td>foo1</td>
+<td>bar1</td>
+</tr>
+</tbody>
+</table>
+<p>The <tt class="docutils literal"><span class="pre">repository.filter</span></tt> option accepts all core queryables set in the pycsw core model (see <tt class="docutils literal"><span class="pre">pycsw.config.StaticContext.md_core_model</span></tt> for the complete list).</p>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Repository Filters</a><ul>
+<li><a class="reference internal" href="#scenario-one-database-many-views">Scenario: One Database, Many Views</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="transactions.html"
+                        title="previous chapter">Transactions</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="profiles.html"
+                        title="next chapter">Profile Plugins</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/repofilters.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="profiles.html" title="Profile Plugins"
+             >next</a></li>
+        <li class="right" >
+          <a href="transactions.html" title="Transactions"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html
new file mode 100644
index 0000000..b5a0bb9
--- /dev/null
+++ b/docs/_build/html/search.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Search — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <script type="text/javascript" src="_static/searchtools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+  <script type="text/javascript">
+    jQuery(function() { Search.loadIndex("searchindex.js"); });
+  </script>
+  
+  <script type="text/javascript" id="searchindexloader"></script>
+  
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <h1 id="search-documentation">Search</h1>
+  <div id="fallback" class="admonition warning">
+  <script type="text/javascript">$('#fallback').hide();</script>
+  <p>
+    Please activate JavaScript to enable the search
+    functionality.
+  </p>
+  </div>
+  <p>
+    From here you can search these documents. Enter your search
+    words into the box below and click "search". Note that the search
+    function will automatically search for all of the words. Pages
+    containing fewer words won't appear in the result list.
+  </p>
+  <form action="" method="get">
+    <input type="text" name="q" value="" />
+    <input type="submit" value="search" />
+    <span id="search-progress" style="padding-left: 10px"></span>
+  </form>
+  
+  <div id="search-results">
+  
+  </div>
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper"><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/sitemaps.html b/docs/_build/html/sitemaps.html
new file mode 100644
index 0000000..04ab49d
--- /dev/null
+++ b/docs/_build/html/sitemaps.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>XML Sitemaps — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Transactions" href="transactions.html" />
+    <link rel="prev" title="SOAP" href="soap.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="transactions.html" title="Transactions"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="soap.html" title="SOAP"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="xml-sitemaps">
+<span id="sitemaps"></span><h1>XML Sitemaps<a class="headerlink" href="#xml-sitemaps" title="Permalink to this headline">¶</a></h1>
+<p><a class="reference external" href="http://www.sitemaps.org/">XML Sitemaps</a> can be generated by running:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>pycsw-admin.py -c gen_sitemap -f default.cfg -o sitemap.xml
+</pre></div>
+</div>
+<p>The <tt class="docutils literal"><span class="pre">sitemap.xml</span></tt> file should be saved to an an area on your web server (parallel to or above your pycsw install location) to enable web crawlers to index your repository.</p>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="soap.html"
+                        title="previous chapter">SOAP</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="transactions.html"
+                        title="next chapter">Transactions</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/sitemaps.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="transactions.html" title="Transactions"
+             >next</a></li>
+        <li class="right" >
+          <a href="soap.html" title="SOAP"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/soap.html b/docs/_build/html/soap.html
new file mode 100644
index 0000000..060abe6
--- /dev/null
+++ b/docs/_build/html/soap.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>SOAP — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="XML Sitemaps" href="sitemaps.html" />
+    <link rel="prev" title="OpenSearch Support" href="opensearch.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="sitemaps.html" title="XML Sitemaps"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="opensearch.html" title="OpenSearch Support"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="soap">
+<span id="id1"></span><h1>SOAP<a class="headerlink" href="#soap" title="Permalink to this headline">¶</a></h1>
+<p>pycsw supports handling of SOAP encoded requests and responses as per subclause 10.3.2 of OGC:CSW 2.0.2.  SOAP request examples can be found in <tt class="docutils literal"><span class="pre">tests/index.html</span></tt>.</p>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="opensearch.html"
+                        title="previous chapter">OpenSearch Support</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="sitemaps.html"
+                        title="next chapter">XML Sitemaps</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/soap.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="sitemaps.html" title="XML Sitemaps"
+             >next</a></li>
+        <li class="right" >
+          <a href="opensearch.html" title="OpenSearch Support"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/sru.html b/docs/_build/html/sru.html
new file mode 100644
index 0000000..c53df8c
--- /dev/null
+++ b/docs/_build/html/sru.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Search/Retrieval via URL (SRU) Support — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="OpenSearch Support" href="opensearch.html" />
+    <link rel="prev" title="Distributed Searching" href="distributedsearching.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="opensearch.html" title="OpenSearch Support"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="distributedsearching.html" title="Distributed Searching"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="search-retrieval-via-url-sru-support">
+<span id="sru"></span><h1>Search/Retrieval via URL (SRU) Support<a class="headerlink" href="#search-retrieval-via-url-sru-support" title="Permalink to this headline">¶</a></h1>
+<p>pycsw supports the <a class="reference external" href="http://www.loc.gov/standards/sru/">Search/Retrieval via URL</a> search protocol implementation as per subclause 8.4 of the OpenGIS Catalogue Service Implementation Specification.</p>
+<p>SRU support is enabled by default.  HTTP GET requests must be specified with <tt class="docutils literal"><span class="pre">mode=sru</span></tt> for SRU requests, e.g.:</p>
+<div class="highlight-bash"><div class="highlight"><pre>http://localhost/pycsw/csw.py?mode<span class="o">=</span>sru&operation<span class="o">=</span>searchRetrieve&query<span class="o">=</span>foo
+</pre></div>
+</div>
+<p>See <a class="reference external" href="http://www.loc.gov/standards/sru/simple.html">http://www.loc.gov/standards/sru/simple.html</a> for example SRU requests.</p>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="distributedsearching.html"
+                        title="previous chapter">Distributed Searching</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="opensearch.html"
+                        title="next chapter">OpenSearch Support</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/sru.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="opensearch.html" title="OpenSearch Support"
+             >next</a></li>
+        <li class="right" >
+          <a href="distributedsearching.html" title="Distributed Searching"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/support.html b/docs/_build/html/support.html
new file mode 100644
index 0000000..bd59157
--- /dev/null
+++ b/docs/_build/html/support.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Support — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Contributing to pycsw" href="contributing.html" />
+    <link rel="prev" title="Cataloguing and Metadata Tools" href="tools.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="contributing.html" title="Contributing to pycsw"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="tools.html" title="Cataloguing and Metadata Tools"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="support">
+<span id="id1"></span><h1>Support<a class="headerlink" href="#support" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="community">
+<h2>Community<a class="headerlink" href="#community" title="Permalink to this headline">¶</a></h2>
+<p>Please see the <a class="reference external" href="/community.html">Community</a> page for information on the pycsw community, getting support, and how to get involved.</p>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Support</a><ul>
+<li><a class="reference internal" href="#community">Community</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="tools.html"
+                        title="previous chapter">Cataloguing and Metadata Tools</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="contributing.html"
+                        title="next chapter">Contributing to pycsw</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/support.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="contributing.html" title="Contributing to pycsw"
+             >next</a></li>
+        <li class="right" >
+          <a href="tools.html" title="Cataloguing and Metadata Tools"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/testing.html b/docs/_build/html/testing.html
new file mode 100644
index 0000000..05af511
--- /dev/null
+++ b/docs/_build/html/testing.html
@@ -0,0 +1,237 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Testing — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Cataloguing and Metadata Tools" href="tools.html" />
+    <link rel="prev" title="CKAN Configuration" href="ckan.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="tools.html" title="Cataloguing and Metadata Tools"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="ckan.html" title="CKAN Configuration"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="testing">
+<span id="id1"></span><h1>Testing<a class="headerlink" href="#testing" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="ogc-cite">
+<span id="id2"></span><h2>OGC CITE<a class="headerlink" href="#ogc-cite" title="Permalink to this headline">¶</a></h2>
+<p>Compliance benchmarking is done via the OGC <a class="reference external" href="http://cite.opengeospatial.org/">Compliance & Interoperability Testing & Evaluation Initiative</a>.  The pycsw <a class="reference external" href="https://github.com/geopython/pycsw/wiki/OGC-CITE-Compliance">wiki</a> documents testing procedures and status.</p>
+</div>
+<div class="section" id="tester">
+<span id="tests"></span><h2>Tester<a class="headerlink" href="#tester" title="Permalink to this headline">¶</a></h2>
+<p>The pycsw tests framework (in <tt class="docutils literal"><span class="pre">tests</span></tt>) is a collection of testsuites to perform automated regession testing of the codebase.  Test are run against all pushes to the GitHub repository via <a class="reference external" href="http://travis-ci.org/geopython/pycsw">Travis CI</a>.</p>
+<div class="section" id="running-locally">
+<h3>Running Locally<a class="headerlink" href="#running-locally" title="Permalink to this headline">¶</a></h3>
+<p>The tests framework can be run from <tt class="docutils literal"><span class="pre">tests</span></tt> using <a class="reference external" href="http://paver.github.io/paver/">Paver</a> (see <tt class="docutils literal"><span class="pre">pavement.py</span></tt>) tasks for convenience:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span><span class="nb">cd</span> /path/to/pycsw
+<span class="c"># run all tests (starts up http://localhost:8000)</span>
+<span class="nv">$ </span>paver <span class="nb">test</span>
+<span class="c"># run tests only against specific testsuites</span>
+<span class="nv">$ </span>paver <span class="nb">test</span> -s apiso,fgdc
+<span class="c"># run all tests, including harvesting (this is turned off by default given the volatility of remote services/data testing)</span>
+<span class="nv">$ </span>paver <span class="nb">test</span> -r
+</pre></div>
+</div>
+<p>The tests perform HTTP GET and POST requests against <tt class="docutils literal"><span class="pre">http://localhost:8000</span></tt>.  The expected output for each test can be found in <tt class="docutils literal"><span class="pre">expected</span></tt>.  Results are categorized as <tt class="docutils literal"><span class="pre">passed</span></tt>, <tt class="docutils literal"><span class="pre">failed</span></tt>, or <tt class="docutils literal"><span class="pre">initialized</span></tt [...]
+</div>
+<div class="section" id="failed-tests">
+<h3>Failed Tests<a class="headerlink" href="#failed-tests" title="Permalink to this headline">¶</a></h3>
+<p>If a given test has failed, the output is saved in <tt class="docutils literal"><span class="pre">results</span></tt>.  The resulting failure can be analyzed by running <tt class="docutils literal"><span class="pre">diff</span> <span class="pre">tests/expected/name_of_test.xml</span> <span class="pre">tests/results/name_of_test.xml</span></tt> to find variances.  The Paver task returns a status code which indicates the number of tests which have failed (i.e. <tt class="docutils litera [...]
+</div>
+<div class="section" id="test-suites">
+<h3>Test Suites<a class="headerlink" href="#test-suites" title="Permalink to this headline">¶</a></h3>
+<p>The tests framework is run against a series of ‘suites’ (in <tt class="docutils literal"><span class="pre">tests/suites</span></tt>), each of which specifies a given configuration to test various functionality of the codebase.  Each suite is structured as follows:</p>
+<ul class="simple">
+<li><tt class="docutils literal"><span class="pre">tests/suites/suite/default.cfg</span></tt>: the configuration for the suite</li>
+<li><tt class="docutils literal"><span class="pre">tests/suites/suite/post</span></tt>: directory of XML documents for HTTP POST requests</li>
+<li><tt class="docutils literal"><span class="pre">tests/suites/suite/get/requests.txt</span></tt>: directory and text file of KVP for HTTP GET requests</li>
+<li><tt class="docutils literal"><span class="pre">tests/suites/suite/data</span></tt>: directory of sample XML data required for the test suite.  Database and test data are setup/loaded automatically as part of testing</li>
+</ul>
+<p>When the tests are invoked, the following operations are run:</p>
+<ul class="simple">
+<li>pycsw configuration is set to <tt class="docutils literal"><span class="pre">tests/suites/suite/default.cfg</span></tt></li>
+<li>HTTP POST requests are run against <tt class="docutils literal"><span class="pre">tests/suites/suite/post/*.xml</span></tt></li>
+<li>HTTP GET requests are run against each request in <tt class="docutils literal"><span class="pre">tests/suites/suite/get/requests.txt</span></tt></li>
+</ul>
+<p>The CSV format of <tt class="docutils literal"><span class="pre">tests/suites/suite/get/requests.txt</span></tt> is <tt class="docutils literal"><span class="pre">testname,request</span></tt>, with one line for each test.  The <tt class="docutils literal"><span class="pre">testname</span></tt> value is a unique test name (this value sets the name of the output file in the test results).  The <tt class="docutils literal"><span class="pre">request</span></tt> value is the HTTP GET reque [...]
+</div>
+<div class="section" id="adding-new-tests">
+<h3>Adding New Tests<a class="headerlink" href="#adding-new-tests" title="Permalink to this headline">¶</a></h3>
+<p>To add tests to an existing suite:</p>
+<ul class="simple">
+<li>for HTTP POST tests, add XML documents to <tt class="docutils literal"><span class="pre">tests/suites/suite/post</span></tt></li>
+<li>for HTTP GET tests, add tests (one per line) to <tt class="docutils literal"><span class="pre">tests/suites/suite/get/requests.txt</span></tt></li>
+<li>run <tt class="docutils literal"><span class="pre">paver</span> <span class="pre">test</span></tt></li>
+</ul>
+<p>To add a new test suite:</p>
+<ul class="simple">
+<li>create a new directory under <tt class="docutils literal"><span class="pre">tests/suites</span></tt> (e.g. <tt class="docutils literal"><span class="pre">foo</span></tt>)</li>
+<li>create a new configuration in <tt class="docutils literal"><span class="pre">tests/suites/foo/default.cfg</span></tt><ul>
+<li>Ensure that all file paths are relative to <tt class="docutils literal"><span class="pre">path/to/pycsw</span></tt></li>
+<li>Ensure that <tt class="docutils literal"><span class="pre">repository.database</span></tt> points to an SQLite3 database called <tt class="docutils literal"><span class="pre">tests/suites/foo/data/records.db</span></tt>.  The database <em>must</em> be called <tt class="docutils literal"><span class="pre">records.db</span></tt> and the directory <tt class="docutils literal"><span class="pre">tests/suites/foo/data</span></tt> <em>must</em> exist</li>
+</ul>
+</li>
+<li>populate HTTP POST requests in <tt class="docutils literal"><span class="pre">tests/suites/foo/post</span></tt></li>
+<li>populate HTTP GET requests in <tt class="docutils literal"><span class="pre">tests/suites/foo/get/requests.txt</span></tt></li>
+<li>if the testsuite requires test data, create <tt class="docutils literal"><span class="pre">tests/suites/foo/data</span></tt> are store XML file there</li>
+<li>run <tt class="docutils literal"><span class="pre">paver</span> <span class="pre">test</span></tt> (or <tt class="docutils literal"><span class="pre">paver</span> <span class="pre">test</span> <span class="pre">-s</span> <span class="pre">foo</span></tt> to test only the new test suite)</li>
+</ul>
+<p>The new test suite database will be created automatically and used as part of tests.</p>
+</div>
+<div class="section" id="web-testing">
+<h3>Web Testing<a class="headerlink" href="#web-testing" title="Permalink to this headline">¶</a></h3>
+<p>You can also use the pycsw tests via your web browser to perform sample requests against your pycsw install.  The tests are is located in <tt class="docutils literal"><span class="pre">tests/</span></tt>.  To generate the HTML page:</p>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>paver gen_tests_html
+</pre></div>
+</div>
+<p>Then navigate to <tt class="docutils literal"><span class="pre">http://host/path/to/pycsw/tests/index.html</span></tt>.</p>
+</div>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Testing</a><ul>
+<li><a class="reference internal" href="#ogc-cite">OGC CITE</a></li>
+<li><a class="reference internal" href="#tester">Tester</a><ul>
+<li><a class="reference internal" href="#running-locally">Running Locally</a></li>
+<li><a class="reference internal" href="#failed-tests">Failed Tests</a></li>
+<li><a class="reference internal" href="#test-suites">Test Suites</a></li>
+<li><a class="reference internal" href="#adding-new-tests">Adding New Tests</a></li>
+<li><a class="reference internal" href="#web-testing">Web Testing</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="ckan.html"
+                        title="previous chapter">CKAN Configuration</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="tools.html"
+                        title="next chapter">Cataloguing and Metadata Tools</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/testing.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="tools.html" title="Cataloguing and Metadata Tools"
+             >next</a></li>
+        <li class="right" >
+          <a href="ckan.html" title="CKAN Configuration"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/tools.html b/docs/_build/html/tools.html
new file mode 100644
index 0000000..1fb6e11
--- /dev/null
+++ b/docs/_build/html/tools.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Cataloguing and Metadata Tools — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Support" href="support.html" />
+    <link rel="prev" title="Testing" href="testing.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="support.html" title="Support"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="testing.html" title="Testing"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="cataloguing-and-metadata-tools">
+<span id="tools"></span><h1>Cataloguing and Metadata Tools<a class="headerlink" href="#cataloguing-and-metadata-tools" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="csw-clients">
+<h2>CSW Clients<a class="headerlink" href="#csw-clients" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li><a class="reference external" href="http://sourceforge.net/apps/mediawiki/geoportal/index.php?title=Geoportal_CSW_Clients">Geoportal CSW Clients</a></li>
+<li><a class="reference external" href="http://geopython.github.io/OWSLib">OWSLib</a></li>
+<li><a class="reference external" href="http://geopython.github.io/qgcsw">qgcsw</a> (<a class="reference external" href="http://qgis.org/">QGIS</a> plugin)</li>
+</ul>
+</div>
+<div class="section" id="csw-servers">
+<h2>CSW Servers<a class="headerlink" href="#csw-servers" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li><a class="reference external" href="http://deegree.org/">deegree</a></li>
+<li><a class="reference external" href="http://gdsc.nlr.nl/gdsc/en/tools/excat">eXcat</a></li>
+<li><a class="reference external" href="http://geonetwork-opensource.org/">GeoNetwork opensource</a></li>
+</ul>
+</div>
+<div class="section" id="metadata-editing-tools">
+<h2>Metadata Editing Tools<a class="headerlink" href="#metadata-editing-tools" title="Permalink to this headline">¶</a></h2>
+<ul class="simple">
+<li><a class="reference external" href="http://catmdedit.sourceforge.net/">CatMDEdit</a></li>
+<li><a class="reference external" href="https://joinup.ec.europa.eu/software/euosme/description">EUOSME</a></li>
+<li><a class="reference external" href="http://sourceforge.net/projects/gimed/">GIMED</a></li>
+<li><a class="reference external" href="http://hub.qgis.org/projects/metatools">Metatools</a> (<a class="reference external" href="http://qgis.org/">QGIS</a> plugin)</li>
+</ul>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Cataloguing and Metadata Tools</a><ul>
+<li><a class="reference internal" href="#csw-clients">CSW Clients</a></li>
+<li><a class="reference internal" href="#csw-servers">CSW Servers</a></li>
+<li><a class="reference internal" href="#metadata-editing-tools">Metadata Editing Tools</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="testing.html"
+                        title="previous chapter">Testing</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="support.html"
+                        title="next chapter">Support</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/tools.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="support.html" title="Support"
+             >next</a></li>
+        <li class="right" >
+          <a href="testing.html" title="Testing"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_build/html/transactions.html b/docs/_build/html/transactions.html
new file mode 100644
index 0000000..24b14b7
--- /dev/null
+++ b/docs/_build/html/transactions.html
@@ -0,0 +1,282 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Transactions — pycsw 1.8.2 documentation</title>
+    
+    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.8.2',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="shortcut icon" href="_static/favicon.ico"/>
+    <link rel="top" title="pycsw 1.8.2 documentation" href="index.html" />
+    <link rel="next" title="Repository Filters" href="repofilters.html" />
+    <link rel="prev" title="XML Sitemaps" href="sitemaps.html" />
+ 
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+
+  </head>
+  <body>
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="repofilters.html" title="Repository Filters"
+             accesskey="N">next</a></li>
+        <li class="right" >
+          <a href="sitemaps.html" title="XML Sitemaps"
+             accesskey="P">previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+  
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body">
+            
+  <div class="section" id="transactions">
+<span id="id1"></span><h1>Transactions<a class="headerlink" href="#transactions" title="Permalink to this headline">¶</a></h1>
+<p>pycsw has the ability to process CSW Harvest and Transaction requests (CSW-T).  Transactions are disabled by default; to enable, <tt class="docutils literal"><span class="pre">manager.transactions</span></tt> must be set to <tt class="docutils literal"><span class="pre">true</span></tt>.  Access to transactional functionality is limited to IP addresses which must be set in <tt class="docutils literal"><span class="pre">manager.allowed_ips</span></tt>.</p>
+<div class="section" id="supported-resource-types">
+<h2>Supported Resource Types<a class="headerlink" href="#supported-resource-types" title="Permalink to this headline">¶</a></h2>
+<p>For transactions and harvesting, pycsw supports the following metadata resource types by default:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+<col width="25%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Resource Type</th>
+<th class="head">Namespace</th>
+<th class="head">Transaction</th>
+<th class="head">Harvest</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>Dublin Core</td>
+<td><tt class="docutils literal"><span class="pre">http://www.opengis.net/cat/csw/2.0.2</span></tt></td>
+<td>yes</td>
+<td>yes</td>
+</tr>
+<tr class="row-odd"><td>FGDC</td>
+<td><tt class="docutils literal"><span class="pre">http://www.opengis.net/cat/csw/csdgm</span></tt></td>
+<td>yes</td>
+<td>yes</td>
+</tr>
+<tr class="row-even"><td>ISO 19139</td>
+<td><tt class="docutils literal"><span class="pre">http://www.isotc211.org/2005/gmd</span></tt></td>
+<td>yes</td>
+<td>yes</td>
+</tr>
+<tr class="row-odd"><td>ISO GMI</td>
+<td><tt class="docutils literal"><span class="pre">http://www.isotc211.org/2005/gmi</span></tt></td>
+<td>yes</td>
+<td>yes</td>
+</tr>
+<tr class="row-even"><td>OGC:CSW 2.0.2</td>
+<td><tt class="docutils literal"><span class="pre">http://www.opengis.net/cat/csw/2.0.2</span></tt></td>
+<td> </td>
+<td>yes</td>
+</tr>
+<tr class="row-odd"><td>OGC:WMS 1.1.1</td>
+<td><tt class="docutils literal"><span class="pre">http://www.opengis.net/wms</span></tt></td>
+<td> </td>
+<td>yes</td>
+</tr>
+<tr class="row-even"><td>OGC:WFS 1.1.0</td>
+<td><tt class="docutils literal"><span class="pre">http://www.opengis.net/wfs</span></tt></td>
+<td> </td>
+<td>yes</td>
+</tr>
+<tr class="row-odd"><td>OGC:WCS 1.0.0</td>
+<td><tt class="docutils literal"><span class="pre">http://www.opengis.net/wcs</span></tt></td>
+<td> </td>
+<td>yes</td>
+</tr>
+<tr class="row-even"><td>OGC:WPS 1.0.0</td>
+<td><tt class="docutils literal"><span class="pre">http://www.opengis.net/wps/1.0.0</span></tt></td>
+<td> </td>
+<td>yes</td>
+</tr>
+<tr class="row-odd"><td>OGC:SOS 1.0.0</td>
+<td><tt class="docutils literal"><span class="pre">http://www.opengis.net/sos/1.0</span></tt></td>
+<td> </td>
+<td>yes</td>
+</tr>
+<tr class="row-even"><td>OGC:SOS 2.0.0</td>
+<td><tt class="docutils literal"><span class="pre">http://www.opengis.net/sos/2.0</span></tt></td>
+<td> </td>
+<td>yes</td>
+</tr>
+<tr class="row-odd"><td><a class="reference external" href="http://seabass.ieee.org/groups/geoss/index.php?option=com_sir_200&Itemid=157&ID=183">WAF</a></td>
+<td><tt class="docutils literal"><span class="pre">urn:geoss:urn</span></tt></td>
+<td> </td>
+<td>yes</td>
+</tr>
+</tbody>
+</table>
+<p>Additional metadata models are supported by enabling the appropriate <a class="reference internal" href="profiles.html#profiles"><em>Profile Plugins</em></a>.</p>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">For transactions to be functional when using SQLite3, the SQLite3 database file (<strong>and its parent directory</strong>) must be fully writable.  For example:</p>
+</div>
+<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>mkdir /path/data
+<span class="nv">$ </span>chmod 777 /path/data
+<span class="nv">$ </span>chmod 666 test.db
+<span class="nv">$ </span>mv test.db /path/data
+</pre></div>
+</div>
+<p>For CSW-T deployments, it is strongly advised that this directory reside in an area that is not accessible by HTTP.</p>
+</div>
+<div class="section" id="harvesting">
+<h2>Harvesting<a class="headerlink" href="#harvesting" title="Permalink to this headline">¶</a></h2>
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">Your server must be able to make outgoing HTTP requests for this functionality.</p>
+</div>
+<p>pycsw supports the CSW-T <tt class="docutils literal"><span class="pre">Harvest</span></tt> operation.  Records which are harvested require to setup a cronjob to periodically refresh records in the local repository.  A sample cronjob is available in <tt class="docutils literal"><span class="pre">etc/harvest-all.cron</span></tt> which points to <tt class="docutils literal"><span class="pre">pycsw-admin.py</span></tt> (you must specify the correct path to your configuration).  Harvest o [...]
+<div class="admonition note">
+<p class="first admonition-title">Note</p>
+<p class="last">For <tt class="docutils literal"><span class="pre">csw:ResponseHandler</span></tt> values using the <tt class="docutils literal"><span class="pre">mailto:</span></tt> protocol, you must have <tt class="docutils literal"><span class="pre">server.smtp_host</span></tt> set in your <a class="reference internal" href="configuration.html#configuration"><em>configuration</em></a>.</p>
+</div>
+<div class="section" id="ogc-web-services">
+<h3>OGC Web Services<a class="headerlink" href="#ogc-web-services" title="Permalink to this headline">¶</a></h3>
+<p>When harvesting OGC web services, requests can provide the base URL of the service as part of the Harvest request.  pycsw will construct a <tt class="docutils literal"><span class="pre">GetCapabilities</span></tt> request dynamically.</p>
+<p>When harvesting other CSW servers, pycsw pages through the entire CSW in default increments of 10.  This value can be modified via the <tt class="docutils literal"><span class="pre">manager.csw_harvest_pagesize</span></tt> <a class="reference internal" href="configuration.html#configuration"><em>configuration</em></a> option.  It is strongly advised to use the <tt class="docutils literal"><span class="pre">csw:ResponseHandler</span></tt> parameter for harvesting large CSW catalogues t [...]
+</div>
+</div>
+<div class="section" id="id2">
+<h2>Transactions<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2>
+<p>pycsw supports 3 modes of the <tt class="docutils literal"><span class="pre">Transaction</span></tt> operation (<tt class="docutils literal"><span class="pre">Insert</span></tt>, <tt class="docutils literal"><span class="pre">Update</span></tt>, <tt class="docutils literal"><span class="pre">Delete</span></tt>):</p>
+<ul class="simple">
+<li><strong>Insert</strong>: full XML documents can be inserted as per CSW-T</li>
+<li><strong>Update</strong>: updates can be made as full record updates or record properties against a <tt class="docutils literal"><span class="pre">csw:Constraint</span></tt></li>
+<li><strong>Delete</strong>: deletes can be made against a <tt class="docutils literal"><span class="pre">csw:Constraint</span></tt></li>
+</ul>
+<p>Transaction operation results can be sent by email (via <tt class="docutils literal"><span class="pre">mailto:</span></tt>) or ftp (via <tt class="docutils literal"><span class="pre">ftp://</span></tt>) if the Transaction request specifies <tt class="docutils literal"><span class="pre">csw:ResponseHandler</span></tt>.</p>
+<p>The <a class="reference internal" href="testing.html#tests"><em>Tester</em></a> contain CSW-T request examples.</p>
+</div>
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="sphinxsidebar">
+        <div class="sphinxsidebarwrapper">
+  <h3><a href="index.html">Table Of Contents</a></h3>
+  <ul>
+<li><a class="reference internal" href="#">Transactions</a><ul>
+<li><a class="reference internal" href="#supported-resource-types">Supported Resource Types</a></li>
+<li><a class="reference internal" href="#harvesting">Harvesting</a><ul>
+<li><a class="reference internal" href="#ogc-web-services">OGC Web Services</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#id2">Transactions</a></li>
+</ul>
+</li>
+</ul>
+
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="sitemaps.html"
+                        title="previous chapter">XML Sitemaps</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="repofilters.html"
+                        title="next chapter">Repository Filters</a></p>
+  <h3>This Page</h3>
+  <ul class="this-page-menu">
+    <li><a href="_sources/transactions.txt"
+           rel="nofollow">Show Source</a></li>
+  </ul><p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
+<div id="searchbox" style="display: none">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="repofilters.html" title="Repository Filters"
+             >next</a></li>
+        <li class="right" >
+          <a href="sitemaps.html" title="XML Sitemaps"
+             >previous</a> |</li>
+        <li><a href="index.html">pycsw 1.8.2 documentation</a> »</li> 
+      </ul>
+    </div>
+    <div class="footer">
+        © Copyright 2010-2013, Tom Kralidis.
+      Last updated on 2014-05-28T19:55:04Z.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico
new file mode 100644
index 0000000..fec0b7f
Binary files /dev/null and b/docs/_static/favicon.ico differ
diff --git a/docs/_templates/indexsidebar.html b/docs/_templates/indexsidebar.html
new file mode 100644
index 0000000..8e0b210
--- /dev/null
+++ b/docs/_templates/indexsidebar.html
@@ -0,0 +1,15 @@
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</p>
+
+<p>
+    <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="http://www.opengeospatial.org/resource/products/details/?pid=1104"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Servi [...]
+</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>
+</p>
+
+<p>
+    <script type="text/javascript" src="http://www.ohloh.net/p/488022/widgets/project_thin_badge.js"></script> 
+</p>
diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html
new file mode 100644
index 0000000..09e8dec
--- /dev/null
+++ b/docs/_templates/layout.html
@@ -0,0 +1,32 @@
+{% extends "!layout.html" %}
+
+{%- block extrahead %}
+{{ super() }}
+
+<script type="text/javascript">
+
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-32855587-1']);
+  _gaq.push(['_setDomainName', 'pycsw.org']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+
+</script>
+
+{% endblock %}
+
+{% block relbar1 %}
+
+<style type="text/css">
+  .header a:link{color: white;}
+  .header a:visited{color: white;}
+  .padded{padding: 10px 10px;}
+</style>
+
+{{ super() }}
+{% endblock %}
diff --git a/docs/administration.rst b/docs/administration.rst
new file mode 100644
index 0000000..3ea9591
--- /dev/null
+++ b/docs/administration.rst
@@ -0,0 +1,173 @@
+.. _administration:
+
+Administration
+==============
+
+pycsw administration is handled by the ``pycsw-admin.py`` utility.  ``pycsw-admin.py``
+is installed as part of the pycsw install process and should be available in your
+PATH.
+
+.. note::
+  Run ``pycsw-admin.py -h`` to see all administration operations and parameters
+
+Metadata Repository Setup
+-------------------------
+
+pycsw supports the following databases:
+
+- SQLite3
+- PostgreSQL
+- PostgreSQL with PostGIS enabled
+- MySQL
+
+.. note::
+  The easiest and fastest way to deploy pycsw is to use SQLite3 as the backend.
+
+.. note::
+  PostgreSQL support includes support for PostGIS functions if enabled
+
+.. note::
+  If PostGIS (1.x or 2.x) is activated before setting up the pycsw/PostgreSQL database, then native PostGIS geometries will be enabled.
+
+To expose your geospatial metadata via pycsw, perform the following actions:
+
+- setup the database
+- import metadata
+- publish the repository
+
+Supported Information Models
+----------------------------
+
+By default, pycsw supports the ``csw:Record`` information model.
+
+.. note::
+  See :ref:`profiles` for information on enabling profiles
+
+Setting up the Database
+-----------------------
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c setup_db -f default.cfg
+
+This will create the necessary tables and values for the repository.
+
+The database created is an `OGC SFSQL`_ compliant database, and can be used with any implementing software.  For example, to use with `OGR`_:
+
+.. code-block:: bash
+
+  $ ogrinfo /path/to/records.db
+  INFO: Open of 'records.db'
+  using driver 'SQLite' successful.
+  1: records (Polygon)
+  $ ogrinfo -al /path/to/records.db
+  # lots of output
+
+.. note::
+  If PostGIS is detected, the pycsw-admin.py script does not create the SFSQL tables as they are already in the database.
+
+
+Loading Records
+----------------
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c load_records -f default.cfg -p /path/to/records
+
+This will import all ``*.xml`` records from ``/path/to/records`` into the database specified in ``default.cfg`` (``repository.database``).  Passing ``-r`` to the script will process ``/path/to/records`` recursively.
+
+.. note::
+  Records can also be imported using CSW-T (see :ref:`transactions`).
+
+Exporting the Repository
+------------------------
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c export_records -f default.cfg -p /path/to/output_dir
+
+This will write each record in the database specified in ``default.cfg`` (``repository.database``) to an XML document on disk, in directory ``/path/to/output_dir``.
+
+Optimizing the Database
+-----------------------
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c optimize_db -f default.cfg
+
+.. note::
+  This feature is relevant only for PostgreSQL and MySQL
+
+Database Specific Notes
+-----------------------
+
+PostgreSQL
+^^^^^^^^^^
+
+- if PostGIS is not enabled, pycsw makes uses of PL/Python functions.  To enable PostgreSQL support, the database user must be able to create functions within the database. In case of recent PostgreSQL versions (9.x), the PL/Python extension must be enabled prior to pycsw setup
+- `PostgreSQL Full Text Search`_ is supported for ``csw:AnyText`` based queries.  pycsw creates a tsvector column based on the text from anytext column. Then pycsw creates a GIN index against the anytext_tsvector column.  This is created automatically in ``pycsw.admin.setup_db``.  Any query against `csw:AnyText` or `apiso:AnyText` will process using PostgreSQL FTS handling
+
+PostGIS
+^^^^^^^
+
+- pycsw makes use of PostGIS spatial functions and native geometry data type.
+- It is advised to install the PostGIS extension before setting up the pycsw database
+- If PostGIS is detected, the pycsw-admin.py script will create both a native geometry column and a WKT column, as well as a trigger to keep both synchronized. 
+- In case PostGIS gets disabled, pycsw will continue to work with the `WKT`_ column
+- In case of migration from plain PostgreSQL database to PostGIS, the spatial functions of PostGIS will be used automatically
+- When migrating from plain PostgreSQL database to PostGIS, in order to enable native geometry support, a "GEOMETRY" column named "wkb_geometry" needs to be created manually (along with the update trigger in ``pycsw.admin.setup_db``). Also the native geometries must be filled manually from the `WKT`_ field. Next versions of pycsw will automate this process
+
+.. _custom_repository:
+
+Mapping to an Existing Repository
+---------------------------------
+
+pycsw supports publishing metadata from an existing repository.  To enable this functionality, the default database mappings must be modified to represent the existing database columns mapping to the abstract core model (the default mappings are in ``pycsw/config.py:MD_CORE_MODEL``).
+
+To override the default settings:
+
+- define a custom database mapping based on ``etc/mappings.py``
+- in ``default.cfg``, set ``repository.mappings`` to the location of the mappings.py file:
+
+.. code-block:: none
+
+  [repository]
+  ...
+  mappings=path/to/mappings.py
+
+See the :ref:`geonode` and :ref:`odc` for further examples.
+
+Existing Repository Requirements
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+pycsw requires certain repository attributes and semantics to exist in any repository to operate as follows:
+
+- ``pycsw:Identifier``: unique identifier
+- ``pycsw:Typename``: typename for the metadata; typically the value of the root element tag (e.g. ``csw:Record``, ``gmd:MD_Metadata``)
+- ``pycsw:Schema``: schema for the metadata; typically the target namespace (e.g. ``http://www.opengis.net/cat/csw/2.0.2``, ``http://www.isotc211.org/2005/gmd``)
+- ``pycsw:InsertDate``: date of insertion
+- ``pycsw:XML``: full XML representation
+- ``pycsw:AnyText``: bag of XML element text values, used for full text search.  Realized with the following design pattern:
+
+  - capture all XML element and attribute values
+  - store in repository
+- ``pycsw:BoundingBox``: string of `WKT`_ or `EWKT`_ geometry
+
+The following repository semantics exist if the attributes are specified:
+
+- ``pycsw:Keywords``: comma delimited list of keywords
+- ``pycsw:Links``: structure of links in the format "name,description,protocol,url[^,,,[^,,,]]"
+
+Values of mappings can be derived from the following mechanisms:
+
+- text fields
+- Python datetime.datetime or datetime.date objects
+- Python functions 
+
+Further information is provided in ``pycsw/config.py:MD_CORE_MODEL``.
+
+.. _`OGR`: http://www.gdal.org/ogr
+.. _`OGC SFSQL`: http://www.opengeospatial.org/standards/sfs
+.. _`WKT`: http://en.wikipedia.org/wiki/Well-known_text
+.. _`EWKT`: http://en.wikipedia.org/wiki/Well-known_text#Variations
+.. _`PostgreSQL Full Text Search`: http://www.postgresql.org/docs/9.2/static/textsearch.html
diff --git a/docs/ckan.rst b/docs/ckan.rst
new file mode 100644
index 0000000..40a083f
--- /dev/null
+++ b/docs/ckan.rst
@@ -0,0 +1,16 @@
+.. _ckan:
+
+CKAN Configuration
+==================
+
+CKAN (http://ckan.org) is a powerful data management system that makes data accessible – by providing tools to streamline publishing, sharing, finding and using data. CKAN is aimed at data publishers (national and regional governments, companies and organizations) wanting to make their data open and available.
+
+`ckanext-spatial`_ is CKAN's geospatial extension.  The extension adds a spatial field to the default CKAN dataset schema, using PostGIS as the backend. This allows to perform spatial queries and display the dataset extent on the frontend. It also provides harvesters to import geospatial metadata into CKAN from other sources, as well as commands to support the CSW standard. Finally, it also includes plugins to preview spatial formats such as GeoJSON.
+
+CKAN Setup
+----------
+
+Installation and configuration Instructions are provided as part of the ckanext-spatial `documentation`_.
+
+.. _`ckanext-spatial`: https://github.com/okfn/ckanext-spatial
+.. _`documentation`: http://docs.ckan.org/projects/ckanext-spatial/en/latest/csw.html
diff --git a/docs/committers.rst b/docs/committers.rst
new file mode 100644
index 0000000..ca189f3
--- /dev/null
+++ b/docs/committers.rst
@@ -0,0 +1,6 @@
+.. _committers:
+
+Committers
+==========
+
+.. include:: ../COMMITTERS.txt
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000..4fd8e48
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,294 @@
+# -*- coding: utf-8 -*-
+#
+# pycsw documentation build configuration file, created by
+# sphinx-quickstart on Fri Aug  2 19:48:50 2013.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'pycsw'
+authors = u'Tom Kralidis'
+copyright = u'2010-2013, ' + 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
+# built documents.
+#
+# The short X.Y version.
+version = open('../VERSION.txt').read().strip()
+# The full version, including alpha/beta/rc tags.
+release = version
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%Y-%m-%d'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+show_authors = True
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+html_theme_options = {
+    'sidebarbgcolor': '#356aa0',
+    'sidebarlinkcolor': '#ffffff',
+    'relbarlinkcolor': '#ffffff',
+    'footerbgcolor': '#356aa0'
+}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = 'Documentation'
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+html_favicon = 'favicon.ico'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%Y-%m-%dT%H:%M:%SZ'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+html_sidebars = {
+    #'index':'indexsidebar.html',
+    '**':'indexsidebar.html',
+}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+html_use_index = False
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'pycswdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'pycsw.tex', u'pycsw Documentation',
+   authors, 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'pycsw', u'pycsw Documentation',
+     [authors], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output ------------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+  ('index', 'pycsw', u'pycsw Documentation',
+   authors, 'pycsw', 'One line description of project.',
+   'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+
+# -- Options for Epub output ---------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = u'pycsw'
+epub_author = authors
+epub_publisher = authors
+epub_copyright = copyright
+
+# The language of the text. It defaults to the language option
+# or en if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# A tuple containing the cover image and cover page html template filenames.
+#epub_cover = ()
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files shat should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+#epub_exclude_files = []
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
diff --git a/docs/configuration.rst b/docs/configuration.rst
new file mode 100644
index 0000000..c69a434
--- /dev/null
+++ b/docs/configuration.rst
@@ -0,0 +1,112 @@
+.. _configuration:
+
+Configuration
+=============
+
+pycsw's runtime configuration is defined by ``default.cfg``.  pycsw ships with a sample configuration (``default-sample.cfg``).  Copy the file to ``default.cfg`` and edit the following: 
+
+**[server]**
+
+- **home**: the full filesystem path to pycsw
+- **url**: the URL of the resulting service
+- **mimetype**: the MIME type when returning HTTP responses
+- **language**: the ISO 639-1 language and ISO 3166-1 alpha2 country code of the service (e.g. ``en-CA``, ``fr-CA``, ``en-US``)
+- **encoding**: the content type encoding (e.g. ``ISO-8859-1``)
+- **maxrecords**: the maximum number of records to return by default
+- **loglevel**: the logging level (see http://docs.python.org/library/logging.html#logging-levels)
+- **logfile**: the full file path to the logfile
+- **ogc_schemas_base**: base URL of OGC XML schemas tree file structure (default is http://schemas.opengis.net)
+- **federatedcatalogues**: comma delimited list of CSW endpoints to be used for distributed searching, if requested by the client (see :ref:`distributedsearching`)
+- **pretty_print**: whether to pretty print the output (``true`` or ``false``).  Default is ``false``
+- **gzip_compresslevel**: gzip compression level, lowest is ``1``, highest is ``9``.  Default is off
+- **domainquerytype**: for GetDomain operations, how to output domain values.  Accepted values are ``list`` and ``range`` (min/max). Default is ``list``
+- **domaincounts**: for GetDomain operations, whether to provide frequency counts for values.  Accepted values are ``true`` and ``False``. Default is ``false``
+- **profiles**: comma delimited list of profiles to load at runtime (default is none).  See :ref:`profiles`
+- **smtp_host**: SMTP host for processing ``csw:ResponseHandler`` parameter via outgoing email requests (default is ``localhost``)
+- **spatial_ranking**: parameter that enables (``true`` or ``false``) ranking of spatial query results as per `K.J. Lanfear 2006 - A Spatial Overlay Ranking Method for a Geospatial Search of Text Objects  <http://pubs.usgs.gov/of/2006/1279/2006-1279.pdf>`_.
+
+**[manager]**
+
+- **transactions**: whether to enable transactions (``true`` or ``false``).  Default is ``false`` (see :ref:`transactions`)
+- **allowed_ips**: comma delimited list of IP addresses (e.g. 192.168.0.103), wildcards (e.g. 192.168.0.*) or CIDR notations (e.g. 192.168.100.0/24) allowed to perform transactions (see :ref:`transactions`)
+- **csw_harvest_pagesize**: when harvesting other CSW servers, the number of records per request to page by (default is 10)
+
+**[metadata:main]**
+
+- **identification_title**: the title of the service
+- **identification_abstract**: some descriptive text about the service
+- **identification_keywords**: comma delimited list of keywords about the service
+- **identification_keywords_type**: keyword type as per the `ISO 19115 MD_KeywordTypeCode codelist <http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode>`_).  Accepted values are ``discipline``, ``temporal``, ``place``, ``theme``, ``stratum``
+- **identification_fees**: fees associated with the service
+- **identification_accessconstraints**: access constraints associated with the service
+- **provider_name**: the name of the service provider
+- **provider_url**: the URL of the service provider
+- **contact_name**: the name of the provider contact
+- **contact_position**: the position title of the provider contact
+- **contact_address**: the address of the provider contact
+- **contact_city**: the city of the provider contact
+- **contact_stateorprovince**: the province or territory of the provider contact
+- **contact_postalcode**: the postal code of the provider contact
+- **contact_country**: the country of the provider contact
+- **contact_phone**: the phone number of the provider contact
+- **contact_fax**: the facsimile number of the provider contact
+- **contact_email**: the email address of the provider contact
+- **contact_url**: the URL to more information about the provider contact
+- **contact_hours**: the hours of service to contact the provider
+- **contact_instructions**: the how to contact the provider contact
+- **contact_role**: the role of the provider contact as per the `ISO 19115 CI_RoleCode codelist <http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode>`_).  Accepted values are ``author``, ``processor``, ``publisher``, ``custodian``, ``pointOfContact``, ``distributor``, ``user``, ``resourceProvider``, ``originator``, ``owner``, ``principalInvestigator``
+
+**[repository]**
+
+- **database**: the full file path to the metadata database, in database URL format (see http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls)
+- **table**: the table name for metadata records (default is ``records``).  If you are using PostgreSQL with a DB schema other than ``public``, qualify the table like ``myschema.table``
+- **mappings**: custom repository mappings (see :ref:`custom_repository`)
+- **source**: the source of this repository only if not local (e.g. :ref:`geonode`, :ref:`odc`).  Supported values are ``geonode``, ``odc``
+- **filter**: server side database filter to apply as mask to all CSW requests (see :ref:`repofilters`)
+
+.. note::
+
+  See :ref:`administration` for connecting your metadata repository and supported information models.
+
+.. _alternate-configurations:
+
+Alternate Configurations
+------------------------
+
+By default, pycsw loads ``default.cfg`` at runtime.  To load an alternate configuration, modify ``csw.py`` to point to the desired configuration.  Alternatively, pycsw supports explicitly specifiying a configuration by appending ``config=/path/to/default.cfg`` to the base URL of the service (e.g. ``http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities``).  When the ``config`` parameter is passed by a CSW client, pycsw will [...]
+
+This also provides the functionality to deploy numerous CSW servers with a single pycsw installation.
+
+Hiding the Location
+^^^^^^^^^^^^^^^^^^^
+
+Some deployments with alternate configurations prefer not to advertise the base URL with the ``config=`` approach.  In this case, there are many options to advertise the base URL.
+
+Environment Variables
+~~~~~~~~~~~~~~~~~~~~~
+
+One option is using Apache's ``Alias`` and ``SetEnvIf`` directives.  For example, given the base URL ``http://localhost/pycsw/csw.py?config=foo.cfg``, set the following in Apache's ``httpd.conf``:
+
+.. code-block:: none
+
+  Alias /pycsw/csw-foo.py /var/www/pycsw/csw.py
+  SetEnvIf Request_URI "/pycsw/csw-foo.py" PYCSW_CONFIG=/var/www/pycsw/csw-foo.cfg
+
+.. note::
+
+  Apache must be restarted after changes to ``httpd.conf``
+
+pycsw will use the configuration as set in the ``PYCSW_CONFIG`` environment variable in the same manner as if it was specified in the base URL.  Note that the configuration value ``server.url`` value must match the ``Request_URI`` value so as to advertise correctly in pycsw's Capabilities XML.
+
+Wrapper Script
+~~~~~~~~~~~~~~
+
+Another option is to write a simple wrapper (e.g. ``csw-foo.sh``), which provides the same functionality and can be deployed without restarting Apache:
+
+.. code-block:: bash
+
+  #!/bin/sh
+
+  export PYCSW_CONFIG=/var/www/pycsw/csw-foo.cfg
+
+  /var/www/pycsw/csw.py
diff --git a/docs/contributing.rst b/docs/contributing.rst
new file mode 100644
index 0000000..4628182
--- /dev/null
+++ b/docs/contributing.rst
@@ -0,0 +1,3 @@
+.. _contributing:
+
+.. include:: ../CONTRIBUTING.rst
diff --git a/docs/distributedsearching.rst b/docs/distributedsearching.rst
new file mode 100644
index 0000000..eece5b2
--- /dev/null
+++ b/docs/distributedsearching.rst
@@ -0,0 +1,77 @@
+.. _distributedsearching:
+
+Distributed Searching
+=====================
+
+.. note::
+
+   Your server must be able to make outgoing HTTP requests for this functionality.
+
+pycsw has the ability to perform distributed searching against other CSW servers.  Distributed searching is disabled by default; to enable, ``server.federatedcatalogues`` must be set.  A CSW client must issue a GetRecords request with ``csw:DistributedSearch`` specified, along with an optional ``hopCount`` attribute (see subclause 10.8.4.13 of the CSW specification).  When enabled, pycsw will search all specified catalogues and return a unified set of search results to the client.  Due t [...]
+
+Scenario: Federated Search
+--------------------------
+
+pycsw deployment with 3 configurations (CSW-1, CSW-2, CSW-3), subsequently providing three (3) endpoints.  Each endpoint is based on an opaque metadata repository (based on theme/place/discipline, etc.).  Goal is to perform a single search against all endpoints.
+ 
+pycsw realizes this functionality by supporting :ref:`alternate configurations <alternate-configurations>`, and exposes the additional CSW endpoint(s) with the following design pattern:
+ 
+CSW-1: ``http://localhost/pycsw/csw.py?config=CSW-1.cfg``
+ 
+CSW-2: ``http://localhost/pycsw/csw.py?config=CSW-2.cfg``
+ 
+CSW-3: ``http://localhost/pycsw/csw.py?config=CSW-3.cfg``
+ 
+...where the ``*.cfg`` configuration files are configured for each respective metadata repository.  The above CSW endpoints can be interacted with as usual.
+ 
+To federate the discovery of the three (3) portals into a unified search, pycsw realizes this functionality by deploying an additional configuration which acts as the superset of CSW-1, CSW-2, CSW-3:
+
+CSW-all: ``http://localhost/pycsw/csw.py?config=CSW-all.cfg``
+
+This allows the client to invoke one (1) CSW GetRecords request, in which the CSW endpoint spawns the same GetRecords request to 1..n distributed CSW endpoints.  Distributed CSW endpoints are advertised in CSW Capabilities XML via ``ows:Constraint``:
+
+.. code-block:: xml
+
+  <ows:OperationsMetadata>
+  ... 
+      <ows:Constraint name="FederatedCatalogues">
+          <ows:Value>http://localhost/pycsw/csw.py?config=CSW-1.cfg</ows:Value>
+          <ows:Value>http://localhost/pycsw/csw.py?config=CSW-2.cfg</ows:Value>
+          <ows:Value>http://localhost/pycsw/csw.py?config=CSW-3.cfg</ows:Value>
+      </ows:Constraint>
+  ...
+  </ows:OperationsMetadata>
+
+...which advertises which CSW endpoint(s) the CSW server will spawn if a distributed search is requested by the client.
+ 
+in the CSW-all configuration:
+
+.. code-block:: none 
+
+  [server]
+  ...
+  federatedcatalogues=http://localhost/pycsw/csw.py?config=CSW-1.cfg,http://localhost/pycsw/csw.py?config=CSW-2.cfg,http://localhost/pycsw/csw.py?config=CSW-3.cfg
+ 
+At which point a CSW client request to CSW-all with ``distributedsearch=TRUE``, while specifying an optional ``hopCount``.  Query network topology:
+
+.. code-block:: none 
+
+          AnyClient
+              ^
+              |
+              v
+           CSW-all
+              ^ 
+              |
+              v
+       /-------------\
+       ^      ^      ^
+       |      |      |
+       v      v      v
+     CSW-1  CSW-2  CSW-3
+ 
+As a result, a pycsw deployment in this scenario may be approached on a per 'theme' basis, or at an aggregate level.
+ 
+All interaction in this scenario is local to the pycsw installation, so network performance would not be problematic.
+ 
+A very important facet of distributed search is as per Annex B of OGC:CSW 2.0.2.  Given that all the CSW endpoints are managed locally, duplicates and infinite looping are not deemed to present an issue.
diff --git a/docs/geonode.rst b/docs/geonode.rst
new file mode 100644
index 0000000..55c6645
--- /dev/null
+++ b/docs/geonode.rst
@@ -0,0 +1,15 @@
+.. _geonode:
+
+GeoNode Configuration
+======================
+
+GeoNode (http://geonode.org/) is a platform for the management and publication of geospatial data. It brings together mature and stable open-source software projects under a consistent and easy-to-use interface allowing users, with little training, to quickly and easily share data and create interactive maps. GeoNode provides a cost-effective and scalable tool for developing information management systems.  GeoNode uses CSW as a cataloguing mechanism to query and present geospatial metadata.
+
+pycsw supports binding to an existing GeoNode repository for metadata query.  The binding is read-only (transactions are not in scope, as GeoNode manages repository metadata changes in the application proper).
+
+GeoNode Setup
+-------------
+
+pycsw is enabled and configured by default in GeoNode, so there are no additional steps required once GeoNode is setup.  See the ``CATALOGUE`` and ``PYCSW`` `settings.py entries`_ at http://docs.geonode.org/en/latest/developers/reference/django-apps.html#id1 for customizing pycsw within GeoNode.
+
+.. _`settings.py entries`: http://docs.geonode.org/en/latest/developers/reference/django-apps.html#id1
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000..0ec3ea0
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,36 @@
+.. _index:
+
+=============================
+pycsw |release| Documentation
+=============================
+
+:Author: Tom Kralidis
+:Contact: tomkralidis at gmail.com
+:Release: |release|
+:Date: |today|
+
+.. toctree::
+   :maxdepth: 2
+
+   introduction
+   installation
+   configuration
+   administration
+   distributedsearching
+   sru
+   opensearch
+   soap
+   sitemaps
+   transactions
+   repofilters
+   profiles
+   outputschemas
+   geonode
+   odc
+   ckan
+   testing
+   tools
+   support
+   contributing
+   license
+   committers
diff --git a/docs/installation.rst b/docs/installation.rst
new file mode 100644
index 0000000..acec200
--- /dev/null
+++ b/docs/installation.rst
@@ -0,0 +1,197 @@
+.. _installation:
+
+Installation
+============
+
+System Requirements
+-------------------
+
+pycsw is written in `Python <http://python.org>`_, and works with (tested) version 2.6 and 2.7
+
+pycsw requires the following Python supporting libraries:
+
+- `lxml`_ for XML support
+- `SQLAlchemy`_ for database bindings
+- `pyproj`_ for coordinate transformations
+- `Shapely`_ for spatial query / geometry support
+- `OWSLib`_ for CSW client and metadata parser
+
+.. note::
+
+  You can install these dependencies via `easy_install`_ or `pip`_
+
+.. note::
+
+  For :ref:`GeoNode <geonode>` or :ref:`Open Data Catalog <odc>` deployments, SQLAlchemy is not required
+
+Installing from Source
+----------------------
+
+`Download </download.html>`_ the latest stable version or fetch from Git.
+
+For Developers and the Truly Impatient
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The 4 minute install:
+
+.. code-block:: bash
+
+  $ virtualenv pycsw && cd pycsw && . bin/activate
+  $ git clone https://github.com/geopython/pycsw.git && cd pycsw
+  $ pip install -e . && pip install -r requirements-standalone.txt
+  $ cp default-sample.cfg default.cfg
+  $ vi default.cfg
+  # adjust paths in
+  # - server.home
+  # - repository.database
+  # set server.url to http://localhost:8000/
+  $ python csw.wsgi
+  $ curl http://localhost:8000/?service=CSW&version=2.0.2&request=GetCapabilities
+
+
+The Quick and Dirty Way
+^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code-block:: bash
+
+  $ git clone git://github.com/geopython/pycsw.git
+
+Ensure that CGI is enabled for the install directory.  For example, on Apache, if pycsw is installed in ``/srv/www/htdocs/pycsw`` (where the URL will be ``http://host/pycsw/csw.py``), add the following to ``httpd.conf``:
+
+.. code-block:: none
+
+  <Location /pycsw/>
+   Options FollowSymLinks +ExecCGI
+   Allow from all
+   AddHandler cgi-script .py
+  </Location>
+
+.. note::
+  If pycsw is installed in ``cgi-bin``, this should work as expected.  In this case, the :ref:`tests <tests>` application must be moved to a different location to serve static HTML documents.
+
+Make shure, you have all the dependences from ``requirements.txt and requirements-standalone.txt``
+
+The Clean and Proper Way
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code-block:: bash
+
+  $ git clone git://github.com/geopython/pycsw.git
+  $ python setup.py build
+  $ python setup.py install
+
+At this point, pycsw is installed as a library and requires a CGI ``csw.py`` or WSGI ``csw.wsgi`` script to be served into your web server environment (see below for WSGI configuration/deployment).
+
+.. _pypi:
+
+Installing from the Python Package Index (PyPi)
+-----------------------------------------------
+
+.. code-block:: bash
+
+  # easy_install or pip will do the trick
+  $ easy_install pycsw
+  # or
+  $ pip install pycsw
+
+.. _opensuse:
+
+Installing from OpenSUSE Build Service
+--------------------------------------
+
+In order to install the OBS package in openSUSE 12.3, one can run the following commands as user ``root``:
+
+.. code-block:: bash
+
+  # zypper -ar http://download.opensuse.org/repositories/Application:/Geo/openSUSE_12.3/ GEO
+  # zypper -ar http://download.opensuse.org/repositories/devel:/languages:/python/openSUSE_12.3/ python
+  # zypper refresh
+  # zypper install python-pycsw pycsw-cgi
+
+For earlier openSUSE versions change ``12.3`` with ``12.2``. For future openSUSE version use ``Factory``.
+
+An alternative method is to use the `One-Click Installer <http://software.opensuse.org/search?q=pycsw&baseproject=openSUSE%3A12.3&lang=en&include_home=true&exclude_debug=true>`_.
+
+.. _ubuntu:
+
+Installing on Ubuntu/Xubuntu/Kubuntu
+------------------------------------
+
+In order to install pycsw to an Ubuntu based distribution, one can run the following commands:
+
+.. code-block:: bash
+
+  # sudo add-apt-repository ppa:pycsw/stable
+  # sudo apt-get update
+  # sudo apt-get install python-pycsw pycsw-cgi
+
+An alternative method is to use the OSGeoLive installation script located in ``pycsw/etc/dist/osgeolive``:
+
+.. code-block:: bash
+
+  # cd pycsw/etc/dist
+  # sudo ./install_pycsw.sh
+
+The script installs the dependencies (Apache, lxml, sqlalchemy, shapely, pyproj) and then pycsw to ``/var/www``. 
+  
+Running on Windows
+------------------
+
+For Windows installs, change the first line of ``csw.py`` to:
+
+.. code-block:: python
+
+  #!/Python27/python -u
+
+.. note::
+  The use of ``-u`` is required to properly output gzip-compressed responses.
+
+Security
+--------
+
+By default, ``default.cfg`` is at the root of the pycsw install.  If pycsw is setup outside an HTTP server's ``cgi-bin`` area, this file could be read.  The following options protect the configuration:
+
+- move ``default.cfg`` to a non HTTP accessible area, and modify ``csw.py`` to point to the updated location
+- configure web server to deny access to the configuration.  For example, in Apache, add the following to ``httpd.conf``:
+
+.. code-block:: none
+
+  <Files ~ "\.(cfg)$">
+   order allow,deny
+   deny from all
+  </Files>
+
+
+Running on WSGI
+---------------
+
+pycsw supports the `Web Server Gateway Interface`_ (WSGI).  To run pycsw in WSGI mode, use ``csw.wsgi`` in your WSGI server environment.  Below is an example of configuring with Apache:
+
+.. code-block:: none
+
+  WSGIDaemonProcess host1 home=/var/www/pycsw processes=2
+  WSGIProcessGroup host1
+  WSGIScriptAlias /pycsw-wsgi /var/www/pycsw/csw.wsgi
+  <Directory /var/www/pycsw>
+    Order deny,allow
+    Allow from all
+  </Directory>
+
+or use the `WSGI reference implementation`_:
+
+.. code-block:: bash
+
+  $ python ./csw.wsgi
+  Serving on port 8000...
+
+which will publish pycsw to ``http://localhost:8000/``
+
+.. _`lxml`: http://lxml.de/
+.. _`SQLAlchemy`: http://www.sqlalchemy.org/
+.. _`Shapely`: http://toblerity.github.io/shapely/
+.. _`pyproj`: http://code.google.com/p/pyproj/
+.. _`OWSLib`: https://github.com/geopython/OWSLib
+.. _`easy_install`: http://packages.python.org/distribute/easy_install.html
+.. _`pip`: http://www.pip-installer.org
+.. _`Web Server Gateway Interface`: http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface
+.. _`WSGI reference implementation`: http://docs.python.org/library/wsgiref.html
diff --git a/docs/introduction.rst b/docs/introduction.rst
new file mode 100644
index 0000000..df07d52
--- /dev/null
+++ b/docs/introduction.rst
@@ -0,0 +1,190 @@
+.. _introduction:
+
+Introduction
+============
+
+pycsw is an OGC CSW server implementation written in Python.
+
+Features
+========
+
+- certified OGC `Compliant`_ and OGC Reference Implementation
+- harvesting support for WMS, WFS, WCS, WPS, WAF, CSW, SOS
+- implements `INSPIRE Discovery Services 3.0`_
+- implements `ISO Metadata Application Profile 1.0.0`_
+- implements `FGDC CSDGM Application Profile for CSW 2.0`_
+- implements the Search/Retrieval via URL (`SRU`_) search protocol
+- implements Full Text Search capabilities
+- implements OpenSearch
+- supports ISO, Dublin Core, DIF, FGDC and Atom metadata models
+- CGI or WSGI deployment
+- simple configuration
+- transactional capabilities (CSW-T)
+- flexible repository configuration
+- `GeoNode`_ connectivity
+- `Open Data Catalog`_ connectivity
+- `CKAN`_ connectivity
+- federated catalogue distributed searching
+- realtime XML Schema validation
+- extensible profile plugin architecture
+
+Standards Support
+-----------------
+
++-------------------+------------+
+| Standard          | Version(s) |
++===================+============+
+| `OGC CSW`_        | 2.0.2      |
++-------------------+------------+
+| `OGC Filter`_     | 1.1.0      |
++-------------------+------------+
+| `OGC OWS Common`_ | 1.0.0      |
++-------------------+------------+
+| `OGC GML`_        | 3.1.1      |
++-------------------+------------+
+| `OGC SFSQL`_      | 1.2.1      |
++-------------------+------------+
+| `Dublin Core`_    | 1.1        |
++-------------------+------------+
+| `SOAP`_           | 1.2        |
++-------------------+------------+
+| `ISO 19115`_      | 2003       |
++-------------------+------------+
+| `ISO 19139`_      | 2007       |
++-------------------+------------+
+| `ISO 19119`_      | 2005       |
++-------------------+------------+
+| `NASA DIF`_       | 9.7        | 
++-------------------+------------+
+| `FGDC CSDGM`_     | 1998       | 
++-------------------+------------+
+| `SRU`_            | 1.1        | 
++-------------------+------------+
+| `A9 OpenSearch`_  | 1.1        | 
++-------------------+------------+
+
+Supported Operations
+--------------------
+
+.. csv-table::
+  :header: Request,Optionality,Supported,HTTP method binding(s)
+
+  GetCapabilities,mandatory,yes,GET (KVP) / POST (XML) / SOAP
+  DescribeRecord,mandatory,yes,GET (KVP) / POST (XML) / SOAP
+  GetRecords,mandatory,yes,GET (KVP) / POST (XML) / SOAP
+  GetRecordById,optional,yes,GET (KVP) / POST (XML) / SOAP
+  GetRepositoryItem,optional,yes,GET (KVP)
+  GetDomain,optional,yes,GET (KVP) / POST (XML) / SOAP
+  Harvest,optional,yes,GET (KVP) / POST (XML) / SOAP
+  Transaction,optional,yes,POST (XML) / SOAP
+
+.. note::
+
+  Asynchronous processing supported for GetRecords and Harvest requests (via ``csw:ResponseHandler``)
+
+.. note::
+
+  Supported Harvest Resource Types are listed in :ref:`transactions`
+
+Supported Output Formats
+------------------------
+
+- XML (default)
+- JSON
+
+Supported Output Schemas
+------------------------
+
+- Dublin Core
+- ISO 19139
+- FGDC CSDGM
+- NASA DIF
+- Atom
+
+Supported Sorting Functionality
+-------------------------------
+
+- ogc:SortBy
+- ascending or descending
+- aspatial (queryable properties)
+- spatial (geometric area)
+
+Supported Filters
+-----------------
+
+Full Text
+^^^^^^^^^
+
+- csw:AnyText
+
+Geometry Operands
+^^^^^^^^^^^^^^^^^
+
+- gml:Point
+- gml:LineString
+- gml:Polygon
+- gml:Envelope
+
+.. note::
+
+  Coordinate transformations are supported
+
+Spatial Operators
+^^^^^^^^^^^^^^^^^
+
+- BBOX
+- Beyond
+- Contains
+- Crosses
+- Disjoint
+- DWithin
+- Equals
+- Intersects
+- Overlaps
+- Touches
+- Within
+
+Logical Operators
+^^^^^^^^^^^^^^^^^
+
+- Between
+- EqualTo
+- LessThanEqualTo
+- GreaterThan
+- Like
+- LessThan
+- GreaterThanEqualTo
+- NotEqualTo
+- NullCheck
+
+Functions
+^^^^^^^^^
+- length
+- lower
+- ltrim
+- rtrim
+- trim
+- upper
+
+.. _`OGC CSW`: http://www.opengeospatial.org/standards/cat
+.. _`ISO Metadata Application Profile 1.0.0`: http://portal.opengeospatial.org/files/?artifact_id=21460
+.. _`OGC Filter`: http://www.opengeospatial.org/standards/filter
+.. _`OGC OWS Common`: http://www.opengeospatial.org/standards/common
+.. _`OGC GML`: http://www.opengeospatial.org/standards/gml
+.. _`OGC SFSQL`: http://www.opengeospatial.org/standards/sfs
+.. _`Dublin Core`: http://www.dublincore.org/
+.. _`OGC CITE CSW`: http://cite.opengeospatial.org/test_engine/csw/2.0.2
+.. _`SOAP`: http://www.w3.org/TR/soap/
+.. _`INSPIRE Discovery Services 3.0`: http://inspire.jrc.ec.europa.eu/documents/Network_Services/TechnicalGuidance_DiscoveryServices_v3.0.pdf
+.. _`ISO 19115`: http://www.iso.org/iso/catalogue_detail.htm?csnumber=26020
+.. _`ISO 19139`: http://www.iso.org/iso/catalogue_detail.htm?csnumber=32557
+.. _`ISO 19119`: http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=39890
+.. _`NASA DIF`: http://gcmd.gsfc.nasa.gov/add/difguide/index.html
+.. _`FGDC CSDGM`: http://www.fgdc.gov/metadata/csdgm
+.. _`FGDC CSDGM Application Profile for CSW 2.0`: http://portal.opengeospatial.org/files/?artifact_id=16936
+.. _`SRU`: http://www.loc.gov/standards/sru/
+.. _`A9 OpenSearch`: http://www.opensearch.org/Home
+.. _`GeoNode`: http://geonode.org/
+.. _`Open Data Catalog`: https://github.com/azavea/Open-Data-Catalog/
+.. _`CKAN`: http://ckan.org/
+.. _`Compliant`: http://www.opengeospatial.org/resource/products/details/?pid=1104
diff --git a/docs/license.rst b/docs/license.rst
new file mode 100644
index 0000000..eeb2337
--- /dev/null
+++ b/docs/license.rst
@@ -0,0 +1,6 @@
+.. _license:
+
+License
+=======
+
+.. include:: ../LICENSE.txt
diff --git a/docs/locale/el/LC_MESSAGES/.gitkeep b/docs/locale/el/LC_MESSAGES/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/docs/locale/fr/LC_MESSAGES/.gitkeep b/docs/locale/fr/LC_MESSAGES/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/docs/odc.rst b/docs/odc.rst
new file mode 100644
index 0000000..73757aa
--- /dev/null
+++ b/docs/odc.rst
@@ -0,0 +1,15 @@
+.. _odc:
+
+Open Data Catalog Configuration
+===============================
+
+Open Data Catalog (https://github.com/azavea/Open-Data-Catalog/) is an open data catalog based on Django, Python and PostgreSQL. It was originally developed for OpenDataPhilly.org, a portal that provides access to open data sets, applications, and APIs related to the Philadelphia region. The Open Data Catalog is a generalized version of the original source code with a simple skin. It is intended to display information and links to publicly available data in an easily searchable format. T [...]
+
+pycsw supports binding to an existing Open Data Catalog repository for metadata query.  The binding is read-only (transactions are not in scope, as Open Data Catalog manages repository metadata changes in the application proper).
+
+Open Data Catalog Setup
+-----------------------
+
+Open Data Catalog provides CSW functionality using pycsw out of the box (installing ODC will also install pycsw).  Settings are defined in https://github.com/azavea/Open-Data-Catalog/blob/master/OpenDataCatalog/settings.py#L165.
+
+At this point, pycsw is able to read from the Open Data Catalog repository using the Django ORM.
diff --git a/docs/opensearch.rst b/docs/opensearch.rst
new file mode 100644
index 0000000..ac334ca
--- /dev/null
+++ b/docs/opensearch.rst
@@ -0,0 +1,27 @@
+.. _opensearch:
+
+OpenSearch Support
+==================
+
+pycsw supports the `A9 OpenSearch`_ 1.1 implementation in support of aggregated searching.
+
+Description Document
+--------------------
+
+To generate an OpenSearch Description Document:
+
+.. code-block:: bash
+
+  $ cd /path/to/pycsw
+  $ export PYTHONPATH=`pwd` 
+  $ python-admin.py -c gen_opensearch_description -f default.cfg -o /path/to/opensearch.xml
+
+This will create the document which can then be `autodiscovered <http://www.opensearch.org/Specifications/OpenSearch/1.1#Autodiscovery>`_.
+
+OpenSearch support is enabled by default.  HTTP requests must be specified with ``mode=opensearch`` in the base URL for OpenSearch requests, e.g.:
+
+.. code-block:: bash
+
+  http://localhost/pycsw/csw.py?mode=opensearch&service=CSW&verison=2.0.2&request=GetRecords&elementsetname=brief&typenames=csw:Record&resulttype=results
+
+.. _`A9 OpenSearch`: http://www.opensearch.org/Home
diff --git a/docs/outputschemas.rst b/docs/outputschemas.rst
new file mode 100644
index 0000000..f364547
--- /dev/null
+++ b/docs/outputschemas.rst
@@ -0,0 +1,42 @@
+.. _outputschemas:
+
+Output Schema Plugins
+=====================
+
+Overview
+--------
+
+pycsw allows for extending the implementation of output schemas to the core standard.  outputschemas allow for a client to request metadata in a specific format (ISO, Dublin Core, FGDC, NASA DIF and Atom are default).
+
+All outputschemas must be placed in the ``pycsw/plugins/outputschemas`` directory.
+
+Requirements
+------------
+
+.. code-block:: none
+
+   pycsw/
+     plugins/
+     __init__.py # empty
+     outputschemas/
+       __init__.py # __all__ is a list of all provided outputschemas
+       atom.py # default
+       dif.py # default
+       fgdc.py # default
+
+Implementing a new outputschema
+-------------------------------
+
+Create a file in ``pycsw/plugins/outputschemas``, which defines the following:
+
+- ``NAMESPACE``: the default namespace of the outputschema which will be advertised
+- ``NAMESPACE``: dict of all applicable namespaces to outputschema
+- ``XPATH_MAPPINGS``: dict of pycsw core queryables mapped to the equivalent XPath of the outputschema
+- ``write_record``: function which returns a record as an ``lxml.etree.Element`` object
+
+Add the name of the file to ``__init__.py:__all__``.  The new outputschema is now supported in pycsw.
+
+Testing
+-------
+
+New outputschemas must add examples to the :ref:`tests` interface, which must provide example requests specific to the profile.
diff --git a/docs/profiles.rst b/docs/profiles.rst
new file mode 100644
index 0000000..8993969
--- /dev/null
+++ b/docs/profiles.rst
@@ -0,0 +1,69 @@
+.. _profiles:
+
+Profile Plugins
+===============
+
+Overview
+--------
+
+pycsw allows for the implementation of profiles to the core standard. Profiles allow specification of additional metadata format types (i.e. ISO 19139:2007, NASA DIF, INSPIRE, etc.) to the repository, which can be queried and presented to the client.  pycsw supports a plugin architecture which allows for runtime loading of Python code.
+
+All profiles must be placed in the ``pycsw/plugins/profiles`` directory.
+
+Requirements
+------------
+
+.. code-block:: none
+
+   pycsw/
+     plugins/
+     __init__.py # empty
+     profiles/ # directory to store profiles
+       __init__.py # empty
+       profile.py # defines abstract profile object (properties and methods) and functions to load plugins
+       apiso/ # profile directory
+         __init__.py # empty
+         apiso.py # profile code
+         ... # supporting files, etc.
+
+Abstract Base Class Definition
+------------------------------
+
+All profile code must be instantiated as a subclass of ``profile.Profile``.  Below is an example to add a ``Foo`` profile:
+
+.. code-block:: python
+
+   from pycsw.plugins.profiles import profile
+
+   class FooProfile(profile.Profile):
+       profile.Profile.__init__(self,
+           name='foo',
+           version='1.0.3',
+           title='My Foo Profile',
+           url='http://example.org/fooprofile/docs',
+           namespace='http://example.org/foons',
+           typename='foo:RootElement',
+           outputschema=http://example.org/foons',
+           prefixes=['foo'],
+           model=model,
+           core_namespaces=namespaces,
+           added_namespaces={'foo': 'http://example.org/foons'}
+           repository=REPOSITORY['foo:RootElement'])
+
+Your profile plugin class (``FooProfile``) must implement all methods as per ``profile.Profile``.  Profile methods must always return ``lxml.etree.Element`` types, or ``None``.
+
+Enabling Profiles
+-----------------
+
+All profiles are disabled by default.  To specify profiles at runtime, set the ``server.profiles`` value in the :ref:`configuration` to the name of the package (in the ``pycsw/plugins/profiles`` directory).  To enable multiple profiles, specify as a comma separated value (see :ref:`configuration`).
+
+Testing
+-------
+
+Profiles must add examples to the :ref:`tests` interface, which must provide example requests specific to the profile.
+
+Supported Profiles
+==================
+
+.. include:: ../pycsw/plugins/profiles/apiso/docs/apiso.rst
+.. include:: ../pycsw/plugins/profiles/ebrim/docs/ebrim.rst
diff --git a/docs/repofilters.rst b/docs/repofilters.rst
new file mode 100644
index 0000000..27851f9
--- /dev/null
+++ b/docs/repofilters.rst
@@ -0,0 +1,74 @@
+.. _repofilters:
+
+Repository Filters
+==================
+
+pycsw has the ability to perform server side repository / database filters as a means to mask all CSW requests to query against a specific subset of the metadata repository, thus providing the ability to deploy multiple pycsw instances pointing to the same database in different ways via the ``repository.filter`` configuration option.
+
+Repository filters are a convenient way to subset your repository at the server level without the hassle of creating proper database views.  For large repositories, it may be better to subset at the database level for performance.
+
+Scenario: One Database, Many Views
+----------------------------------
+
+Imagine a sample database table of records (subset below for brevity):
+
+.. csv-table::
+  :header: identifier,parentidentifier,title,abstract
+
+  1,33,foo1,bar1
+  2,33,foo2,bar2
+  3,55,foo3,bar3
+  4,55,foo1,bar1
+  5,21,foo5,bar5
+  5,21,foo6,bar6
+
+A default pycsw instance (with no ``repository.filters`` option) will always process CSW requests against the entire table.  So a CSW `GetRecords` filter like:
+
+.. code-block:: xml
+
+  <ogc:Filter>
+      <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>apiso:Title</ogc:PropertyName>
+          <ogc:Literal>foo1</ogc:Literal>
+      </ogc:PropertyIsEqualTo>
+  </ogc:Filter>
+
+...will return:
+
+.. csv-table::
+  :header: identifier,parentidentifier,title,abstract
+
+  1,33,foo1,bar1
+  4,55,foo1,bar1
+
+Suppose you wanted to deploy another pycsw instance which serves metadata from the same database, but only from a specific subset.  Here we set the ``repository.filter`` option:
+
+.. code-block:: text
+
+  [repository]
+  database=sqlite:///records.db
+  filter=pycsw:ParentIdentifier = '33'
+
+The same CSW `GetRecords` filter as per above then yields the following results:
+
+.. csv-table::
+  :header: identifier,parentidentifier,title,abstract
+
+  1,33,foo1,bar1
+
+Another example:
+
+.. code-block:: text
+
+  [repository]
+  database=sqlite:///records.db
+  filter=pycsw:ParentIdentifier != '33'
+
+The same CSW `GetRecords` filter as per above then yields the following results:
+
+.. csv-table::
+  :header: identifier,parentidentifier,title,abstract
+
+  4,55,foo1,bar1
+
+The ``repository.filter`` option accepts all core queryables set in the pycsw core model (see ``pycsw.config.StaticContext.md_core_model`` for the complete list).
diff --git a/docs/sitemaps.rst b/docs/sitemaps.rst
new file mode 100644
index 0000000..3bd1bf5
--- /dev/null
+++ b/docs/sitemaps.rst
@@ -0,0 +1,14 @@
+.. _sitemaps:
+
+XML Sitemaps
+============
+
+`XML Sitemaps`_ can be generated by running:
+
+.. code-block:: bash
+
+  $ pycsw-admin.py -c gen_sitemap -f default.cfg -o sitemap.xml
+
+The ``sitemap.xml`` file should be saved to an an area on your web server (parallel to or above your pycsw install location) to enable web crawlers to index your repository. 
+
+.. _`XML Sitemaps`: http://www.sitemaps.org/
diff --git a/docs/soap.rst b/docs/soap.rst
new file mode 100644
index 0000000..b007c0b
--- /dev/null
+++ b/docs/soap.rst
@@ -0,0 +1,7 @@
+.. _soap:
+
+SOAP
+====
+
+pycsw supports handling of SOAP encoded requests and responses as per subclause 10.3.2 of OGC:CSW 2.0.2.  SOAP request examples can be found in ``tests/index.html``.
+
diff --git a/docs/sru.rst b/docs/sru.rst
new file mode 100644
index 0000000..909fc85
--- /dev/null
+++ b/docs/sru.rst
@@ -0,0 +1,16 @@
+.. _sru:
+
+Search/Retrieval via URL (SRU) Support
+======================================
+
+pycsw supports the `Search/Retrieval via URL`_ search protocol implementation as per subclause 8.4 of the OpenGIS Catalogue Service Implementation Specification.
+
+SRU support is enabled by default.  HTTP GET requests must be specified with ``mode=sru`` for SRU requests, e.g.:
+
+.. code-block:: bash
+
+  http://localhost/pycsw/csw.py?mode=sru&operation=searchRetrieve&query=foo
+
+See http://www.loc.gov/standards/sru/simple.html for example SRU requests.
+
+.. _`Search/Retrieval via URL`: http://www.loc.gov/standards/sru/
diff --git a/docs/support.rst b/docs/support.rst
new file mode 100644
index 0000000..e7093c3
--- /dev/null
+++ b/docs/support.rst
@@ -0,0 +1,9 @@
+.. _support:
+
+Support
+=======
+
+Community
+---------
+
+Please see the `Community </community.html>`_ page for information on the pycsw community, getting support, and how to get involved.
diff --git a/docs/testing.rst b/docs/testing.rst
new file mode 100644
index 0000000..c5c90d3
--- /dev/null
+++ b/docs/testing.rst
@@ -0,0 +1,97 @@
+.. _testing:
+
+Testing
+=======
+
+.. _ogc-cite:
+
+OGC CITE
+--------
+
+Compliance benchmarking is done via the OGC `Compliance & Interoperability Testing & Evaluation Initiative`_.  The pycsw `wiki <https://github.com/geopython/pycsw/wiki/OGC-CITE-Compliance>`_ documents testing procedures and status.
+
+.. _tests:
+
+Tester
+------
+
+The pycsw tests framework (in ``tests``) is a collection of testsuites to perform automated regession testing of the codebase.  Test are run against all pushes to the GitHub repository via `Travis CI`_.
+
+Running Locally
+^^^^^^^^^^^^^^^
+
+The tests framework can be run from ``tests`` using `Paver`_ (see ``pavement.py``) tasks for convenience:
+
+.. code-block:: bash
+
+  $ cd /path/to/pycsw
+  # run all tests (starts up http://localhost:8000)
+  $ paver test
+  # run tests only against specific testsuites 
+  $ paver test -s apiso,fgdc
+  # run all tests, including harvesting (this is turned off by default given the volatility of remote services/data testing)
+  $ paver test -r
+
+The tests perform HTTP GET and POST requests against ``http://localhost:8000``.  The expected output for each test can be found in ``expected``.  Results are categorized as ``passed``, ``failed``, or ``initialized``.  A summary of results is output at the end of the run.
+
+Failed Tests
+^^^^^^^^^^^^
+
+If a given test has failed, the output is saved in ``results``.  The resulting failure can be analyzed by running ``diff tests/expected/name_of_test.xml tests/results/name_of_test.xml`` to find variances.  The Paver task returns a status code which indicates the number of tests which have failed (i.e. ``echo $?``).
+
+Test Suites
+^^^^^^^^^^^
+
+The tests framework is run against a series of 'suites' (in ``tests/suites``), each of which specifies a given configuration to test various functionality of the codebase.  Each suite is structured as follows:
+
+* ``tests/suites/suite/default.cfg``: the configuration for the suite
+* ``tests/suites/suite/post``: directory of XML documents for HTTP POST requests
+* ``tests/suites/suite/get/requests.txt``: directory and text file of KVP for HTTP GET requests
+* ``tests/suites/suite/data``: directory of sample XML data required for the test suite.  Database and test data are setup/loaded automatically as part of testing
+
+When the tests are invoked, the following operations are run:
+
+* pycsw configuration is set to ``tests/suites/suite/default.cfg``
+* HTTP POST requests are run against ``tests/suites/suite/post/*.xml``
+* HTTP GET requests are run against each request in ``tests/suites/suite/get/requests.txt``
+
+The CSV format of ``tests/suites/suite/get/requests.txt`` is ``testname,request``, with one line for each test.  The ``testname`` value is a unique test name (this value sets the name of the output file in the test results).  The ``request`` value is the HTTP GET request.  The ``PYCSW_SERVER`` token is replaced at runtime with the URL to the pycsw install.
+
+Adding New Tests
+^^^^^^^^^^^^^^^^
+
+To add tests to an existing suite:
+
+* for HTTP POST tests, add XML documents to ``tests/suites/suite/post``
+* for HTTP GET tests, add tests (one per line) to ``tests/suites/suite/get/requests.txt``
+* run ``paver test``
+
+To add a new test suite:
+
+* create a new directory under ``tests/suites`` (e.g. ``foo``)
+* create a new configuration in ``tests/suites/foo/default.cfg``
+
+  * Ensure that all file paths are relative to ``path/to/pycsw``
+  * Ensure that ``repository.database`` points to an SQLite3 database called ``tests/suites/foo/data/records.db``.  The database *must* be called ``records.db`` and the directory ``tests/suites/foo/data`` *must* exist
+
+* populate HTTP POST requests in ``tests/suites/foo/post``
+* populate HTTP GET requests in ``tests/suites/foo/get/requests.txt``
+* if the testsuite requires test data, create ``tests/suites/foo/data`` are store XML file there
+* run ``paver test`` (or ``paver test -s foo`` to test only the new test suite)
+
+The new test suite database will be created automatically and used as part of tests.
+
+Web Testing
+^^^^^^^^^^^
+
+You can also use the pycsw tests via your web browser to perform sample requests against your pycsw install.  The tests are is located in ``tests/``.  To generate the HTML page:
+
+.. code-block:: bash
+
+  $ paver gen_tests_html
+
+Then navigate to ``http://host/path/to/pycsw/tests/index.html``.
+
+.. _`Compliance & Interoperability Testing & Evaluation Initiative`: http://cite.opengeospatial.org/
+.. _`Travis CI`: http://travis-ci.org/geopython/pycsw
+.. _`Paver`: http://paver.github.io/paver/
diff --git a/docs/tools.rst b/docs/tools.rst
new file mode 100644
index 0000000..fe8e79f
--- /dev/null
+++ b/docs/tools.rst
@@ -0,0 +1,26 @@
+.. _tools:
+
+Cataloguing and Metadata Tools
+==============================
+
+CSW Clients
+-----------
+
+- `Geoportal CSW Clients <http://sourceforge.net/apps/mediawiki/geoportal/index.php?title=Geoportal_CSW_Clients>`_
+- `OWSLib <http://geopython.github.io/OWSLib>`_
+- `qgcsw <http://geopython.github.io/qgcsw>`_ (`QGIS <http://qgis.org/>`_ plugin)
+
+CSW Servers
+-----------
+
+- `deegree <http://deegree.org/>`_
+- `eXcat <http://gdsc.nlr.nl/gdsc/en/tools/excat>`_
+- `GeoNetwork opensource <http://geonetwork-opensource.org/>`_
+
+Metadata Editing Tools
+----------------------
+
+- `CatMDEdit <http://catmdedit.sourceforge.net/>`_
+- `EUOSME <https://joinup.ec.europa.eu/software/euosme/description>`_
+- `GIMED <http://sourceforge.net/projects/gimed/>`_
+- `Metatools <http://hub.qgis.org/projects/metatools>`_ (`QGIS <http://qgis.org/>`_ plugin)
diff --git a/docs/transactions.rst b/docs/transactions.rst
new file mode 100644
index 0000000..ebc1bf0
--- /dev/null
+++ b/docs/transactions.rst
@@ -0,0 +1,77 @@
+.. _transactions:
+
+Transactions
+============
+
+pycsw has the ability to process CSW Harvest and Transaction requests (CSW-T).  Transactions are disabled by default; to enable, ``manager.transactions`` must be set to ``true``.  Access to transactional functionality is limited to IP addresses which must be set in ``manager.allowed_ips``.
+
+Supported Resource Types
+------------------------
+
+For transactions and harvesting, pycsw supports the following metadata resource types by default:
+
+.. csv-table::
+  :header: Resource Type,Namespace,Transaction,Harvest
+
+  Dublin Core,``http://www.opengis.net/cat/csw/2.0.2``,yes,yes
+  FGDC,``http://www.opengis.net/cat/csw/csdgm``,yes,yes
+  ISO 19139,``http://www.isotc211.org/2005/gmd``,yes,yes
+  ISO GMI,``http://www.isotc211.org/2005/gmi``,yes,yes
+  OGC:CSW 2.0.2,``http://www.opengis.net/cat/csw/2.0.2``,,yes
+  OGC:WMS 1.1.1,``http://www.opengis.net/wms``,,yes
+  OGC:WFS 1.1.0,``http://www.opengis.net/wfs``,,yes
+  OGC:WCS 1.0.0,``http://www.opengis.net/wcs``,,yes
+  OGC:WPS 1.0.0,``http://www.opengis.net/wps/1.0.0``,,yes
+  OGC:SOS 1.0.0,``http://www.opengis.net/sos/1.0``,,yes
+  OGC:SOS 2.0.0,``http://www.opengis.net/sos/2.0``,,yes
+  `WAF`_,``urn:geoss:urn``,,yes
+
+Additional metadata models are supported by enabling the appropriate :ref:`profiles`.
+
+.. note::
+
+   For transactions to be functional when using SQLite3, the SQLite3 database file (**and its parent directory**) must be fully writable.  For example:
+
+.. code-block:: bash
+
+  $ mkdir /path/data
+  $ chmod 777 /path/data
+  $ chmod 666 test.db
+  $ mv test.db /path/data
+
+For CSW-T deployments, it is strongly advised that this directory reside in an area that is not accessible by HTTP.
+
+Harvesting
+----------
+
+.. note::
+
+   Your server must be able to make outgoing HTTP requests for this functionality.
+
+pycsw supports the CSW-T ``Harvest`` operation.  Records which are harvested require to setup a cronjob to periodically refresh records in the local repository.  A sample cronjob is available in ``etc/harvest-all.cron`` which points to ``pycsw-admin.py`` (you must specify the correct path to your configuration).  Harvest operation results can be sent by email (via ``mailto:``) or ftp (via ``ftp://``) if the Harvest request specifies ``csw:ResponseHandler``.
+
+.. note::
+
+  For ``csw:ResponseHandler`` values using the ``mailto:`` protocol, you must have ``server.smtp_host`` set in your :ref:`configuration <configuration>`.
+
+OGC Web Services
+^^^^^^^^^^^^^^^^
+
+When harvesting OGC web services, requests can provide the base URL of the service as part of the Harvest request.  pycsw will construct a ``GetCapabilities`` request dynamically.
+
+When harvesting other CSW servers, pycsw pages through the entire CSW in default increments of 10.  This value can be modified via the ``manager.csw_harvest_pagesize`` :ref:`configuration <configuration>` option.  It is strongly advised to use the ``csw:ResponseHandler`` parameter for harvesting large CSW catalogues to prevent HTTP timeouts.
+
+Transactions
+------------
+
+pycsw supports 3 modes of the ``Transaction`` operation (``Insert``, ``Update``, ``Delete``):
+
+- **Insert**: full XML documents can be inserted as per CSW-T
+- **Update**: updates can be made as full record updates or record properties against a ``csw:Constraint``
+- **Delete**: deletes can be made against a ``csw:Constraint``
+
+Transaction operation results can be sent by email (via ``mailto:``) or ftp (via ``ftp://``) if the Transaction request specifies ``csw:ResponseHandler``.
+
+The :ref:`tests` contain CSW-T request examples.
+
+.. _`WAF`: http://seabass.ieee.org/groups/geoss/index.php?option=com_sir_200&Itemid=157&ID=183
diff --git a/etc/dist/debian/README b/etc/dist/debian/README
new file mode 100644
index 0000000..62783f7
--- /dev/null
+++ b/etc/dist/debian/README
@@ -0,0 +1,6 @@
+The Debian Package pycsw
+----------------------------
+
+pycsw is an OGC CSW server implementation written in Python.
+
+ -- Angelos Tzotsos <gcpp.kalxas at gmail.com>  Wed, 11 Apr 2012 22:40:22 +0300
diff --git a/etc/dist/debian/changelog b/etc/dist/debian/changelog
new file mode 100644
index 0000000..c2bda19
--- /dev/null
+++ b/etc/dist/debian/changelog
@@ -0,0 +1,35 @@
+pycsw (1.6.1-0~precise1) precise; urgency=low
+
+  * Update to 1.6.1.
+
+ -- Angelos Tzotsos <gcpp.kalxas at gmail.com>  Sun, 12 Jan 2014 20:03:00 +0200
+
+pycsw (1.6.0-0~precise1) precise; urgency=low
+
+  * Update to 1.6.0.
+
+ -- Angelos Tzotsos <gcpp.kalxas at gmail.com>  Fri, 28 Jun 2013 18:57:00 +0300
+
+pycsw (1.4.2-0) precise; urgency=low
+
+  * Update to 1.4.2.
+
+ -- Angelos Tzotsos <gcpp.kalxas at gmail.com>  Sat, 08 Jun 2013 20:32:00 +0300
+
+pycsw (1.4.1-0) precise; urgency=low
+
+  * Update to 1.4.1.
+
+ -- Angelos Tzotsos <gcpp.kalxas at gmail.com>  Sat, 30 Mar 2013 20:25:00 +0300
+
+pycsw (1.4.0-0) precise; urgency=low
+
+  * Update to 1.4.0.
+
+ -- Angelos Tzotsos <gcpp.kalxas at gmail.com>  Sun, 30 Sep 2012 22:50:00 +0300
+
+pycsw (1.2.0-0) oneiric; urgency=low
+
+  * Initial build.
+
+ -- Angelos Tzotsos <gcpp.kalxas at gmail.com>  Wed, 11 Apr 2012 22:40:22 +0300
diff --git a/etc/dist/debian/compat b/etc/dist/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/etc/dist/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/etc/dist/debian/control b/etc/dist/debian/control
new file mode 100644
index 0000000..30fbeac
--- /dev/null
+++ b/etc/dist/debian/control
@@ -0,0 +1,18 @@
+Source: pycsw
+Section: web
+Priority: optional
+Maintainer: Angelos Tzotsos <gcpp.kalxas at gmail.com>
+Build-Depends: debhelper (>= 7.0.50), python-setuptools (>= 0.6), python-support (>=0.6), python-all-dev (>= 2.3.5-11), python (>= 2.6.6-3)
+Standards-Version: 3.9.3
+X-Python-Version: >= 2.5
+Homepage: http://pycsw.org
+
+Package: python-pycsw
+Architecture: all
+Depends: ${misc:Depends}, debconf, python (>=2.5), python-lxml, python-shapely, python-pyproj, python-owslib
+Description: pycsw is an OGC CSW server implementation written in Python.
+
+Package: pycsw-cgi
+Architecture: all
+Depends: ${misc:Depends}, debconf, python (>=2.5), apache2, python-sqlalchemy, python-pycsw
+Description: pycsw-cgi installs a CGI apache service based on python-pycsw.
diff --git a/etc/dist/debian/copyright b/etc/dist/debian/copyright
new file mode 100644
index 0000000..031fee9
--- /dev/null
+++ b/etc/dist/debian/copyright
@@ -0,0 +1,27 @@
+This package was created by Angelos Tzotsos <gcpp.kalxas at gmail.com> on
+Wed, 11 Apr 2012 22:40:22 +0300
+
+Copyright:
+ Copyright (C) 2011-2012 Angelos Tzotsos
+ Copyright (c) 2010-2012 Tom Kralidis
+ All rights reserved.
+
+License:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/etc/dist/debian/format b/etc/dist/debian/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/etc/dist/debian/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/etc/dist/debian/pycsw-cgi.install b/etc/dist/debian/pycsw-cgi.install
new file mode 100644
index 0000000..9d24f93
--- /dev/null
+++ b/etc/dist/debian/pycsw-cgi.install
@@ -0,0 +1,13 @@
+docs/*				/var/www/pycsw/docs/
+etc/harvest-all.cron		/var/www/pycsw/etc/
+etc/mappings.py			/var/www/pycsw/etc/
+bin/*				/var/www/pycsw/bin/
+tests/*				/var/www/pycsw/tests/
+etc/pycsw		       	/etc/apache2/conf.d/
+etc/pycsw.desktop	       	/usr/share/applications/
+csw.py				/var/www/pycsw/
+LICENSE.txt			/var/www/pycsw/
+README.txt			/var/www/pycsw/
+VERSION.txt			/var/www/pycsw/
+HISTORY.txt			/var/www/pycsw/
+default-sample.cfg		/var/www/pycsw/
diff --git a/etc/dist/debian/pycsw-cgi.postinst b/etc/dist/debian/pycsw-cgi.postinst
new file mode 100644
index 0000000..6b85492
--- /dev/null
+++ b/etc/dist/debian/pycsw-cgi.postinst
@@ -0,0 +1,53 @@
+#!/bin/sh
+# postinst script for pycsw
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postinst> `configure' <most-recently-configured-version>
+#        * <old-postinst> `abort-upgrade' <new version>
+#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+#          <new-version>
+#        * <postinst> `abort-remove'
+#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+#          <failed-install-package> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+install() {
+    cd /var/www/pycsw/tests
+    python ./gen_html.py > index.html
+    cd /var/www/pycsw
+    cp default-sample.cfg default.cfg
+    /etc/init.d/apache2 force-reload
+
+}
+
+case "$1" in
+    configure)
+        install
+    ;;
+
+    abort-upgrade|abort-remove|abort-deconfigure)
+    ;;
+
+    *)
+        echo "postinst called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
+
+
+
diff --git a/etc/dist/debian/python-pycsw.install b/etc/dist/debian/python-pycsw.install
new file mode 100644
index 0000000..444b3d5
--- /dev/null
+++ b/etc/dist/debian/python-pycsw.install
@@ -0,0 +1 @@
+debian/tmp/usr/lib
diff --git a/etc/dist/debian/rules b/etc/dist/debian/rules
new file mode 100755
index 0000000..8769f48
--- /dev/null
+++ b/etc/dist/debian/rules
@@ -0,0 +1,5 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+%:
+	dh  $@ --with python2
diff --git a/etc/dist/install_script/install_pycsw.sh b/etc/dist/install_script/install_pycsw.sh
new file mode 100755
index 0000000..6f9266d
--- /dev/null
+++ b/etc/dist/install_script/install_pycsw.sh
@@ -0,0 +1,106 @@
+#!/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/opensuse/python-pycsw.changes b/etc/dist/opensuse/python-pycsw.changes
new file mode 100644
index 0000000..41d57dd
--- /dev/null
+++ b/etc/dist/opensuse/python-pycsw.changes
@@ -0,0 +1,45 @@
+-------------------------------------------------------------------
+Sat Jun 29 10:20:58 UTC 2013 - tzotsos at opensuse.org
+
+- Updated to 1.6.0 release
+
+-------------------------------------------------------------------
+Sat Jun  8 07:20:57 UTC 2013 - tzotsos at opensuse.org
+
+- Updated to 1.4.2 release
+
+-------------------------------------------------------------------
+Sat Mar 30 16:55:13 UTC 2013 - tzotsos at opensuse.org
+
+- Updated to 1.4.1 release
+
+-------------------------------------------------------------------
+Tue Sep 11 11:29:12 UTC 2012 - tzotsos at opensuse.org
+
+- Renamed package to python-pycsw
+
+-------------------------------------------------------------------
+Mon Sep 10 21:37:30 UTC 2012 - tzotsos at opensuse.org
+
+- Updated to 1.4.0 release
+
+-------------------------------------------------------------------
+Sun Apr 08 20:00:00 UTC 2012 - tzotsos at opensuse.org
+
+- Updated to 1.2.0 release
+
+-------------------------------------------------------------------
+Wed Jun 29 00:05:00 UTC 2011 - tzotsos at opensuse.org
+
+- Updated to 1.0.0 release
+
+-------------------------------------------------------------------
+Wed Apr 20 01:07:54 UTC 2011 - tzotsos at opensuse.org
+
+- Updated to 0.1.0 release
+
+-------------------------------------------------------------------
+Thu Mar 09 21:47:54 UTC 2011 - tzotsos at opensuse.org
+
+- Initial spec file for OBS - 0.0.1
+
diff --git a/etc/dist/opensuse/python-pycsw.spec b/etc/dist/opensuse/python-pycsw.spec
new file mode 100644
index 0000000..57b8d4e
--- /dev/null
+++ b/etc/dist/opensuse/python-pycsw.spec
@@ -0,0 +1,196 @@
+#
+# spec file for package python-pycsw (1.6.0)
+#
+# Copyright (c) 2013 Angelos Tzotsos <tzotsos at opensuse.org>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+
+%define _webappconfdir /etc/apache2/conf.d/
+%define _htdocsdir /srv/www/htdocs/
+
+%{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
+%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
+
+%define pyname pycsw
+
+Name:           python-%{pyname}
+Version:        1.6.0
+Release:        1
+License:        MIT
+Summary:        An OGC CSW server implementation written in Python
+Url:            http://pycsw.org/
+Group:          Productivity/Scientific/Other
+Source0:        %{pyname}-%{version}.tar.gz
+Requires:	python
+Requires:	python-sqlalchemy
+Requires:	python-Shapely
+Requires:	python-lxml
+Requires:	python-owslib
+Requires:	python-pyproj
+BuildRequires:  fdupes python 
+BuildArch:      noarch
+Provides:       %{pyname} = %{version}
+
+BuildRoot:      %{_tmppath}/%{name}-%{version}-build
+
+%description
+pycsw implements clause 10 (HTTP protocol binding (Catalogue Services for the Web, CSW)) 
+of the OpenGIS Catalogue Service Implementation Specification, version 2.0.2. 
+Initial development started in 2010 (more formally announced in 2011). 
+The  project  is  certified  OGC  Compliant,  and  is  an  OGC  Reference  Implementation. 
+pycsw allows for the publishing and discovery of geospatial metadata. 
+Existing repositories of geospatial metadata can be exposed via OGC:CSW 2.0.2.
+pycsw is Open Source, released under an MIT license, and runs on all major platforms (Windows, Linux, Mac OS X)
+
+%package -n %{pyname}-cgi
+Summary:        CGI frondend to pycsw using apache web server
+Group:          Productivity/Scientific/Other
+Requires:       apache2
+Requires:       %{pyname} = %{version}
+%description -n %{pyname}-cgi
+Python CGI frondend to pycsw using apache web server
+
+%prep
+%setup -q -n %{pyname}-%{version}
+
+%build
+
+%install
+rm -rf %{buildroot}
+
+python setup.py install --prefix=%{_prefix} --root=%{buildroot} \
+                                            --record-rpm=INSTALLED_FILES
+
+mkdir -p %{buildroot}/srv/www/htdocs/pycsw
+mkdir -p %{buildroot}%{_sysconfdir}/apache2/conf.d
+
+#mv data %{buildroot}/srv/www/htdocs/pycsw/
+mv tests %{buildroot}/srv/www/htdocs/pycsw/
+mv csw.py %{buildroot}/srv/www/htdocs/pycsw/
+mv csw.wsgi %{buildroot}/srv/www/htdocs/pycsw/
+mv COMMITTERS.txt %{buildroot}/srv/www/htdocs/pycsw/
+mv default-sample.cfg %{buildroot}/srv/www/htdocs/pycsw/
+mv HISTORY.txt %{buildroot}/srv/www/htdocs/pycsw/
+mv LICENSE.txt %{buildroot}/srv/www/htdocs/pycsw/
+mv README.txt %{buildroot}/srv/www/htdocs/pycsw/
+mv VERSION.txt %{buildroot}/srv/www/htdocs/pycsw/
+
+cat > %{buildroot}%{_sysconfdir}/apache2/conf.d/pycsw.conf << EOF
+<Location /pycsw/>
+  Options FollowSymLinks +ExecCGI
+  Allow from all
+  AddHandler cgi-script .py
+</Location>
+EOF
+
+cat > %{buildroot}/srv/www/htdocs/pycsw/default.cfg << EOF
+[server]
+home=/srv/www/htdocs/pycsw
+url=http://localhost/pycsw/csw.py
+mimetype=application/xml; charset=UTF-8                                                             
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+#federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#domainquerytype=range
+#domaincounts=true
+profiles=apiso
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+#csw_harvest_pagesize=10
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery,metadata
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=Organization Name
+provider_url=http://pycsw.org/
+contact_name=Lastname, Firstname
+contact_position=Position Title
+contact_address=Mailing Address
+contact_city=City
+contact_stateorprovince=Administrative Area
+contact_postalcode=Zip or Postal Code
+contact_country=Country
+contact_phone=+xx-xxx-xxx-xxxx
+contact_fax=+xx-xxx-xxx-xxxx
+contact_email=Email Address
+contact_url=Contact URL
+contact_hours=Hours of Service
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:////srv/www/htdocs/pycsw/tests/suites/cite/data/records.db
+# postgres
+#database=postgresql://username:password@localhost/pycsw
+# mysql
+#database=mysql://username:password@localhost/pycsw?charset=utf8
+#mappings=path/to/mappings.py
+table=records
+
+[metadata:inspire]
+enabled=true
+languages_supported=eng,gre
+default_language=eng
+date=YYYY-MM-DD
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=Organization Name
+contact_email=Email Address
+temp_extent=2012-09-09/2012-09-10
+EOF
+
+%fdupes -s %{buildroot}
+
+%post 
+python /srv/www/htdocs/pycsw/tests/gen_html.py > /srv/www/htdocs/pycsw/tests/index.html
+
+%clean
+rm -rf %{buildroot}
+
+%files -f INSTALLED_FILES
+%defattr(-,root,root)
+%dir %{python_sitelib}/pycsw
+%{python_sitelib}/pycsw/
+
+%files -n %{pyname}-cgi
+%defattr(-,root,root)
+%config(noreplace) %{_webappconfdir}/pycsw.conf
+%dir %{_sysconfdir}/apache2/
+%dir %{_webappconfdir}/
+%dir %{_htdocsdir}/pycsw/
+%{_htdocsdir}/pycsw/*
+
+%changelog
diff --git a/etc/dist/osgeolive/install_pycsw.sh b/etc/dist/osgeolive/install_pycsw.sh
new file mode 100755
index 0000000..0b69418
--- /dev/null
+++ b/etc/dist/osgeolive/install_pycsw.sh
@@ -0,0 +1,64 @@
+#!/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.6.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/etc/harvest-all.cron b/etc/harvest-all.cron
new file mode 100644
index 0000000..3304ea2
--- /dev/null
+++ b/etc/harvest-all.cron
@@ -0,0 +1,5 @@
+# run cronjob daily at 0400h
+#
+# info on setting up cron at http://www.unixgeeks.org/security/newbie/unix/cron-1.html
+
+00 04 * * * /path/to/pycsw-admin.py -c refresh_harvested_records -f /path/to/default.cfg
diff --git a/etc/mappings.py b/etc/mappings.py
new file mode 100644
index 0000000..acf8826
--- /dev/null
+++ b/etc/mappings.py
@@ -0,0 +1,100 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+# sample mappings.py
+#
+# use this file to bind to an existing alternate metadata database model
+#
+# steps:
+# - update the 'mappings' dict to the column names of your existing database
+# - set repository.mappings to the location of this file
+
+MD_CORE_MODEL = {
+    'typename': 'pycsw:CoreMetadata',
+    'outputschema': 'http://pycsw.org/metadata',
+    'mappings': {
+        'pycsw:Identifier': 'identifier',
+        'pycsw:Typename': 'typename',
+        'pycsw:Schema': 'schema',
+        'pycsw:MdSource': 'mdsource',
+        'pycsw:InsertDate': 'insert_date',
+        'pycsw:XML': 'xml',
+        'pycsw:AnyText': 'anytext',
+        'pycsw:Language': 'language',
+        'pycsw:Title': 'title',
+        'pycsw:Abstract': 'abstract',
+        'pycsw:Keywords': 'keywords',
+        'pycsw:KeywordType': 'keywordstype',
+        'pycsw:Format': 'format',
+        'pycsw:Source': 'source',
+        'pycsw:Date': 'date',
+        'pycsw:Modified': 'date_modified',
+        'pycsw:Type': 'type',
+        'pycsw:BoundingBox': 'wkt_geometry',
+        'pycsw:CRS': 'crs',
+        'pycsw:AlternateTitle': 'title_alternate',
+        'pycsw:RevisionDate': 'date_revision',
+        'pycsw:CreationDate': 'date_creation',
+        'pycsw:PublicationDate': 'date_publication',
+        'pycsw:OrganizationName': 'organization',
+        'pycsw:SecurityConstraints': 'securityconstraints',
+        'pycsw:ParentIdentifier': 'parentidentifier',
+        'pycsw:TopicCategory': 'topicategory',
+        'pycsw:ResourceLanguage': 'resourcelanguage',
+        'pycsw:GeographicDescriptionCode': 'geodescode',
+        'pycsw:Denominator': 'denominator',
+        'pycsw:DistanceValue': 'distancevalue',
+        'pycsw:DistanceUOM': 'distanceuom',
+        'pycsw:TempExtent_begin': 'time_begin',
+        'pycsw:TempExtent_end': 'time_end',
+        'pycsw:ServiceType': 'servicetype',
+        'pycsw:ServiceTypeVersion': 'servicetypeversion',
+        'pycsw:Operation': 'operation',
+        'pycsw:CouplingType': 'couplingtype',
+        'pycsw:OperatesOn': 'operateson',
+        'pycsw:OperatesOnIdentifier': 'operatesonidentifier',
+        'pycsw:OperatesOnName': 'operatesoname',
+        'pycsw:Degree': 'degree',
+        'pycsw:AccessConstraints': 'accessconstraints',
+        'pycsw:OtherConstraints': 'otherconstraints',
+        'pycsw:Classification': 'classification',
+        'pycsw:ConditionApplyingToAccessAndUse': 'conditionapplyingtoaccessanduse',
+        'pycsw:Lineage': 'lineage',
+        'pycsw:ResponsiblePartyRole': 'responsiblepartyrole',
+        'pycsw:SpecificationTitle': 'specificationtitle',
+        'pycsw:SpecificationDate': 'specificationdate',
+        'pycsw:SpecificationDateType': 'specificationdatetype',
+        'pycsw:Creator': 'creator',
+        'pycsw:Publisher': 'publisher',
+        'pycsw:Contributor': 'contributor',
+        'pycsw:Relation': 'relation',
+        'pycsw:Links': 'links',
+    }
+}
diff --git a/etc/pycsw b/etc/pycsw
new file mode 100644
index 0000000..bde032c
--- /dev/null
+++ b/etc/pycsw
@@ -0,0 +1,5 @@
+<Directory /var/www/pycsw>
+  Options FollowSymLinks +ExecCGI
+  Allow from all
+  AddHandler cgi-script .py
+</Directory>
diff --git a/etc/pycsw.desktop b/etc/pycsw.desktop
new file mode 100644
index 0000000..1e8b4b7
--- /dev/null
+++ b/etc/pycsw.desktop
@@ -0,0 +1,11 @@
+[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;
diff --git a/pavement.py b/pavement.py
new file mode 100644
index 0000000..7593e00
--- /dev/null
+++ b/pavement.py
@@ -0,0 +1,349 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+from ConfigParser import SafeConfigParser
+import glob
+import os
+import sys
+import time
+from paver.easy import task, cmdopts, needs, \
+    pushd, sh, call_task, path, info
+
+DOCS = 'docs'
+STAGE_DIR = '/tmp'
+
+
+ at task
+def build_release():
+    """Create release package"""
+    pass
+
+
+ at task
+def refresh_docs():
+    """Build sphinx docs from scratch"""
+    with pushd(DOCS):
+        sh('make clean')
+        sh('make html')
+
+
+ at task
+ at cmdopts([
+    ('user=', 'u', 'OSGeo userid'),
+])
+def publish_docs(options):
+    """Publish dev docs to production"""
+    local_path = '_build/html'
+    remote_host = 'pycsw.org'
+    remote_path = '/osgeo/pycsw/pycsw-web/docs/latest'
+
+    user = options.get('user', False)
+    if not user:
+        raise Exception('OSGeo userid required')
+
+    call_task('refresh_docs')
+
+    with pushd(DOCS):
+        # change privs to be group writeable
+        for root, dirs, files in os.walk(local_path):
+            for dfile in files:
+                os.chmod(os.path.join(root, dfile), 0664)
+            for ddir in dirs:
+                os.chmod(os.path.join(root, ddir), 0775)
+
+        # copy documentation
+        sh('scp -r %s%s* %s@%s:%s' % (local_path, os.sep, user, remote_host,
+                                      remote_path))
+
+
+ at task
+def gen_tests_html():
+    """Generate tests/index.html for online testing"""
+    with pushd('tests'):
+        # ensure manager testsuite is writeable
+        os.chmod(os.path.join('suites', 'manager', 'data'), 0777)
+        sh('python gen_html.py > index.html')
+
+
+ at task
+ at needs(['distutils.command.sdist'])
+def publish_pypi():
+    """Publish to PyPI"""
+    pass
+
+
+ at task
+def package():
+    """Package a distribution .tar.gz/.zip"""
+
+    import pycsw
+
+    version = pycsw.__version__
+
+    package_name = 'pycsw-%s' % version
+
+    call_task('package_tar_gz', options={'package_name': package_name})
+
+
+ at task
+ at cmdopts([
+    ('package_name=', 'p', 'Name of package'),
+])
+def package_tar_gz(options):
+    """Package a .tar.gz distribution"""
+
+    import tarfile
+
+    package_name = options.get('package_name', None)
+
+    if package_name is None:
+        raise Exception('Package name required')
+
+    filename = path('%s/%s.tar.gz' % (STAGE_DIR, package_name))
+
+    if filename.exists():
+        info('Package %s already exists' % filename)
+        return
+
+    with pushd(STAGE_DIR):
+        stage_path = '%s/%s' % (STAGE_DIR, package_name)
+
+        if not path(stage_path).exists():
+            raise Exception('Directory %s does not exist' % stage_path)
+
+        tar = tarfile.open(filename, 'w:gz')
+        tar.add(package_name)
+        tar.close()
+
+ at task
+def setup_testdata():
+    """Create test databases and load test data"""
+
+    test_database_parameters = {
+        # suite: has_testdata
+        'apiso': True,
+        'cite': True,
+        'harvesting': False,
+        'manager': False
+    }
+
+    # remove CITE database so we can build fresh
+    for suite in test_database_parameters.keys():
+        dbfile = 'tests/suites/%s/data/records.db' % suite
+        if os.path.isfile(dbfile):
+            os.remove(dbfile)
+
+    for database, has_testdata in test_database_parameters.iteritems():
+        info('Setting up test database %s' % database)
+        cfg = path('tests/suites/%s/default.cfg' % database)
+        sh('pycsw-admin.py -c setup_db -f %s' % cfg)
+        if has_testdata:
+            datapath = path('tests/suites/%s/data' % database)
+            info('Loading test data from %s' % datapath)
+            sh('pycsw-admin.py -c load_records -f %s -p %s' % (cfg, datapath))
+
+
+ at task
+ at cmdopts([
+    ('url=', 'u', 'pycsw endpoint'),
+    ('suites=', 's', 'comma-separated list of testsuites'),
+    ('database=', 'd', 'database (SQLite3 [default], PostgreSQL, MySQL)'),
+    ('user=', 'U', 'database username'),
+    ('pass=', 'p', 'database password'),
+    ('remote', 'r', 'remote testing (harvesting)'),
+])
+def test(options):
+    """Run unit tests"""
+
+    db_setup = False
+    db_conn = None
+    cfg_files = []
+
+    url = options.get('url', None)
+    suites = options.get('suites', None)
+    database = options.get('database', 'SQLite3')
+    remote = options.get('remote')
+
+    if url is None:
+        # run against default server
+        call_task('stop')
+        call_task('reset')
+        if database == 'SQLite3':
+            call_task('setup_testdata')
+        call_task('start')
+        url = 'http://localhost:8000'
+
+    if suites is not None:
+        cmd = 'python run_tests.py -u %s -s %s' % (url, suites)
+    else:
+        cmd = 'python run_tests.py -u %s' % url
+
+    if remote:
+        cmd = '%s -r' % cmd
+
+    # configure/setup database if not default
+    if database != 'SQLite3':
+        db_setup = True
+        temp_db = 'pycsw_ci_test_pid_%d' % os.getpid()
+
+        if database == 'PostgreSQL':  # configure PG
+
+            from pycsw.admin import setup_db, load_records
+            from pycsw.config import StaticContext
+
+            cmd = '%s -d %s' % (cmd, database)
+
+            init_sfsql = True
+            home = os.path.abspath(os.path.dirname(__file__))
+            user = options.get('user', 'postgres')
+            password = options.get('pass', '')
+            context = StaticContext()
+
+            db_conn = 'postgresql://%s:%s@localhost/%s' % (
+                      user, password, temp_db)
+
+            if password:
+                sh('set PGPASSWORD=%s' % password)
+
+            sh('createdb %s -U %s' % (temp_db, user))
+            sh('createlang --dbname=%s plpythonu -U %s' % (temp_db, user))
+
+            # update all default.cfg files to point to test DB
+            cfg_files = glob.glob('tests%ssuites%s*%s*.cfg' % (3*(os.sep,)))
+
+            for cfg in cfg_files:
+                # generate table
+                suite = cfg.split(os.sep)[2]
+
+                tablename = 'records_cite'
+
+                if suite == 'manager':
+                    tablename = 'records_manager'
+                elif suite == 'apiso':
+                    tablename = 'records_apiso'
+
+                config = SafeConfigParser()
+                with open(cfg) as read_data:
+                    config.readfp(read_data)
+                config.set('repository', 'database', db_conn)
+                config.set('repository', 'table', tablename)
+                with open(cfg, 'wb') as config2:
+                    config.write(config2)
+
+                if suite in ['cite', 'manager', 'apiso']:  # setup tables
+                    setup_db(db_conn, tablename, home, init_sfsql, init_sfsql)
+                    init_sfsql = False
+
+                if suite in ['cite', 'apiso']:  # load test data
+                    dirname = '%s%sdata' % (os.path.dirname(cfg), os.sep)
+                    load_records(context, db_conn, tablename, dirname)
+
+        else:
+            raise Exception('Invalid database specified')
+
+    with pushd('tests'):
+        sh(cmd)
+
+    if db_setup:  # tearDown
+        for cfg in cfg_files:
+            sh('git checkout %s' % cfg)
+        if database == 'PostgreSQL':
+            sh("psql -c \"select pg_terminate_backend(procpid) from pg_stat_activity where datname='%s';\" -U %s" % (temp_db, user))
+            sh('dropdb %s -U %s' % (temp_db, user))
+            sh('unset PGPASSWORD')
+
+
+ at task
+def start(options):
+    """Start local WSGI server instance"""
+    sh('python csw.wsgi 8000 &')
+    time.sleep(10)
+
+
+ at task
+def stop():
+    """Stop local WSGI server instance"""
+
+    kill('python', 'csw.wsgi')
+
+
+ at task
+ at cmdopts([
+    ('force', 'f', 'forces git clean'),
+])
+def reset(options):
+    """Return codebase to pristine state"""
+    sh('git checkout tests/suites/cite/data/records.db')
+
+    force = options.get('force')
+    if force:
+        sh('git clean -dxf')
+
+
+def kill(arg1, arg2):
+    """Stops a proces that contains arg1 and is filtered by arg2"""
+
+    # from https://github.com/GeoNode/geonode/blob/dev/pavement.py#L443
+    from subprocess import Popen, PIPE
+
+    # 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])))
diff --git a/pycsw-1.8.2.tar b/pycsw-1.8.2.tar
new file mode 100644
index 0000000..9df6499
Binary files /dev/null and b/pycsw-1.8.2.tar differ
diff --git a/pycsw/__init__.py b/pycsw/__init__.py
new file mode 100644
index 0000000..b9ffed7
--- /dev/null
+++ b/pycsw/__init__.py
@@ -0,0 +1,31 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2010 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+__version__ = '1.8.2'
diff --git a/pycsw/admin.py b/pycsw/admin.py
new file mode 100644
index 0000000..eecbcba
--- /dev/null
+++ b/pycsw/admin.py
@@ -0,0 +1,593 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#          Angelos Tzotsos <tzotsos at gmail.com>
+#
+# Copyright (c) 2012 Tom Kralidis
+# Copyright (c) 2014 Angelos Tzotsos
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import logging
+import os
+import sys
+from glob import glob
+
+from lxml import etree
+from pycsw import metadata, repository, util
+
+LOGGER = logging.getLogger(__name__)
+
+
+def setup_db(database, table, home, create_sfsql_tables=True, create_plpythonu_functions=True, postgis_geometry_column='wkb_geometry', extra_columns=[], language='english'):
+    """Setup database tables and indexes"""
+    from sqlalchemy import Column, create_engine, Integer, MetaData, \
+        Table, Text
+    from sqlalchemy.orm import create_session
+
+    LOGGER.info('Creating database %s', database)
+    if database.startswith('sqlite'):
+        dbtype, filepath = database.split('sqlite:///')
+        dirname = os.path.dirname(filepath)
+        if not os.path.exists(dirname):
+            raise RuntimeError('SQLite directory %s does not exist' % dirname)
+
+    dbase = create_engine(database)
+
+    schema, table = util.sniff_table(table)
+
+    mdata = MetaData(dbase, schema=schema)
+    create_postgis_geometry = False
+
+    # If PostGIS 2.x detected, do not create sfsql tables.
+    if dbase.name == 'postgresql':
+        try:
+            dbsession = create_session(dbase)
+            for row in dbsession.execute('select(postgis_lib_version())'):
+                postgis_lib_version = row[0]
+            create_sfsql_tables=False
+            create_postgis_geometry = True
+            LOGGER.info('PostGIS %s detected: Skipping SFSQL tables creation' % postgis_lib_version)
+        except:
+            pass
+    
+    if create_sfsql_tables:
+        LOGGER.info('Creating table spatial_ref_sys')
+        srs = Table(
+            'spatial_ref_sys', mdata,
+            Column('srid', Integer, nullable=False, primary_key=True),
+            Column('auth_name', Text),
+            Column('auth_srid', Integer),
+            Column('srtext', Text)
+        )
+        srs.create()
+    
+        i = srs.insert()
+        i.execute(srid=4326, auth_name='EPSG', auth_srid=4326, srtext='GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]')
+    
+        LOGGER.info('Creating table geometry_columns')
+        geom = Table(
+            'geometry_columns', mdata,
+            Column('f_table_catalog', Text, nullable=False),
+            Column('f_table_schema', Text, nullable=False),
+            Column('f_table_name', Text, nullable=False),
+            Column('f_geometry_column', Text, nullable=False),
+            Column('geometry_type', Integer),
+            Column('coord_dimension', Integer),
+            Column('srid', Integer, nullable=False),
+            Column('geometry_format', Text, nullable=False),
+        )
+        geom.create()
+    
+        i = geom.insert()
+        i.execute(f_table_catalog='public', f_table_schema='public',
+                  f_table_name=table, f_geometry_column='wkt_geometry',
+                  geometry_type=3, coord_dimension=2,
+                  srid=4326, geometry_format='WKT')
+
+    # abstract metadata information model
+
+    LOGGER.info('Creating table %s', table)
+    records = Table(
+        table, mdata,
+        # core; nothing happens without these
+        Column('identifier', Text, primary_key=True),
+        Column('typename', Text,
+               default='csw:Record', nullable=False, index=True),
+        Column('schema', Text,
+               default='http://www.opengis.net/cat/csw/2.0.2', nullable=False,
+               index=True),
+        Column('mdsource', Text, default='local', nullable=False,
+               index=True),
+        Column('insert_date', Text, nullable=False, index=True),
+        Column('xml', Text, nullable=False),
+        Column('anytext', Text, nullable=False),
+        Column('language', Text, index=True),
+
+        # identification
+        Column('type', Text, index=True),
+        Column('title', Text, index=True),
+        Column('title_alternate', Text, index=True),
+        Column('abstract', Text, index=True),
+        Column('keywords', Text, index=True),
+        Column('keywordstype', Text, index=True),
+        Column('parentidentifier', Text, index=True),
+        Column('relation', Text, index=True),
+        Column('time_begin', Text, index=True),
+        Column('time_end', Text, index=True),
+        Column('topicategory', Text, index=True),
+        Column('resourcelanguage', Text, index=True),
+
+        # attribution
+        Column('creator', Text, index=True),
+        Column('publisher', Text, index=True),
+        Column('contributor', Text, index=True),
+        Column('organization', Text, index=True),
+
+        # security
+        Column('securityconstraints', Text, index=True),
+        Column('accessconstraints', Text, index=True),
+        Column('otherconstraints', Text, index=True),
+
+        # date
+        Column('date', Text, index=True),
+        Column('date_revision', Text, index=True),
+        Column('date_creation', Text, index=True),
+        Column('date_publication', Text, index=True),
+        Column('date_modified', Text, index=True),
+
+        Column('format', Text, index=True),
+        Column('source', Text, index=True),
+
+        # geospatial
+        Column('crs', Text, index=True),
+        Column('geodescode', Text, index=True),
+        Column('denominator', Text, index=True),
+        Column('distancevalue', Text, index=True),
+        Column('distanceuom', Text, index=True),
+        Column('wkt_geometry', Text),
+
+        # service
+        Column('servicetype', Text, index=True),
+        Column('servicetypeversion', Text, index=True),
+        Column('operation', Text, index=True),
+        Column('couplingtype', Text, index=True),
+        Column('operateson', Text, index=True),
+        Column('operatesonidentifier', Text, index=True),
+        Column('operatesoname', Text, index=True),
+
+        # additional
+        Column('degree', Text, index=True),
+        Column('classification', Text, index=True),
+        Column('conditionapplyingtoaccessanduse', Text, index=True),
+        Column('lineage', Text, index=True),
+        Column('responsiblepartyrole', Text, index=True),
+        Column('specificationtitle', Text, index=True),
+        Column('specificationdate', Text, index=True),
+        Column('specificationdatetype', Text, index=True),
+
+        # distribution
+        # links: format "name,description,protocol,url[^,,,[^,,,]]"
+        Column('links', Text, index=True),
+    )
+
+    # add extra columns that may have been passed via extra_columns
+    # extra_columns is a list of sqlalchemy.Column objects
+    if extra_columns:
+        LOGGER.info('Extra column definitions detected')
+        for extra_column in extra_columns:
+            LOGGER.info('Adding extra column: %s', extra_column)
+            records.append_column(extra_column)
+
+    records.create()
+
+    conn = dbase.connect()
+
+    if create_plpythonu_functions and not create_postgis_geometry:
+        if dbase.name == 'postgresql':  # create plpythonu functions within db
+            LOGGER.info('Setting plpythonu functions')
+            pycsw_home = home
+            function_get_anytext = '''
+        CREATE OR REPLACE FUNCTION get_anytext(xml text)
+        RETURNS text
+        AS $$
+            import sys
+            sys.path.append('%s')
+            from pycsw import util
+            return util.get_anytext(xml)
+            $$ LANGUAGE plpythonu;
+        ''' % pycsw_home
+            function_query_spatial = '''
+        CREATE OR REPLACE FUNCTION query_spatial(bbox_data_wkt text, bbox_input_wkt text, predicate text, distance text)
+        RETURNS text
+        AS $$
+            import sys
+            sys.path.append('%s')
+            from pycsw import util
+            return util.query_spatial(bbox_data_wkt, bbox_input_wkt, predicate, distance)
+            $$ LANGUAGE plpythonu;
+        ''' % pycsw_home
+            function_update_xpath = '''
+        CREATE OR REPLACE FUNCTION update_xpath(nsmap text, xml text, recprops text)
+        RETURNS text
+        AS $$
+            import sys
+            sys.path.append('%s')
+            from pycsw import util
+            return util.update_xpath(nsmap, xml, recprops)
+            $$ LANGUAGE plpythonu;
+        ''' % pycsw_home
+            function_get_geometry_area = '''
+        CREATE OR REPLACE FUNCTION get_geometry_area(geom text)
+        RETURNS text
+        AS $$
+            import sys
+            sys.path.append('%s')
+            from pycsw import util
+            return util.get_geometry_area(geom)
+            $$ LANGUAGE plpythonu;
+        ''' % pycsw_home
+            function_get_spatial_overlay_rank = '''
+        CREATE OR REPLACE FUNCTION get_spatial_overlay_rank(target_geom text, query_geom text)
+        RETURNS text
+        AS $$
+            import sys
+            sys.path.append('%s')
+            from pycsw import util
+            return util.get_spatial_overlay_rank(target_geom, query_geom)
+            $$ LANGUAGE plpythonu;
+        ''' % pycsw_home 
+            conn.execute(function_get_anytext)
+            conn.execute(function_query_spatial)
+            conn.execute(function_update_xpath)
+            conn.execute(function_get_geometry_area)
+            conn.execute(function_get_spatial_overlay_rank)
+
+    if dbase.name == 'postgresql':
+        LOGGER.info('Creating PostgreSQL Free Text Search (FTS) GIN index')
+	tsvector_fts = "alter table %s add column anytext_tsvector tsvector" % table
+	conn.execute(tsvector_fts)
+        index_fts = "create index fts_gin_idx on %s using gin(anytext_tsvector)" % table
+        conn.execute(index_fts)
+	# This needs to run if records exist "UPDATE records SET anytext_tsvector = to_tsvector('english', anytext)"
+	trigger_fts = "create trigger ftsupdate before insert or update on %s for each row execute procedure tsvector_update_trigger('anytext_tsvector', 'pg_catalog.%s', 'anytext')" % (table, language)
+	conn.execute(trigger_fts)
+
+    if dbase.name == 'postgresql' and create_postgis_geometry:
+        # create native geometry column within db
+        LOGGER.info('Creating native PostGIS geometry column')
+        if postgis_lib_version < '2':
+            create_column_sql = "SELECT AddGeometryColumn('%s', '%s', 4326, 'POLYGON', 2)" % (table, postgis_geometry_column)
+        else:
+            create_column_sql = "ALTER TABLE %s ADD COLUMN %s geometry(Geometry,4326);" % (table, postgis_geometry_column)
+        create_insert_update_trigger_sql = '''
+DROP TRIGGER IF EXISTS %(table)s_update_geometry ON %(table)s;
+DROP FUNCTION IF EXISTS %(table)s_update_geometry();
+CREATE FUNCTION %(table)s_update_geometry() RETURNS trigger AS $%(table)s_update_geometry$
+BEGIN
+    IF NEW.wkt_geometry IS NULL THEN
+        RETURN NEW;
+    END IF;
+    NEW.%(geometry)s := ST_GeomFromText(NEW.wkt_geometry,4326);
+    RETURN NEW;
+END;
+$%(table)s_update_geometry$ LANGUAGE plpgsql;
+
+CREATE TRIGGER %(table)s_update_geometry BEFORE INSERT OR UPDATE ON %(table)s
+FOR EACH ROW EXECUTE PROCEDURE %(table)s_update_geometry();
+    ''' % {'table': table, 'geometry': postgis_geometry_column}
+
+        create_spatial_index_sql = 'CREATE INDEX %(geometry)s_idx ON %(table)s USING GIST (%(geometry)s);' \
+        % {'table': table, 'geometry': postgis_geometry_column}
+
+        conn.execute(create_column_sql)
+        conn.execute(create_insert_update_trigger_sql)
+        conn.execute(create_spatial_index_sql)
+
+def load_records(context, database, table, xml_dirpath, recursive=False):
+    """Load metadata records from directory of files to database"""
+    repo = repository.Repository(database, context, table=table)
+
+    file_list = []
+
+    if recursive:
+        for root, dirs, files in os.walk(xml_dirpath):
+            for mfile in files:
+                if mfile.endswith('.xml'):
+                    file_list.append(os.path.join(root, mfile))
+    else:
+        for rec in glob(os.path.join(xml_dirpath, '*.xml')):
+            file_list.append(rec)
+
+    total = len(file_list)
+    counter = 0
+
+    for recfile in sorted(file_list):
+        counter += 1
+        LOGGER.info('Processing file %s (%d of %d)', recfile, counter, total)
+        # read document
+        try:
+            exml = etree.parse(recfile)
+        except Exception, err:
+            LOGGER.warn('XML document is not well-formed: %s', str(err))
+            continue
+
+        record = metadata.parse_record(context, exml, repo)
+
+        for rec in record:
+            LOGGER.info('Inserting %s %s into database %s, table %s ....',
+                        rec.typename, rec.identifier, database, table)
+
+            # TODO: do this as CSW Harvest
+            try:
+                repo.insert(rec, 'local', util.get_today_and_now())
+                LOGGER.info('Inserted')
+            except Exception, err:
+                LOGGER.warn('ERROR: not inserted %s', err)
+
+
+def export_records(context, database, table, xml_dirpath):
+    """Export metadata records from database to directory of files"""
+    repo = repository.Repository(database, context, table=table)
+
+    LOGGER.info('Querying database %s, table %s ....', database, table)
+    records = repo.session.query(repo.dataset)
+
+    LOGGER.info('Found %d records\n', records.count())
+
+    LOGGER.info('Exporting records\n')
+
+    dirpath = os.path.abspath(xml_dirpath)
+
+    if not os.path.exists(dirpath):
+        LOGGER.info('Directory %s does not exist.  Creating...', dirpath)
+        try:
+            os.makedirs(dirpath)
+        except OSError, err:
+            raise RuntimeError('Could not create %s %s' % (dirpath, err))
+
+    for record in records.all():
+        identifier = \
+            getattr(record,
+                    context.md_core_model['mappings']['pycsw:Identifier'])
+
+        LOGGER.info('Processing %s', identifier)
+        if identifier.find(':') != -1:  # it's a URN
+            # sanitize identifier
+            LOGGER.info(' Sanitizing identifier')
+            identifier = identifier.split(':')[-1]
+
+        # write to XML document
+        filename = os.path.join(dirpath, '%s.xml' % identifier)
+        try:
+            LOGGER.info('Writing to file %s', filename)
+            with open(filename, 'w') as xml:
+                xml.write('<?xml version="1.0" encoding="UTF-8"?>\n')
+                xml.write(record.xml)
+        except Exception, err:
+            raise RuntimeError("Error writing to %s" % filename, err)
+
+
+def refresh_harvested_records(context, database, table, url):
+    """refresh / harvest all non-local records in repository"""
+    from owslib.csw import CatalogueServiceWeb
+
+    # get configuration and init repo connection
+    repos = repository.Repository(database, context, table=table)
+
+    # get all harvested records
+    count, records = repos.query(constraint={'where': 'source != "local"'})
+
+    if int(count) > 0:
+        LOGGER.info('Refreshing %s harvested records', count)
+        csw = CatalogueServiceWeb(url)
+
+        for rec in records:
+            source = \
+                getattr(rec,
+                        context.md_core_model['mappings']['pycsw:Source'])
+            schema = \
+                getattr(rec,
+                        context.md_core_model['mappings']['pycsw:Schema'])
+            identifier = \
+                getattr(rec,
+                        context.md_core_model['mappings']['pycsw:Identifier'])
+
+            LOGGER.info('Harvesting %s (identifier = %s) ...',
+                        source, identifier)
+            # TODO: find a smarter way of catching this
+            if schema == 'http://www.isotc211.org/2005/gmd':
+                schema = 'http://www.isotc211.org/schemas/2005/gmd/'
+            try:
+                csw.harvest(source, schema)
+                LOGGER.info(csw.response)
+            except Exception, err:
+                LOGGER.warn(err)
+    else:
+        LOGGER.info('No harvested records')
+
+
+def rebuild_db_indexes(database, table):
+    """Rebuild database indexes"""
+    raise NotImplementedError
+
+
+def optimize_db(context, database, table):
+    """Optimize database"""
+
+    LOGGER.info('Optimizing database %s', database)
+    repos = repository.Repository(database, context, table=table)
+    repos.engine.connect().execute('VACUUM ANALYZE').close()
+
+
+def gen_sitemap(context, database, table, url, output_file):
+    """generate an XML sitemap from all records in repository"""
+
+    # get configuration and init repo connection
+    repos = repository.Repository(database, context, table=table)
+
+    # write out sitemap document
+    urlset = etree.Element(util.nspath_eval('sitemap:urlset',
+                                            context.namespaces),
+                           nsmap=context.namespaces)
+
+    schema_loc = util.nspath_eval('xsi:schemaLocation', context.namespaces)
+
+    urlset.attrib[schema_loc] = \
+        '%s http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd' % \
+        context.namespaces['sitemap']
+
+    # get all records
+    count, records = repos.query(constraint={}, maxrecords=99999999)
+
+    LOGGER.info('Found %s records', count)
+
+    for rec in records:
+        url = etree.SubElement(urlset,
+                               util.nspath_eval('sitemap:url',
+                                                context.namespaces))
+        uri = '%s?service=CSW&version=2.0.2&request=GetRepositoryItem&id=%s' % \
+            (url,
+             getattr(rec,
+                     context.md_core_model['mappings']['pycsw:Identifier']))
+        etree.SubElement(url,
+                         util.nspath_eval('sitemap:loc',
+                                          context.namespaces)).text = uri
+
+    # write to file
+    LOGGER.info('Writing to %s', output_file)
+    with open(output_file, 'w') as ofile:
+        ofile.write(etree.tostring(urlset, pretty_print=1,
+                    encoding='utf8', xml_declaration=1))
+
+
+def gen_opensearch_description(context, mdata, url, output_file):
+    """generate an OpenSearch Description document"""
+
+    node0 = etree.Element('OpenSearchDescription',
+                          nsmap={None: context.namespaces['os']})
+
+    etree.SubElement(node0, 'ShortName').text = 'pycsw'
+    etree.SubElement(node0, 'LongName').text = mdata['identification_title']
+    etree.SubElement(node0, 'Description').text = \
+        mdata['identification_abstract']
+    etree.SubElement(node0, 'Tags').text = \
+        ' '.join(mdata['identification_keywords'].split(','))
+
+    node1 = etree.SubElement(node0, 'Url')
+    node1.set('type', 'text/html')
+    node1.set('method', 'get')
+    node1.set('template', '%s?mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&elementsetname=brief&typenames=csw:Record&resulttype=results&constraintlanguage=CQL_TEXT&constraint_language_version=1.1.0&constraint=csw:AnyText like "%%{searchTerms}%%" ' % url)
+
+    node1 = etree.SubElement(node0, 'Image')
+    node1.set('type', 'image/vnd.microsoft.icon')
+    node1.set('width', '16')
+    node1.set('height', '16')
+    node1.text = 'http://pycsw.org/_static/favicon.ico'
+
+    etree.SubElement(node0, 'Developer').text = mdata['contact_name']
+    etree.SubElement(node0, 'Contact').text = mdata['contact_email']
+    etree.SubElement(node0, 'Attribution').text = mdata['provider_name']
+
+    # write to file
+    LOGGER.info('Writing to %s', output_file)
+    with open(output_file, 'w') as ofile:
+        ofile.write(etree.tostring(node0, pretty_print=1,
+                    encoding='UTF-8', xml_declaration=1))
+
+
+def post_xml(url, xml, timeout=30):
+    """Execute HTTP XML POST request and print response"""
+
+    LOGGER.info('Executing HTTP POST request %s on server %s', xml, url)
+
+    from owslib.util import http_post
+    try:
+        return http_post(url=url, request=open(xml).read(), timeout=timeout)
+    except Exception, err:
+        raise RuntimeError(err)
+
+
+def get_sysprof():
+    """Get versions of dependencies"""
+
+    none = 'Module not found'
+
+    try:
+        import sqlalchemy
+        vsqlalchemy = sqlalchemy.__version__
+    except ImportError:
+        vsqlalchemy = none
+
+    try:
+        import pyproj
+        vpyproj = pyproj.__version__
+    except ImportError:
+        vpyproj = none
+
+    try:
+        import shapely
+        try:
+            vshapely = shapely.__version__
+        except AttributeError:
+            import shapely.geos
+            vshapely = shapely.geos.geos_capi_version
+    except ImportError:
+        vshapely = none
+
+    try:
+        import owslib
+        try:
+            vowslib = owslib.__version__
+        except AttributeError:
+            vowslib = 'Module found, version not specified'
+    except ImportError:
+        vowslib = none
+
+    return '''pycsw system profile
+    --------------------
+    Python version: %s
+    os: %s
+    SQLAlchemy: %s
+    Shapely: %s
+    lxml: %s
+    pyproj: %s
+    OWSLib: %s''' % (sys.version_info, sys.platform, vsqlalchemy,
+                     vshapely, etree.__version__, vpyproj, vowslib)
+
+
+def validate_xml(xml, xsd):
+    """Validate XML document against XML Schema"""
+
+    LOGGER.info('Validating %s against schema %s', xml, xsd)
+
+    schema = etree.XMLSchema(file=xsd)
+    parser = etree.XMLParser(schema=schema)
+
+    try:
+        valid = etree.parse(xml, parser)
+        return 'Valid'
+    except Exception, err:
+        raise RuntimeError('ERROR: %s' % str(err))
diff --git a/pycsw/config.py b/pycsw/config.py
new file mode 100644
index 0000000..ad6c9f6
--- /dev/null
+++ b/pycsw/config.py
@@ -0,0 +1,332 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import logging
+from pycsw import __version__
+
+LOGGER = logging.getLogger(__name__)
+
+
+class StaticContext(object):
+    """core configuration"""
+    def __init__(self):
+        """initializer"""
+
+        LOGGER.debug('Initializing static context')
+        self.version = __version__
+
+        self.ogc_schemas_base = 'http://schemas.opengis.net'
+
+        self.languages = {
+            'en': 'english',
+            'fr': 'french',
+            'el': 'greek',
+        }
+
+        self.namespaces = {
+            'atom': 'http://www.w3.org/2005/Atom',
+            'csw': 'http://www.opengis.net/cat/csw/2.0.2',
+            'dc': 'http://purl.org/dc/elements/1.1/',
+            'dct': 'http://purl.org/dc/terms/',
+            'dif': 'http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/',
+            'fgdc': 'http://www.opengis.net/cat/csw/csdgm',
+            'gmd': 'http://www.isotc211.org/2005/gmd',
+            'gml': 'http://www.opengis.net/gml',
+            'ogc': 'http://www.opengis.net/ogc',
+            'os': 'http://a9.com/-/spec/opensearch/1.1/',
+            'ows': 'http://www.opengis.net/ows',
+            'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+            'sitemap': 'http://www.sitemaps.org/schemas/sitemap/0.9',
+            'soapenv': 'http://www.w3.org/2003/05/soap-envelope',
+            'xlink': 'http://www.w3.org/1999/xlink',
+            'xs': 'http://www.w3.org/2001/XMLSchema',
+            'xsi': 'http://www.w3.org/2001/XMLSchema-instance'
+        }
+
+        self.md_core_model = {
+            'typename': 'pycsw:CoreMetadata',
+            'outputschema': 'http://pycsw.org/metadata',
+            'mappings': {
+                'pycsw:Identifier': 'identifier',
+                # CSW typename (e.g. csw:Record, md:MD_Metadata)
+                'pycsw:Typename': 'typename',
+                # schema namespace, i.e. http://www.isotc211.org/2005/gmd
+                'pycsw:Schema': 'schema',
+                # origin of resource, either 'local', or URL to web service
+                'pycsw:MdSource': 'mdsource',
+                # date of insertion
+                'pycsw:InsertDate': 'insert_date',  # date of insertion
+                # raw XML metadata
+                'pycsw:XML': 'xml',
+                # bag of metadata element and attributes ONLY, no XML tages
+                'pycsw:AnyText': 'anytext',
+                'pycsw:Language': 'language',
+                'pycsw:Title': 'title',
+                'pycsw:Abstract': 'abstract',
+                'pycsw:Keywords': 'keywords',
+                'pycsw:KeywordType': 'keywordstype',
+                'pycsw:Format': 'format',
+                'pycsw:Source': 'source',
+                'pycsw:Date': 'date',
+                'pycsw:Modified': 'date_modified',
+                'pycsw:Type': 'type',
+                # geometry, specified in OGC WKT
+                'pycsw:BoundingBox': 'wkt_geometry',
+                'pycsw:CRS': 'crs',
+                'pycsw:AlternateTitle': 'title_alternate',
+                'pycsw:RevisionDate': 'date_revision',
+                'pycsw:CreationDate': 'date_creation',
+                'pycsw:PublicationDate': 'date_publication',
+                'pycsw:OrganizationName': 'organization',
+                'pycsw:SecurityConstraints': 'securityconstraints',
+                'pycsw:ParentIdentifier': 'parentidentifier',
+                'pycsw:TopicCategory': 'topicategory',
+                'pycsw:ResourceLanguage': 'resourcelanguage',
+                'pycsw:GeographicDescriptionCode': 'geodescode',
+                'pycsw:Denominator': 'denominator',
+                'pycsw:DistanceValue': 'distancevalue',
+                'pycsw:DistanceUOM': 'distanceuom',
+                'pycsw:TempExtent_begin': 'time_begin',
+                'pycsw:TempExtent_end': 'time_end',
+                'pycsw:ServiceType': 'servicetype',
+                'pycsw:ServiceTypeVersion': 'servicetypeversion',
+                'pycsw:Operation': 'operation',
+                'pycsw:CouplingType': 'couplingtype',
+                'pycsw:OperatesOn': 'operateson',
+                'pycsw:OperatesOnIdentifier': 'operatesonidentifier',
+                'pycsw:OperatesOnName': 'operatesoname',
+                'pycsw:Degree': 'degree',
+                'pycsw:AccessConstraints': 'accessconstraints',
+                'pycsw:OtherConstraints': 'otherconstraints',
+                'pycsw:Classification': 'classification',
+                'pycsw:ConditionApplyingToAccessAndUse': 'conditionapplyingtoaccessanduse',
+                'pycsw:Lineage': 'lineage',
+                'pycsw:ResponsiblePartyRole': 'responsiblepartyrole',
+                'pycsw:SpecificationTitle': 'specificationtitle',
+                'pycsw:SpecificationDate': 'specificationdate',
+                'pycsw:SpecificationDateType': 'specificationdatetype',
+                'pycsw:Creator': 'creator',
+                'pycsw:Publisher': 'publisher',
+                'pycsw:Contributor': 'contributor',
+                'pycsw:Relation': 'relation',
+                # links: format "name,description,protocol,url[^,,,[^,,,]]"
+                'pycsw:Links': 'links',
+            }
+        }
+
+        self.model = {
+            'operations': {
+                'GetCapabilities': {
+                    'methods': {
+                        'get': True,
+                        'post': True,
+                    },
+                    'parameters': {
+                        'sections': {
+                            'values': ['ServiceIdentification', 'ServiceProvider',
+                            'OperationsMetadata', 'Filter_Capabilities']
+                        }
+                    }
+                },
+                'DescribeRecord': {
+                    'methods': {
+                        'get': True,
+                        'post': True,
+                    },
+                    'parameters': {
+                        'schemaLanguage': {
+                            'values': ['http://www.w3.org/XML/Schema',
+                            'http://www.w3.org/TR/xmlschema-1/']
+                        },
+                        'typeName': {
+                            'values': ['csw:Record']
+                        },
+                        'outputFormat': {
+                            'values': ['application/xml', 'application/json']
+                        }
+                    }
+                },
+                'GetRecords': {
+                    'methods': {
+                        'get': True,
+                        'post': True,
+                    },
+                    'parameters': {
+                        'resultType': {
+                            'values': ['hits', 'results', 'validate']
+                        },
+                        'typeNames': {
+                            'values': ['csw:Record']
+                        },
+                        'outputSchema': {
+                            'values': ['http://www.opengis.net/cat/csw/2.0.2']
+                        },
+                        'outputFormat': {
+                            'values': ['application/xml', 'application/json']
+                        },
+                        'CONSTRAINTLANGUAGE': {
+                            'values': ['FILTER', 'CQL_TEXT']
+                        },
+                        'ElementSetName': {
+                            'values': ['brief', 'summary', 'full']
+                        }
+                    },
+                    'constraints': {
+                    }
+                },
+                'GetRecordById': {
+                    'methods': {
+                        'get': True,
+                        'post': True,
+                    },
+                    'parameters': {
+                        'outputSchema': {
+                            'values': ['http://www.opengis.net/cat/csw/2.0.2']
+                        },
+                        'outputFormat': {
+                            'values': ['application/xml', 'application/json']
+                        },
+                        'ElementSetName': {
+                            'values': ['brief', 'summary', 'full']
+                        }
+                    }
+                },
+                'GetRepositoryItem': {
+                    'methods': {
+                        'get': True,
+                        'post': False,
+                    },
+                    'parameters': {
+                    }
+                }
+            },
+            'parameters': {
+                'version': {
+                    'values': ['2.0.2']
+                },
+                'service': {
+                    'values': ['CSW']
+                }
+            },
+            'constraints': {
+                'PostEncoding': {
+                    'values': ['XML', 'SOAP']
+                },
+                'XPathQueryables': {
+                    'values': ['allowed']
+                }
+            },
+            'typenames': {
+                'csw:Record': {
+                    'outputschema': 'http://www.opengis.net/cat/csw/2.0.2',
+                    'queryables': {
+                        'SupportedDublinCoreQueryables': {
+                            # map Dublin Core queryables to core metadata model
+                            'dc:title':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Title']},
+                            'dc:creator':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Creator']},
+                            'dc:subject':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Keywords']},
+                            'dct:abstract':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Abstract']},
+                            'dc:publisher':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Publisher']},
+                            'dc:contributor':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Contributor']},
+                            'dct:modified':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Modified']},
+                            'dc:date':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Date']},
+                            'dc:type':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Type']},
+                            'dc:format':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Format']},
+                            'dc:identifier':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Identifier']},
+                            'dc:source':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Source']},
+                            'dc:language':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Language']},
+                            'dc:relation':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:Relation']},
+                            'dc:rights':
+                            {'dbcol':
+                             self.md_core_model['mappings']['pycsw:AccessConstraints']},
+                            # bbox and full text map to internal fixed columns
+                            'ows:BoundingBox':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:BoundingBox']},
+                            'csw:AnyText':
+                            {'dbcol': self.md_core_model['mappings']['pycsw:AnyText']},
+                        }
+                    }
+                }
+            }
+        }
+
+    def gen_domains(self):
+        """Generate parameter domain model"""
+        domain = {}
+        domain['methods'] = {'get': True, 'post': True}
+        domain['parameters'] = {'ParameterName': {'values': []}}
+        for operation in self.model['operations'].keys():
+            for parameter in self.model['operations'][operation]['parameters']:
+                domain['parameters']['ParameterName']['values'].append('%s.%s' %
+                                                        (operation, parameter))
+        return domain
+
+    def refresh_dc(self, mappings):
+        """Refresh Dublin Core mappings"""
+
+        LOGGER.debug('refreshing Dublin Core mappings with %s' % str(mappings))
+
+        defaults = {
+            'dc:title': 'pycsw:Title',
+            'dc:creator': 'pycsw:Creator',
+            'dc:subject': 'pycsw:Keywords',
+            'dct:abstract': 'pycsw:Abstract',
+            'dc:publisher': 'pycsw:Publisher',
+            'dc:contributor': 'pycsw:Contributor',
+            'dct:modified': 'pycsw:Modified',
+            'dc:date': 'pycsw:Date',
+            'dc:type': 'pycsw:Type',
+            'dc:format': 'pycsw:Format',
+            'dc:identifier': 'pycsw:Identifier',
+            'dc:source': 'pycsw:Source',
+            'dc:language': 'pycsw:Language',
+            'dc:relation': 'pycsw:Relation',
+            'dc:rights': 'pycsw:AccessConstraints',
+            'ows:BoundingBox': 'pycsw:BoundingBox',
+            'csw:AnyText': 'pycsw:AnyText',
+        }
+
+        for k, val in defaults.iteritems():
+            self.model['typenames']['csw:Record']['queryables']['SupportedDublinCoreQueryables'][k] = \
+                {'dbcol': mappings['mappings'][val]}
diff --git a/pycsw/fes.py b/pycsw/fes.py
new file mode 100644
index 0000000..e25b473
--- /dev/null
+++ b/pycsw/fes.py
@@ -0,0 +1,400 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#          Angelos Tzotsos <tzotsos at gmail.com>
+#
+# Copyright (c) 2010 Tom Kralidis
+# Copyright (c) 2014 Angelos Tzotsos
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import logging
+from pycsw import gml, util
+
+LOGGER = logging.getLogger(__name__)
+
+MODEL = {
+    'GeometryOperands': {
+        'values': gml.TYPES
+    },
+    'SpatialOperators': {
+        'values': ['BBOX', 'Beyond', 'Contains', 'Crosses', 'Disjoint',
+        'DWithin', 'Equals', 'Intersects', 'Overlaps', 'Touches', 'Within']
+    },
+    'ComparisonOperators': {
+        'ogc:PropertyIsBetween': {'opname': 'Between', 'opvalue': 'and'},
+        'ogc:PropertyIsEqualTo': {'opname': 'EqualTo', 'opvalue': '='},
+        'ogc:PropertyIsGreaterThan': {'opname': 'GreaterThan', 'opvalue': '>'},
+        'ogc:PropertyIsGreaterThanOrEqualTo': {
+            'opname': 'GreaterThanEqualTo', 'opvalue': '>='},
+        'ogc:PropertyIsLessThan': {'opname': 'LessThan', 'opvalue': '<'},
+        'ogc:PropertyIsLessThanOrEqualTo': {
+            'opname': 'LessThanEqualTo', 'opvalue': '<='},
+        'ogc:PropertyIsLike': {'opname': 'Like', 'opvalue': 'like'},
+        'ogc:PropertyIsNotEqualTo': {'opname': 'NotEqualTo', 'opvalue': '!='},
+        'ogc:PropertyIsNull': {'opname': 'NullCheck', 'opvalue': 'is null'},
+    },
+    'Functions': {
+        'length': {'args': '1'},
+        'lower': {'args': '1'},
+        'ltrim': {'args': '1'},
+        'rtrim': {'args': '1'},
+        'trim': {'args': '1'},
+        'upper': {'args': '1'},
+    },
+    'Ids': {
+        'values': ['EID', 'FID']
+    }
+}
+
+
+def parse(element, queryables, dbtype, nsmap, orm='sqlalchemy', language='english', fts=False):
+    """OGC Filter object support"""
+
+    boq = None
+    is_pg = dbtype.startswith('postgresql')
+
+    tmp = element.xpath('ogc:And|ogc:Or|ogc:Not', namespaces=nsmap)
+    if len(tmp) > 0:  # this is binary logic query
+        boq = ' %s ' % util.xmltag_split(tmp[0].tag).lower()
+        LOGGER.debug('Binary logic detected; operator=%s' % boq)
+        tmp = tmp[0]
+    else:
+        tmp = element
+
+    pvalue_serial = [0]  # in list as python 2 has no nonlocal variable
+    def assign_param():
+        if orm == 'django':
+            return '%s'
+        param = ':pvalue%d' % pvalue_serial[0]
+        pvalue_serial[0] += 1
+        return param
+
+    def _get_comparison_expression(elem):
+        """return the SQL expression based on Filter query"""
+        fname = None
+        matchcase = elem.attrib.get('matchCase')
+        wildcard = elem.attrib.get('wildCard')
+        singlechar = elem.attrib.get('singleChar')
+        expression = None
+
+        if wildcard is None:
+            wildcard = '%'
+
+        if singlechar is None:
+            singlechar = '_'
+
+        if (elem.xpath('child::*')[0].tag ==
+                util.nspath_eval('ogc:Function', nsmap)):
+            LOGGER.debug('ogc:Function detected')
+            if (elem.xpath('child::*')[0].attrib['name'] not in
+                    MODEL['Functions']):
+                raise RuntimeError('Invalid ogc:Function: %s' %
+                                   (elem.xpath('child::*')[0].attrib['name']))
+            fname = elem.xpath('child::*')[0].attrib['name']
+
+            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:
+                raise RuntimeError('Invalid PropertyName: %s.  %s' % (elem.find(util.nspath_eval('ogc:Function/ogc:PropertyName', nsmap)).text, str(err)))
+
+        else:
+            try:
+                LOGGER.debug('Testing existence of ogc:PropertyName')
+                pname = queryables[elem.find(
+                    util.nspath_eval('ogc:PropertyName', nsmap)).text]['dbcol']
+            except Exception, err:
+                raise RuntimeError('Invalid PropertyName: %s.  %s' %
+                                   (elem.find(util.nspath_eval('ogc:PropertyName',
+                                   nsmap)).text, str(err)))
+
+        if (elem.tag != util.nspath_eval('ogc:PropertyIsBetween', nsmap)):
+            pval = elem.find(util.nspath_eval('ogc:Literal', nsmap)).text
+
+        com_op = _get_comparison_operator(elem)
+        LOGGER.debug('Comparison operator: %s' % com_op)
+
+        # if this is a case insensitive search
+        # then set the DB-specific LIKE comparison operator
+
+        LOGGER.debug('Setting csw:AnyText property')
+
+        anytext = queryables['csw:AnyText']['dbcol']
+        if ((matchcase is not None and matchcase == 'false') or
+                pname == anytext):
+            com_op = 'ilike' if is_pg else 'like'
+
+        if (elem.tag == util.nspath_eval('ogc:PropertyIsBetween', nsmap)):
+            com_op = 'between'
+            lower_boundary = elem.find(
+                util.nspath_eval('ogc:LowerBoundary/ogc:Literal',
+                                 nsmap)).text
+            upper_boundary = elem.find(
+                util.nspath_eval('ogc:UpperBoundary/ogc:Literal',
+                                 nsmap)).text
+            expression = "%s %s %s and %s" % \
+                           (pname, com_op, assign_param(), assign_param())
+            values.append(lower_boundary)
+            values.append(upper_boundary)
+        else:
+            if pname == anytext and is_pg and fts:
+                LOGGER.debug('PostgreSQL FTS specific search')
+                # do nothing, let FTS do conversion (#212)
+                pvalue = pval
+            else:
+                LOGGER.debug('PostgreSQL non-FTS specific search')
+                pvalue = pval.replace(wildcard, '%').replace(singlechar, '_')
+
+                if pname == anytext:  # pad anytext with wildcards
+                    LOGGER.debug('PostgreSQL non-FTS specific anytext search')
+                    LOGGER.debug('old value: %s', pval)
+
+                    pvalue = '%%%s%%' % pvalue.rstrip('%').lstrip('%')
+
+                    LOGGER.debug('new value: %s', pvalue)
+
+            values.append(pvalue)
+
+            if boq == ' not ':
+                if fname is not None:
+                    expression = "%s is null or not %s(%s) %s %s" % \
+                                   (pname, fname, pname, com_op, assign_param())
+                elif pname == anytext and is_pg and fts:
+                    LOGGER.debug('PostgreSQL FTS specific search')
+                    expression = ("%s is null or not plainto_tsquery('%s', %s) @@ anytext_tsvector" %
+                                  (anytext, language, assign_param()))
+                else:
+                    LOGGER.debug('PostgreSQL non-FTS specific search')
+                    expression = "%s is null or not %s %s %s" % \
+                                   (pname, pname, com_op, assign_param())
+            else:
+                if fname is not None:
+                    expression = "%s(%s) %s %s" % \
+                                   (fname, pname, com_op, assign_param())
+                elif pname == anytext and is_pg and fts:
+                    LOGGER.debug('PostgreSQL FTS specific search')
+                    expression = ("plainto_tsquery('%s', %s) @@ anytext_tsvector" %
+                                  (language, assign_param()))
+                else:
+                    LOGGER.debug('PostgreSQL non-FTS specific search')
+                    expression = "%s %s %s" % (pname, com_op, assign_param())
+
+        return expression
+
+    queries = []
+    queries_nested = []
+    values = []
+
+    LOGGER.debug('Scanning children elements')
+    for child in tmp.xpath('child::*'):
+        com_op = ''
+        boolean_true = '\'true\''
+        boolean_false = '\'false\''
+
+        if dbtype == 'mysql':
+            boolean_true = 'true'
+            boolean_false = 'false'
+
+        if child.tag == util.nspath_eval('ogc:Not', nsmap):
+            LOGGER.debug('ogc:Not query detected')
+            child_not = child.xpath('child::*')[0]
+            if child_not.tag in \
+                [util.nspath_eval('ogc:%s' % n, nsmap) for n in
+                    MODEL['SpatialOperators']['values']]:
+                LOGGER.debug('ogc:Not / spatial operator detected: %s' % child.tag)
+                queries.append("%s = %s" %
+                               (_get_spatial_operator(
+                                   queryables['pycsw:BoundingBox'],
+                                   child.xpath('child::*')[0], dbtype, nsmap),
+                                   boolean_false))
+            else:
+                LOGGER.debug('ogc:Not / comparison operator detected: %s' % child.tag)
+                queries.append('not %s' % _get_comparison_expression(child_not))
+
+        elif child.tag in \
+            [util.nspath_eval('ogc:%s' % n, nsmap) for n in
+                MODEL['SpatialOperators']['values']]:
+            LOGGER.debug('spatial operator detected: %s' % child.tag)
+            if boq is not None and boq == ' not ':
+                # for ogc:Not spatial queries in PostGIS we must explictly
+                # test that pycsw:BoundingBox is null as well
+                # TODO: Do we need the same for 'postgresql+postgis+native'???
+                if dbtype == 'postgresql+postgis+wkt':
+                    LOGGER.debug('Setting bbox is null test in PostgreSQL')
+                    queries.append("%s = %s or %s is null" %
+                                   (_get_spatial_operator(
+                                       queryables['pycsw:BoundingBox'],
+                                       child, dbtype, nsmap), boolean_false,
+                                       queryables['pycsw:BoundingBox']))
+                else:
+                    queries.append("%s = %s" %
+                                   (_get_spatial_operator(
+                                       queryables['pycsw:BoundingBox'],
+                                       child, dbtype, nsmap), boolean_false))
+            else:
+                queries.append("%s = %s" %
+                               (_get_spatial_operator(
+                                   queryables['pycsw:BoundingBox'],
+                                   child, dbtype, nsmap), boolean_true))
+
+        elif child.tag == util.nspath_eval('ogc:FeatureId', nsmap):
+            LOGGER.debug('ogc:FeatureId filter detected')
+            queries.append("%s = %s" % (queryables['pycsw:Identifier'], assign_param()))
+            values.append(child.attrib.get('fid'))
+        else:  # comparison operator
+            LOGGER.debug('Comparison operator processing')
+            tagname = ' %s ' % util.xmltag_split(child.tag).lower()
+            if tagname in [' or ', ' and ']:  # this is a nested binary logic query
+                LOGGER.debug('Nested binary logic detected; operator=%s' % tagname)
+                for child2 in child.xpath('child::*'):
+                    queries_nested.append(_get_comparison_expression(child2))
+                queries.append('(%s)' % tagname.join(queries_nested))
+            else:
+                queries.append(_get_comparison_expression(child))
+
+    where = boq.join(queries) if (boq is not None and boq != ' not ') \
+        else queries[0]
+
+    return where, values
+
+
+def _get_spatial_operator(geomattr, element, dbtype, nsmap, postgis_geometry_column='wkb_geometry'):
+    """return the spatial predicate function"""
+    property_name = element.find(util.nspath_eval('ogc:PropertyName', nsmap))
+    distance = element.find(util.nspath_eval('ogc:Distance', nsmap))
+
+    distance = 'false' if distance is None else distance.text
+
+    LOGGER.debug('Scanning for spatial property name')
+
+    if property_name is None:
+        raise RuntimeError('Missing ogc:PropertyName in spatial filter')
+    if (property_name.text.find('BoundingBox') == -1 and
+            property_name.text.find('Envelope') == -1):
+        raise RuntimeError('Invalid ogc:PropertyName in spatial filter: %s' %
+                           property_name.text)
+
+    geometry = gml.Geometry(element, nsmap)
+    
+    #make decision to apply spatial ranking to results
+    set_spatial_ranking(geometry)
+
+    spatial_predicate = util.xmltag_split(element.tag).lower()
+
+    LOGGER.debug('Spatial predicate: %s' % spatial_predicate)
+
+    if dbtype == 'mysql':  # adjust spatial query for MySQL
+        LOGGER.debug('Adjusting spatial query for MySQL')
+        if spatial_predicate == 'bbox':
+            spatial_predicate = 'intersects'
+
+        if spatial_predicate == 'beyond':
+            spatial_query = "ifnull(distance(geomfromtext(%s), \
+            geomfromtext('%s')) > convert(%s, signed),false)" % \
+                (geomattr, geometry.wkt, distance)
+        elif spatial_predicate == 'dwithin':
+            spatial_query = "ifnull(distance(geomfromtext(%s), \
+            geomfromtext('%s')) <= convert(%s, signed),false)" % \
+                (geomattr, geometry.wkt, distance)
+        else:
+            spatial_query = "ifnull(%s(geomfromtext(%s), \
+            geomfromtext('%s')),false)" % \
+                (spatial_predicate, geomattr, geometry.wkt)
+
+    elif dbtype == 'postgresql+postgis+wkt':  # adjust spatial query for PostGIS with WKT geometry column
+        LOGGER.debug('Adjusting spatial query for PostgreSQL+PostGIS+WKT')
+        if spatial_predicate == 'bbox':
+            spatial_predicate = 'intersects'
+
+        if spatial_predicate == 'beyond':
+            spatial_query = "not st_dwithin(st_geomfromtext(%s), \
+            st_geomfromtext('%s'), %f)" % \
+                (geomattr, geometry.wkt, float(distance))
+        elif spatial_predicate == 'dwithin':
+            spatial_query = "st_dwithin(st_geomfromtext(%s), \
+            st_geomfromtext('%s'), %f)" % \
+                (geomattr, geometry.wkt, float(distance))
+        else:
+            spatial_query = "st_%s(st_geomfromtext(%s), \
+            st_geomfromtext('%s'))" % \
+                (spatial_predicate, geomattr, geometry.wkt)
+                
+    elif dbtype == 'postgresql+postgis+native':  # adjust spatial query for PostGIS with native geometry
+        LOGGER.debug('Adjusting spatial query for PostgreSQL+PostGIS+native')
+        if spatial_predicate == 'bbox':
+            spatial_predicate = 'intersects'
+
+        if spatial_predicate == 'beyond':
+            spatial_query = "not st_dwithin(%s, \
+            st_geomfromtext('%s',4326), %f)" % \
+                (postgis_geometry_column, geometry.wkt, float(distance))
+        elif spatial_predicate == 'dwithin':
+            spatial_query = "st_dwithin(%s, \
+            st_geomfromtext('%s',4326), %f)" % \
+                (postgis_geometry_column, geometry.wkt, float(distance))
+        else:
+            spatial_query = "st_%s(%s, \
+            st_geomfromtext('%s',4326))" % \
+                (spatial_predicate, postgis_geometry_column, geometry.wkt)
+                
+    else:
+        LOGGER.debug('Adjusting spatial query')
+        spatial_query = "query_spatial(%s,'%s','%s','%s')" % \
+                        (geomattr, geometry.wkt, spatial_predicate, distance)
+
+    return spatial_query
+
+
+def _get_comparison_operator(element):
+    """return the SQL operator based on Filter query"""
+
+    return MODEL['ComparisonOperators']['ogc:%s' % util.xmltag_split(element.tag)]['opvalue']
+
+def set_spatial_ranking(geometry):
+    """Given that we have a spatial query in ogc:Filter we check the type of geometry 
+    and set the ranking variables"""
+    
+    if util.ranking_enabled:
+        if geometry.type in ['Polygon', 'Envelope']:
+            util.ranking_pass = True
+            util.ranking_query_geometry = geometry.wkt
+        elif geometry.type in ['LineString', 'Point']:
+            from shapely.geometry.base import BaseGeometry
+            from shapely.geometry import box
+            from shapely.wkt import loads,dumps
+            ls = loads(geometry.wkt)
+            b = ls.bounds
+            if geometry.type == 'LineString':
+                tmp_box = box(b[0],b[1],b[2],b[3])
+                tmp_wkt = dumps(tmp_box)
+                if tmp_box.area > 0:
+                    util.ranking_pass = True
+                    util.ranking_query_geometry = tmp_wkt
+            elif geometry.type == 'Point':
+                tmp_box = box((float(b[0])-1.0),(float(b[1])-1.0),(float(b[2])+1.0),(float(b[3])+1.0))
+                tmp_wkt = dumps(tmp_box)
+                util.ranking_pass = True
+                util.ranking_query_geometry = tmp_wkt
diff --git a/pycsw/formats/__init__.py b/pycsw/formats/__init__.py
new file mode 100644
index 0000000..0b17d0e
--- /dev/null
+++ b/pycsw/formats/__init__.py
@@ -0,0 +1,29 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
diff --git a/pycsw/formats/fmt_json.py b/pycsw/formats/fmt_json.py
new file mode 100644
index 0000000..71e5ac5
--- /dev/null
+++ b/pycsw/formats/fmt_json.py
@@ -0,0 +1,39 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import json
+from pycsw.util import exml2dict
+
+
+def exml2json(response, namespaces, pretty_print=False):
+    """Convert an lxml object to JSON"""
+    if pretty_print:
+        return json.dumps(exml2dict(response, namespaces), indent=4)
+    return json.dumps(exml2dict(response, namespaces))
diff --git a/pycsw/gml.py b/pycsw/gml.py
new file mode 100644
index 0000000..b1156fa
--- /dev/null
+++ b/pycsw/gml.py
@@ -0,0 +1,231 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2010 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import logging
+from pycsw import util
+from owslib import crs
+
+LOGGER = logging.getLogger(__name__)
+
+TYPES = ['gml:Point', 'gml:LineString', 'gml:Polygon', 'gml:Envelope']
+
+DEFAULT_SRS = crs.Crs('urn:x-ogc:def:crs:EPSG:6.11:4326')
+
+
+def _poslist2wkt(poslist, axisorder):
+    """Repurpose gml:posList into WKT aware list"""
+
+    tmp = poslist.split()
+    poslist2 = []
+
+    xlist = tmp[1::2]
+    ylist = tmp[::2]
+
+    if axisorder == 'yx':
+        for i, j in zip(ylist, xlist):
+            poslist2.append('%s %s' % (i, j))
+    else:
+        for i, j in zip(xlist, ylist):
+            poslist2.append('%s %s' % (i, j))
+
+    return ', '.join(poslist2)
+
+
+class Geometry(object):
+    """base geometry class"""
+
+    def __init__(self, element, nsmap):
+        """initialize geometry parser"""
+
+        self.nsmap = nsmap
+        self.type = None
+        self.wkt = None
+        self.crs = None
+        self._exml = element
+
+        # return OGC WKT for GML geometry
+
+        operand = element.xpath(
+            '|'.join(TYPES),
+            namespaces={'gml': 'http://www.opengis.net/gml'})[0]
+
+        if 'srsName' in operand.attrib:
+            LOGGER.debug('geometry srsName detected')
+            self.crs = crs.Crs(operand.attrib['srsName'])
+        else:
+            LOGGER.debug('setting default geometry srsName %s' % DEFAULT_SRS)
+            self.crs = DEFAULT_SRS
+
+        self.type = util.xmltag_split(operand.tag)
+
+        if self.type == 'Point':
+            self._get_point()
+        elif self.type == 'LineString':
+            self._get_linestring()
+        elif self.type == 'Polygon':
+            self._get_polygon()
+        elif self.type == 'Envelope':
+            self._get_envelope()
+        else:
+            raise RuntimeError('Unsupported geometry type (Must be one of %s)'
+                               % ','.join(TYPES))
+
+        # reproject data if needed
+        if self.crs is not None and self.crs.code != 4326:
+            LOGGER.debug('transforming geometry to 4326')
+            try:
+                self.wkt = self.transform(self.crs.code, DEFAULT_SRS.code)
+            except Exception, err:
+                raise RuntimeError('Reprojection error: Invalid srsName '
+                                   '"%s": %s' % (self.crs.id, str(err)))
+
+    def _get_point(self):
+        """Parse gml:Point"""
+
+        tmp = self._exml.find(util.nspath_eval('gml:Point/gml:pos',
+                                               self.nsmap))
+
+        if tmp is None:
+            raise RuntimeError('Invalid gml:Point geometry.  Missing gml:pos')
+        else:
+            xypoint = tmp.text.split()
+            if self.crs.axisorder == 'yx':
+                self.wkt = 'POINT(%s %s)' % (xypoint[1], xypoint[0])
+            else:
+                self.wkt = 'POINT(%s %s)' % (xypoint[0], xypoint[1])
+
+    def _get_linestring(self):
+        """Parse gml:LineString"""
+
+        tmp = self._exml.find(util.nspath_eval('gml:LineString/gml:posList',
+                                               self.nsmap))
+
+        if tmp is None:
+            raise RuntimeError('Invalid gml:LineString geometry.\
+                               Missing gml:posList')
+        else:
+            self.wkt = 'LINESTRING(%s)' % _poslist2wkt(tmp.text,
+                                                       self.crs.axisorder)
+
+    def _get_polygon(self):
+        """Parse gml:Polygon"""
+
+        tmp = self._exml.find('.//%s' % util.nspath_eval('gml:posList',
+                                                         self.nsmap))
+
+        if tmp is None:
+            raise RuntimeError('Invalid gml:LineString geometry.\
+                               Missing gml:posList')
+        else:
+            self.wkt = 'POLYGON((%s))' % _poslist2wkt(tmp.text,
+                                                      self.crs.axisorder)
+
+    def _get_envelope(self):
+        """Parse gml:Envelope"""
+
+        tmp = self._exml.find(util.nspath_eval('gml:Envelope/gml:lowerCorner',
+                                               self.nsmap))
+        if tmp is None:
+            raise RuntimeError('Invalid gml:Envelope geometry.\
+                               Missing gml:lowerCorner')
+        else:
+            lower_left = tmp.text
+
+        tmp = self._exml.find(util.nspath_eval('gml:Envelope/gml:upperCorner',
+                                               self.nsmap))
+        if tmp is None:
+            raise RuntimeError('Invalid gml:Envelope geometry.\
+                               Missing gml:upperCorner')
+        else:
+            upper_right = tmp.text
+
+        llmin = lower_left.split()
+        urmax = upper_right.split()
+
+        if len(llmin) < 2 or len(urmax) < 2:
+            raise RuntimeError('Invalid gml:Envelope geometry. \
+            gml:lowerCorner and gml:upperCorner must hold at least x and y')
+
+        if self.crs.axisorder == 'yx':
+            self.wkt = util.bbox2wktpolygon('%s,%s,%s,%s' % (llmin[1],
+                                            llmin[0], urmax[1], urmax[0]))
+        else:
+            self.wkt = util.bbox2wktpolygon('%s,%s,%s,%s' % (llmin[0],
+                                            llmin[1], urmax[0], urmax[1]))
+
+    def transform(self, src, dest):
+        """transform coordinates from one CRS to another"""
+
+        import pyproj
+        from shapely.geometry import Point, LineString, Polygon
+        from shapely.wkt import loads
+
+        LOGGER.debug('Transforming geometry from %s to %s' % (src, dest))
+
+        vertices = []
+
+        try:
+            proj_src = pyproj.Proj(init='epsg:%s' % src)
+        except:
+            raise RuntimeError('Invalid source projection')
+
+        try:
+            proj_dst = pyproj.Proj(init='epsg:%s' % dest)
+        except:
+            raise RuntimeError('Invalid destination projection')
+
+        geom = loads(self.wkt)
+
+        if geom.type == 'Point':
+            newgeom = Point(pyproj.transform(proj_src, proj_dst,
+                            geom.x, geom.y))
+            wkt2 = newgeom.wkt
+
+        elif geom.type == 'LineString':
+            for vertice in list(geom.coords):
+                newgeom = pyproj.transform(proj_src, proj_dst,
+                                           vertice[0], vertice[1])
+                vertices.append(newgeom)
+
+            linestring = LineString(vertices)
+
+            wkt2 = linestring.wkt
+
+        elif geom.type == 'Polygon':
+            for vertice in list(geom.exterior.coords):
+                newgeom = pyproj.transform(proj_src, proj_dst,
+                                           vertice[0], vertice[1])
+                vertices.append(newgeom)
+
+            polygon = Polygon(vertices)
+
+            wkt2 = polygon.wkt
+
+        return wkt2
diff --git a/pycsw/log.py b/pycsw/log.py
new file mode 100644
index 0000000..fada401
--- /dev/null
+++ b/pycsw/log.py
@@ -0,0 +1,100 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import logging
+
+LOGGER = logging.getLogger(__name__)
+
+MSG_FORMAT = '%(asctime)s] [%(levelname)s] file=%(pathname)s \
+line=%(lineno)s module=%(module)s function=%(funcName)s %(message)s'
+
+TIME_FORMAT = '%a, %d %b %Y %H:%M:%S'
+
+LOGLEVELS = {
+    'CRITICAL': logging.CRITICAL,
+    'ERROR': logging.ERROR,
+    'WARNING': logging.WARNING,
+    'INFO': logging.INFO,
+    'DEBUG': logging.DEBUG,
+    'NOTSET': logging.NOTSET,
+}
+
+
+def setup_logger(config=None):
+    """Initialize logging facility"""
+    if config is None:
+        return None
+
+    # Do not proceed if logging has not been set up.
+    if not (config.has_option('server', 'loglevel') or
+            config.has_option('server', 'logfile')):
+        return None
+
+    logfile = None
+    loglevel = 'NOTSET'
+
+    if config.has_option('server', 'loglevel'):
+        loglevel = config.get('server', 'loglevel')
+
+        if loglevel not in LOGLEVELS.keys():
+            raise RuntimeError(
+                'Invalid server configuration (server.loglevel).')
+
+        if not config.has_option('server', 'logfile'):
+            raise RuntimeError(
+                'Invalid server configuration (server.loglevel set,\
+                but server.logfile missing).')
+
+    if config.has_option('server', 'logfile'):
+        if not config.has_option('server', 'loglevel'):
+            raise RuntimeError(
+                'Invalid server configuration (server.logfile set,\
+                but server.loglevel missing).')
+
+        logfile = config.get('server', 'logfile')
+
+    if loglevel != 'NOTSET' and logfile is None:
+        raise RuntimeError(
+            'Invalid server configuration \
+            (server.loglevel set, but server.logfile is not).')
+
+    # Setup logging globally (not only for the pycsw module)
+    # based on the parameters passed.
+    logging.basicConfig(level=LOGLEVELS[loglevel],
+                        filename=logfile,
+                        datefmt=TIME_FORMAT,
+                        format=MSG_FORMAT)
+
+    LOGGER.info('Logging initialized (level: %s).' % loglevel)
+
+    if loglevel == 'DEBUG':  # turn on CGI debugging
+        LOGGER.info('CGI debugging enabled.')
+        import cgitb
+        cgitb.enable()
diff --git a/pycsw/metadata.py b/pycsw/metadata.py
new file mode 100644
index 0000000..52e4e5b
--- /dev/null
+++ b/pycsw/metadata.py
@@ -0,0 +1,1040 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import logging
+import uuid
+from urlparse import urlparse
+from lxml import etree
+from owslib.util import build_get_url
+from pycsw import util
+
+LOGGER = logging.getLogger(__name__)
+
+def parse_record(context, record, repos=None,
+    mtype='http://www.opengis.net/cat/csw/2.0.2',
+    identifier=None, pagesize=10):
+    ''' parse metadata '''
+
+    if identifier is None:
+        identifier = uuid.uuid4().get_urn()
+
+    # parse web services
+    if (mtype == 'http://www.opengis.net/cat/csw/2.0.2' and
+        isinstance(record, str) and record.startswith('http')):
+        LOGGER.debug('CSW service detected, fetching via HTTP')
+        # CSW service, not csw:Record
+        try:
+            return _parse_csw(context, repos, record, identifier, pagesize)
+        except Exception, err:
+            # TODO: implement better exception handling
+            if str(err).find('ExceptionReport') != -1:
+                msg = 'CSW harvesting error: %s' % str(err)
+                LOGGER.debug(msg)
+                raise RuntimeError(msg)
+            LOGGER.debug('Not a CSW, attempting to fetch Dublin Core')
+            try:
+                content = util.http_request('GET', record)
+            except Exception, err:
+                raise RuntimeError('HTTP error: %s' % str(err))
+            return [_parse_dc(context, repos, etree.fromstring(content))]
+
+    elif mtype == 'urn:geoss:waf':  # WAF
+        LOGGER.debug('WAF detected, fetching via HTTP')
+        return _parse_waf(context, repos, record, identifier)
+
+    elif mtype == 'http://www.opengis.net/wms':  # WMS
+        LOGGER.debug('WMS detected, fetching via OWSLib')
+        return _parse_wms(context, repos, record, identifier)
+     
+    elif mtype == 'http://www.opengis.net/wps/1.0.0':  # WPS
+        LOGGER.debug('WPS detected, fetching via OWSLib')
+        return [_parse_wps(context, repos, record, identifier)]
+
+    elif mtype == 'http://www.opengis.net/wfs':  # WFS
+        LOGGER.debug('WFS detected, fetching via OWSLib')
+        return _parse_wfs(context, repos, record, identifier)
+
+    elif mtype == 'http://www.opengis.net/wcs':  # WCS
+        LOGGER.debug('WCS detected, fetching via OWSLib')
+        return _parse_wcs(context, repos, record, identifier)
+
+    elif mtype == 'http://www.opengis.net/sos/1.0':  # SOS 1.0.0
+        LOGGER.debug('SOS 1.0.0 detected, fetching via OWSLib')
+        return _parse_sos(context, repos, record, identifier, '1.0.0')
+
+    elif mtype == 'http://www.opengis.net/sos/2.0':  # SOS 2.0.0
+        LOGGER.debug('SOS 2.0.0 detected, fetching via OWSLib')
+        return _parse_sos(context, repos, record, identifier, '2.0.0')
+
+    elif (mtype == 'http://www.opengis.net/cat/csw/csdgm' and
+          record.startswith('http')):  # FGDC
+        LOGGER.debug('FGDC detected, fetching via HTTP')
+        record = util.http_request('GET', record)
+
+    return _parse_metadata(context, repos, record)
+
+def _set(context, obj, name, value):
+    ''' convenience method to set values '''
+    setattr(obj, context.md_core_model['mappings'][name], value)
+
+def _parse_metadata(context, repos, record):
+    """parse metadata formats"""
+
+    if isinstance(record, str):
+        exml = etree.fromstring(record)
+    else:  # already serialized to lxml
+        if hasattr(record, 'getroot'):  # standalone document
+            exml = record.getroot()
+        else:  # part of a larger document
+            exml = record
+
+    root = exml.tag
+
+    LOGGER.debug('Serialized metadata, parsing content model')
+
+    if root == '{%s}MD_Metadata' % context.namespaces['gmd']:  # ISO
+        return [_parse_iso(context, repos, exml)]
+    elif root == '{http://www.isotc211.org/2005/gmi}MI_Metadata':
+        # ISO Metadata for Imagery
+        return [_parse_iso(context, repos, exml)]
+    elif root == 'metadata':  # FGDC
+        return [_parse_fgdc(context, repos, exml)]
+    elif root == '{%s}Record' % context.namespaces['csw']:  # Dublin Core CSW
+        return [_parse_dc(context, repos, exml)]
+    elif root == '{%s}RDF' % context.namespaces['rdf']:  # Dublin Core RDF
+        return [_parse_dc(context, repos, exml)]
+    elif root == '{%s}DIF' % context.namespaces['dif']:  # DIF
+        pass  # TODO
+    else:
+        raise RuntimeError('Unsupported metadata format')
+
+
+def _parse_csw(context, repos, record, identifier, pagesize=10):
+
+    from owslib.csw import CatalogueServiceWeb
+
+    recobjs = []  # records
+    serviceobj = repos.dataset()
+
+    # if init raises error, this might not be a CSW
+    md = CatalogueServiceWeb(record)
+
+    # generate record of service instance
+    _set(context, serviceobj, 'pycsw:Identifier', identifier)
+    _set(context, serviceobj, 'pycsw:Typename', 'csw:Record')
+    _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)
+    _set(context, serviceobj, 'pycsw:Abstract', md.identification.abstract)
+    _set(context, serviceobj, 'pycsw:Keywords', ','.join(md.identification.keywords))
+    _set(context, serviceobj, 'pycsw:Creator', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:Publisher', md.provider.name)
+    _set(context, serviceobj, 'pycsw:Contributor', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:OrganizationName', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:AccessConstraints', md.identification.accessconstraints)
+    _set(context, serviceobj, 'pycsw:OtherConstraints', md.identification.fees)
+    _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:ServiceTypeVersion', md.identification.version)
+    _set(context, serviceobj, 'pycsw:Operation', ','.join([d.name for d in md.operations]))
+    _set(context, serviceobj, 'pycsw:CouplingType', 'tight')
+
+    links = [
+        '%s,OGC-CSW Catalogue Service for the Web,OGC:CSW,%s' % (identifier, md.url)
+    ]
+
+    _set(context, serviceobj, 'pycsw:Links', '^'.join(links))
+
+    recobjs.append(serviceobj)
+
+    # get all supported typenames of metadata
+    # so we can harvest the entire CSW
+
+    csw_typenames = 'csw:Record'
+
+    # now get all records
+    # get total number of records to loop against
+
+    try:
+        md.getrecords2(typenames=csw_typenames, resulttype='hits')
+        matches = md.results['matches']
+    except:  # this is a CSW, but server rejects query
+        raise RuntimeError(md.response)
+
+    if pagesize > matches:
+        pagesize = matches
+
+    LOGGER.debug('Harvesting %d CSW records' % matches)
+
+    # loop over all catalogue records incrementally
+    for r in range(1, matches, pagesize):
+        try:
+            md.getrecords2(typenames=csw_typenames, startposition=r,
+                          maxrecords=pagesize)
+        except Exception, err:  # this is a CSW, but server rejects query
+            raise RuntimeError(md.response)
+        for k, v in md.records.iteritems():
+            recobjs.append(_parse_dc(context, repos, etree.fromstring(v.xml)))
+
+    return recobjs
+
+def _parse_waf(context, repos, record, identifier):
+
+    recobjs = []
+
+    content = util.http_request('GET', record)
+
+    LOGGER.debug(content)
+
+    try:
+        parser = etree.HTMLParser()
+        tree = etree.fromstring(content, parser=parser)
+    except Exception, err:
+        raise Exception('Could not parse WAF: %s' % str(err))
+        
+    up = urlparse(record)
+    links = []
+
+    LOGGER.debug('collecting links')
+    for link in tree.xpath('//a/@href'):
+        link = link.strip()
+        if not link:
+            continue
+        if link.find('?') != -1:
+            continue
+        if not link.endswith('.xml'):
+            LOGGER.debug('Skipping, not .xml')
+            continue
+        if '/' in link:  # path is embedded in link
+            if link[-1] == '/':  # directory, skip
+                continue
+            if link[0] == '/':
+                # strip path of WAF URL
+                link = '%s://%s%s' % (up.scheme, up.netloc, link)
+        else:  # tack on href to WAF URL
+            link = '%s/%s' % (record, link)
+        LOGGER.debug('URL is: %s', link)
+        links.append(link)
+
+    LOGGER.debug('%d links found', len(links))
+    for link in links:
+        LOGGER.debug('Processing link %s', link)
+        # fetch and parse
+        linkcontent = util.http_request('GET', link)
+        recobj = _parse_metadata(context, repos, linkcontent)[0]
+        recobj.source = link
+        recobj.mdsource = link
+        recobjs.append(recobj)
+
+    return recobjs
+
+def _parse_wms(context, repos, record, identifier):
+
+    from owslib.wms import WebMapService
+
+    recobjs = []
+    serviceobj = repos.dataset()
+
+    md = WebMapService(record)
+
+    # generate record of service instance
+    _set(context, serviceobj, 'pycsw:Identifier', identifier)
+    _set(context, serviceobj, 'pycsw:Typename', 'csw:Record')
+    _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)
+    _set(context, serviceobj, 'pycsw:Abstract', md.identification.abstract)
+    _set(context, serviceobj, 'pycsw:Keywords', ','.join(md.identification.keywords))
+    _set(context, serviceobj, 'pycsw:Creator', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:Publisher', md.provider.name)
+    _set(context, serviceobj, 'pycsw:Contributor', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:OrganizationName', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:AccessConstraints', md.identification.accessconstraints)
+    _set(context, serviceobj, 'pycsw:OtherConstraints', md.identification.fees)
+    _set(context, serviceobj, 'pycsw:Source', record)
+    _set(context, serviceobj, 'pycsw:Format', md.identification.type)
+    for c in md.contents:
+        if md.contents[c].parent is None:
+            bbox = md.contents[c].boundingBoxWGS84
+            tmp = '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3])
+            _set(context, serviceobj, 'pycsw:BoundingBox', util.bbox2wktpolygon(tmp))
+            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: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)))
+    _set(context, serviceobj, 'pycsw:CouplingType', 'tight')
+
+    links = [
+        '%s,OGC-WMS Web Map Service,OGC:WMS,%s' % (identifier, md.url),
+    ]
+
+    _set(context, serviceobj, 'pycsw:Links', '^'.join(links))
+
+    recobjs.append(serviceobj) 
+         
+    # generate record foreach layer
+
+    LOGGER.debug('Harvesting %d WMS layers' % len(md.contents))
+
+    for layer in md.contents:
+        recobj = repos.dataset()
+        identifier2 = '%s-%s' % (identifier, md.contents[layer].name)
+        _set(context, recobj, 'pycsw:Identifier', identifier2)
+        _set(context, recobj, 'pycsw:Typename', 'csw:Record')
+        _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)
+        _set(context, recobj, 'pycsw:Abstract', md.contents[layer].abstract)
+        _set(context, recobj, 'pycsw:Keywords', ','.join(md.contents[layer].keywords))
+
+        _set(context, recobj, 'pycsw:AnyText',
+             util.get_anytext([md.contents[layer].title,
+                              md.contents[layer].abstract,
+                              ','.join(md.contents[layer].keywords)]))
+
+        bbox = md.contents[layer].boundingBoxWGS84
+        if bbox is not None:
+            tmp = '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3])
+            _set(context, recobj, 'pycsw:BoundingBox', util.bbox2wktpolygon(tmp))
+            _set(context, recobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
+            _set(context, recobj, 'pycsw:DistanceUOM', 'degrees')
+        else:
+            bbox = md.contents[layer].boundingBox
+            if bbox:
+                tmp = '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3])
+                _set(context, recobj, 'pycsw:BoundingBox', util.bbox2wktpolygon(tmp))
+                _set(context, recobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:%s' % \
+                bbox[-1].split(':')[1])
+
+        params = {
+            'service': 'WMS',
+            'version': '1.1.1',
+            'request': 'GetMap',
+            'layers': md.contents[layer].name,
+            'format': 'image/png',
+            'height': '200',
+            'width': '200',
+            'srs': 'EPSG:4326',
+            'bbox':  '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3]),
+            'styles': ''
+        }
+
+        links = [
+            '%s,OGC-Web Map Service,OGC:WMS,%s' % (md.contents[layer].name, md.url),
+            '%s,Web image thumbnail (URL),WWW:LINK-1.0-http--image-thumbnail,%s' % (md.contents[layer].name, build_get_url(md.url, params))
+        ]
+
+        _set(context, recobj, 'pycsw:Links', '^'.join(links))
+
+        recobjs.append(recobj)
+
+    return recobjs
+
+def _parse_wfs(context, repos, record, identifier):
+
+    from owslib.wfs import WebFeatureService
+
+    bboxs = []
+    recobjs = []
+    serviceobj = repos.dataset()
+
+    md = WebFeatureService(record, '1.1.0')
+
+    # generate record of service instance
+    _set(context, serviceobj, 'pycsw:Identifier', identifier)
+    _set(context, serviceobj, 'pycsw:Typename', 'csw:Record')
+    _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)
+    _set(context, serviceobj, 'pycsw:Abstract', md.identification.abstract)
+    _set(context, serviceobj, 'pycsw:Keywords', ','.join(md.identification.keywords))
+    _set(context, serviceobj, 'pycsw:Creator', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:Publisher', md.provider.name)
+    _set(context, serviceobj, 'pycsw:Contributor', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:OrganizationName', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:AccessConstraints', md.identification.accessconstraints)
+    _set(context, serviceobj, 'pycsw:OtherConstraints', md.identification.fees)
+    _set(context, serviceobj, 'pycsw:Source', record)
+    _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: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)))
+    _set(context, serviceobj, 'pycsw:CouplingType', 'tight')
+
+    links = [
+        '%s,OGC-WFS Web Feature Service,OGC:WFS,%s' % (identifier, md.url)
+    ]
+
+    _set(context, serviceobj, 'pycsw:Links', '^'.join(links))
+
+    # generate record foreach featuretype
+
+    LOGGER.debug('Harvesting %d WFS featuretypes' % len(md.contents))
+
+    for featuretype in md.contents:
+        recobj = repos.dataset()
+        identifier2 = '%s-%s' % (identifier, md.contents[featuretype].id)
+        _set(context, recobj, 'pycsw:Identifier', identifier2)
+        _set(context, recobj, 'pycsw:Typename', 'csw:Record')
+        _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)
+        _set(context, recobj, 'pycsw:Abstract', md.contents[featuretype].abstract)
+        _set(context, recobj, 'pycsw:Keywords', ','.join(md.contents[featuretype].keywords))
+
+        _set(context, recobj, 'pycsw:AnyText',
+             util.get_anytext([md.contents[featuretype].title,
+                              md.contents[featuretype].abstract,
+                              ','.join(md.contents[featuretype].keywords)]))
+
+        bbox = md.contents[featuretype].boundingBoxWGS84
+        if bbox is not None:
+            tmp = '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3])
+            wkt_polygon = util.bbox2wktpolygon(tmp)
+            _set(context, recobj, 'pycsw:BoundingBox', wkt_polygon)
+            _set(context, recobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
+            _set(context, recobj, 'pycsw:DistanceUOM', 'degrees')
+            bboxs.append(wkt_polygon)
+
+        params = {
+            'service': 'WFS',
+            'version': '1.1.0',
+            'request': 'GetFeature',
+            'typename': md.contents[featuretype].id,
+        }
+
+        links = [
+            '%s,OGC-Web Feature Service,OGC:WFS,%s' % (md.contents[featuretype].id, md.url),
+            '%s,File for download,WWW:DOWNLOAD-1.0-http--download,%s' % (md.contents[featuretype].id, build_get_url(md.url, params))
+        ]
+
+        _set(context, recobj, 'pycsw:Links', '^'.join(links))
+
+        recobjs.append(recobj)
+
+    # Derive a bbox based on aggregated featuretype bbox values
+
+    bbox_agg = util.bbox_from_polygons(bboxs)
+
+    if bbox_agg is not None:
+        _set(context, serviceobj, 'pycsw:BoundingBox', bbox_agg)
+
+    recobjs.insert(0, serviceobj)
+
+    return recobjs
+
+def _parse_wcs(context, repos, record, identifier):
+
+    from owslib.wcs import WebCoverageService
+
+    bboxs = []
+    recobjs = []
+    serviceobj = repos.dataset()
+
+    md = WebCoverageService(record, '1.0.0')
+
+    # generate record of service instance
+    _set(context, serviceobj, 'pycsw:Identifier', identifier)
+    _set(context, serviceobj, 'pycsw:Typename', 'csw:Record')
+    _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)
+    _set(context, serviceobj, 'pycsw:Abstract', md.identification.abstract)
+    _set(context, serviceobj, 'pycsw:Keywords', ','.join(md.identification.keywords))
+    _set(context, serviceobj, 'pycsw:Creator', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:Publisher', md.provider.name)
+    _set(context, serviceobj, 'pycsw:Contributor', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:OrganizationName', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:AccessConstraints', md.identification.accessConstraints)
+    _set(context, serviceobj, 'pycsw:OtherConstraints', md.identification.fees)
+    _set(context, serviceobj, 'pycsw:Source', record)
+    _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: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)))
+    _set(context, serviceobj, 'pycsw:CouplingType', 'tight')
+
+    links = [
+        '%s,OGC-WCS Web Coverage Service,OGC:WCS,%s' % (identifier, md.url)
+    ]
+
+    _set(context, serviceobj, 'pycsw:Links', '^'.join(links))
+
+    # generate record foreach coverage
+
+    LOGGER.debug('Harvesting %d WCS coverages ' % len(md.contents))
+
+    for coverage in md.contents:
+        recobj = repos.dataset()
+        identifier2 = '%s-%s' % (identifier, md.contents[coverage].id)
+        _set(context, recobj, 'pycsw:Identifier', identifier2)
+        _set(context, recobj, 'pycsw:Typename', 'csw:Record')
+        _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)
+        _set(context, recobj, 'pycsw:Abstract', md.contents[coverage].abstract)
+        _set(context, recobj, 'pycsw:Keywords', ','.join(md.contents[coverage].keywords))
+
+        _set(context, recobj, 'pycsw:AnyText',
+             util.get_anytext([md.contents[coverage].title,
+                              md.contents[coverage].abstract,
+                              ','.join(md.contents[coverage].keywords)]))
+
+        bbox = md.contents[coverage].boundingBoxWGS84
+        if bbox is not None:
+            tmp = '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3])
+            wkt_polygon = util.bbox2wktpolygon(tmp)
+            _set(context, recobj, 'pycsw:BoundingBox', wkt_polygon)
+            _set(context, recobj, 'pycsw:CRS', 'urn:ogc:def:crs:EPSG:6.11:4326')
+            _set(context, recobj, 'pycsw:DistanceUOM', 'degrees')
+            bboxs.append(wkt_polygon)
+
+        links = [
+            '%s,OGC-Web Coverage Service,OGC:WCS,%s' % (md.contents[coverage].id, md.url)
+        ]
+
+        _set(context, recobj, 'pycsw:Links', '^'.join(links))
+
+        recobjs.append(recobj)
+
+    # Derive a bbox based on aggregated coverage bbox values
+
+    bbox_agg = util.bbox_from_polygons(bboxs)
+
+    if bbox_agg is not None:
+        _set(context, serviceobj, 'pycsw:BoundingBox', bbox_agg)
+
+    recobjs.insert(0, serviceobj)
+
+    return recobjs
+
+def _parse_wps(context, repos, record, identifier):
+
+    from owslib.wps import WebProcessingService
+
+    serviceobj = repos.dataset()
+
+    md = WebProcessingService(record)
+
+    # generate record of service instance
+    _set(context, serviceobj, 'pycsw:Identifier', identifier)
+    _set(context, serviceobj, 'pycsw:Typename', 'csw:Record')
+    _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)
+    _set(context, serviceobj, 'pycsw:Abstract', md.identification.abstract)
+    _set(context, serviceobj, 'pycsw:Keywords', ','.join(md.identification.keywords))
+    _set(context, serviceobj, 'pycsw:Creator', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:Publisher', md.provider.name)
+    _set(context, serviceobj, 'pycsw:Contributor', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:OrganizationName', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:AccessConstraints', md.identification.accessconstraints)
+    _set(context, serviceobj, 'pycsw:OtherConstraints', md.identification.fees)
+    _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: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]))
+    _set(context, serviceobj, 'pycsw:CouplingType', 'loose')
+
+    links = [
+        '%s,OGC-WPS Web Processing Service,OGC:WPS,%s' % (identifier, md.url),
+        '%s,OGC-WPS Capabilities service (ver 1.0.0),OGC:WPS-1.1.0-http-get-capabilities,%s' % (identifier, build_get_url(md.url, {'service': 'WPS', 'version': '1.0.0', 'request': 'GetCapabilities'})),
+    ]
+
+    _set(context, serviceobj, 'pycsw:Links', '^'.join(links))
+
+    return serviceobj
+
+
+def _parse_sos(context, repos, record, identifier, version):
+
+    from owslib.sos import SensorObservationService
+
+    bboxs = []
+    recobjs = []
+    serviceobj = repos.dataset()
+
+    if version == '1.0.0':
+        schema = 'http://www.opengis.net/sos/1.0'
+    else:
+        schema = 'http://www.opengis.net/sos/2.0'
+
+    md = SensorObservationService(record, version=version)
+
+    # generate record of service instance
+    _set(context, serviceobj, 'pycsw:Identifier', identifier)
+    _set(context, serviceobj, 'pycsw:Typename', 'csw:Record')
+    _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)
+    _set(context, serviceobj, 'pycsw:Abstract', md.identification.abstract)
+    _set(context, serviceobj, 'pycsw:Keywords', ','.join(md.identification.keywords))
+    _set(context, serviceobj, 'pycsw:Creator', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:Publisher', md.provider.name)
+    _set(context, serviceobj, 'pycsw:Contributor', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:OrganizationName', md.provider.contact.name)
+    _set(context, serviceobj, 'pycsw:AccessConstraints', md.identification.accessconstraints)
+    _set(context, serviceobj, 'pycsw:OtherConstraints', md.identification.fees)
+    _set(context, serviceobj, 'pycsw:Source', record)
+    _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: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)))
+    _set(context, serviceobj, 'pycsw:CouplingType', 'tight')
+
+    links = [
+        '%s,OGC-SOS Sensor Observation Service,OGC:SOS,%s' % (identifier, md.url),
+    ]
+
+    _set(context, serviceobj, 'pycsw:Links', '^'.join(links))
+
+    # generate record foreach offering
+
+    LOGGER.debug('Harvesting %d SOS ObservationOffering\'s ', len(md.contents))
+
+    for offering in md.contents:
+        recobj = repos.dataset()
+        identifier2 = '%s-%s' % (identifier, md.contents[offering].id)
+        _set(context, recobj, 'pycsw:Identifier', identifier2)
+        _set(context, recobj, 'pycsw:Typename', 'csw:Record')
+        _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)
+        _set(context, recobj, 'pycsw:Abstract', md.contents[offering].description)
+        _set(context, recobj, 'pycsw:TempExtent_begin', util.datetime2iso8601(md.contents[offering].begin_position))
+        _set(context, recobj, 'pycsw:TempExtent_end', util.datetime2iso8601(md.contents[offering].end_position))
+
+        _set(context, recobj, 'pycsw:AnyText',
+             util.get_anytext([md.contents[offering].description]))
+
+        bbox = md.contents[offering].bbox
+        if bbox is not None:
+            tmp = '%s,%s,%s,%s' % (bbox[0], bbox[1], bbox[2], bbox[3])
+            wkt_polygon = util.bbox2wktpolygon(tmp)
+            _set(context, recobj, 'pycsw:BoundingBox', wkt_polygon)
+            _set(context, recobj, 'pycsw:CRS', md.contents[offering].bbox_srs.id)
+            _set(context, recobj, 'pycsw:DistanceUOM', 'degrees')
+            bboxs.append(wkt_polygon)
+
+        recobjs.append(recobj)
+
+    # Derive a bbox based on aggregated featuretype bbox values
+
+    bbox_agg = util.bbox_from_polygons(bboxs)
+
+    if bbox_agg is not None:
+        _set(context, serviceobj, 'pycsw:BoundingBox', bbox_agg)
+
+    recobjs.insert(0, serviceobj)
+
+    return recobjs
+
+
+def _parse_fgdc(context, repos, exml):
+
+    from owslib.fgdc import Metadata
+
+    recobj = repos.dataset()
+    links = []
+
+    md = Metadata(exml)
+
+    if md.idinfo.datasetid is not None:  # we need an identifier
+        _set(context, recobj, 'pycsw:Identifier', md.idinfo.datasetid)
+    else:  # generate one ourselves
+        _set(context, recobj, 'pycsw:Identifier', uuid.uuid1().get_urn())
+
+    _set(context, recobj, 'pycsw:Typename', 'fgdc:metadata')
+    _set(context, recobj, 'pycsw:Schema', context.namespaces['fgdc'])
+    _set(context, recobj, 'pycsw:MdSource', 'local')
+    _set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
+    _set(context, recobj, 'pycsw:XML', md.xml)
+    _set(context, recobj, 'pycsw:AnyText', util.get_anytext(exml))
+    _set(context, recobj, 'pycsw:Language', 'en-US')
+
+    if hasattr(md.idinfo, 'descript'):
+        _set(context, recobj, 'pycsw:Abstract', md.idinfo.descript.abstract)
+
+    if hasattr(md.idinfo, 'keywords'):
+        if md.idinfo.keywords.theme:
+            _set(context, recobj, 'pycsw:Keywords', \
+            ','.join(md.idinfo.keywords.theme[0]['themekey']))
+
+    if hasattr(md.idinfo.timeperd, 'timeinfo'):
+        if hasattr(md.idinfo.timeperd.timeinfo, 'rngdates'):
+            _set(context, recobj, 'pycsw:TempExtent_begin',
+                 md.idinfo.timeperd.timeinfo.rngdates.begdate)
+            _set(context, recobj, 'pycsw:TempExtent_end',
+                 md.idinfo.timeperd.timeinfo.rngdates.enddate)
+
+    if hasattr(md.idinfo, 'origin'):
+        _set(context, recobj, 'pycsw:Creator', md.idinfo.origin)
+        _set(context, recobj, 'pycsw:Publisher',  md.idinfo.origin)
+        _set(context, recobj, 'pycsw:Contributor', md.idinfo.origin)
+
+    if hasattr(md.idinfo, 'ptcontac'):
+        _set(context, recobj, 'pycsw:OrganizationName', md.idinfo.ptcontac.cntorg)
+    _set(context, recobj, 'pycsw:AccessConstraints', md.idinfo.accconst)
+    _set(context, recobj, 'pycsw:OtherConstraints', md.idinfo.useconst)
+    _set(context, recobj, 'pycsw:Date', md.metainfo.metd)
+
+    if hasattr(md.idinfo, 'spdom') and hasattr(md.idinfo.spdom, 'bbox'):
+        bbox = md.idinfo.spdom.bbox
+    else:
+        bbox = None
+
+    if hasattr(md.idinfo, 'citation'):
+        if hasattr(md.idinfo.citation, 'citeinfo'):
+            _set(context, recobj, 'pycsw:Type',  md.idinfo.citation.citeinfo['geoform'])
+            _set(context, recobj, 'pycsw:Title', md.idinfo.citation.citeinfo['title'])
+            _set(context, recobj,
+            'pycsw:PublicationDate', md.idinfo.citation.citeinfo['pubdate'])
+            _set(context, recobj, 'pycsw:Format', md.idinfo.citation.citeinfo['geoform'])
+            if md.idinfo.citation.citeinfo['onlink']:
+                for link in md.idinfo.citation.citeinfo['onlink']:
+                    tmp = ',,,%s' % link
+                    links.append(tmp)
+
+    if hasattr(md, 'distinfo') and hasattr(md.distinfo, 'stdorder'):
+        for link in md.distinfo.stdorder['digform']:
+            tmp = ',%s,,%s' % (link['name'], link['url'])
+            links.append(tmp)
+
+    if len(links) > 0:
+        _set(context, recobj, 'pycsw:Links', '^'.join(links))
+
+    if bbox is not None:
+        try:
+            tmp = '%s,%s,%s,%s' % (bbox.minx, bbox.miny, bbox.maxx, bbox.maxy)
+            _set(context, recobj, 'pycsw:BoundingBox', util.bbox2wktpolygon(tmp))
+        except:  # coordinates are corrupted, do not include
+            _set(context, recobj, 'pycsw:BoundingBox', None)
+    else:
+        _set(context, recobj, 'pycsw:BoundingBox', None)
+
+    return recobj
+
+def _parse_iso(context, repos, exml):
+
+    from owslib.iso import MD_Metadata
+
+    recobj = repos.dataset()
+    links = []
+
+    md = MD_Metadata(exml)
+
+    _set(context, recobj, 'pycsw:Identifier', md.identifier)
+    _set(context, recobj, 'pycsw:Typename', 'gmd:MD_Metadata')
+    _set(context, recobj, 'pycsw:Schema', context.namespaces['gmd'])
+    _set(context, recobj, 'pycsw:MdSource', 'local')
+    _set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
+    _set(context, recobj, 'pycsw:XML', md.xml)
+    _set(context, recobj, 'pycsw:AnyText', util.get_anytext(exml))
+    _set(context, recobj, 'pycsw:Language', md.language)
+    _set(context, recobj, 'pycsw:Type', md.hierarchy)
+    _set(context, recobj, 'pycsw:ParentIdentifier', md.parentidentifier)
+    _set(context, recobj, 'pycsw:Date', md.datestamp)
+    _set(context, recobj, 'pycsw:Modified', md.datestamp)
+    _set(context, recobj, 'pycsw:Source', md.dataseturi)
+    if md.referencesystem is not None:
+        _set(context, recobj, 'pycsw:CRS','urn:ogc:def:crs:EPSG:6.11:%s' %
+        md.referencesystem.code)
+
+    if hasattr(md, 'identification'):
+        _set(context, recobj, 'pycsw:Title', md.identification.title)
+        _set(context, recobj, 'pycsw:AlternateTitle', md.identification.alternatetitle)
+        _set(context, recobj, 'pycsw:Abstract', md.identification.abstract)
+        _set(context, recobj, 'pycsw:Relation', md.identification.aggregationinfo)
+
+        if hasattr(md.identification, 'temporalextent_start'):
+            _set(context, recobj, 'pycsw:TempExtent_begin', md.identification.temporalextent_start)
+        if hasattr(md.identification, 'temporalextent_end'):
+            _set(context, recobj, 'pycsw:TempExtent_end', md.identification.temporalextent_end)
+
+        if len(md.identification.topiccategory) > 0:
+            _set(context, recobj, 'pycsw:TopicCategory', md.identification.topiccategory[0])
+
+        if len(md.identification.resourcelanguage) > 0:
+            _set(context, recobj, 'pycsw:ResourceLanguage', md.identification.resourcelanguage[0])
+ 
+        if hasattr(md.identification, 'bbox'):
+            bbox = md.identification.bbox
+        else:
+            bbox = None
+
+        if (hasattr(md.identification, 'keywords') and
+            len(md.identification.keywords) > 0):
+            all_keywords = [item for sublist in md.identification.keywords for item in sublist['keywords'] if item is not None]
+            _set(context, recobj, 'pycsw:Keywords', ','.join(all_keywords))
+            _set(context, recobj, 'pycsw:KeywordType', md.identification.keywords[0]['type'])
+
+        if hasattr(md.identification, 'creator'):
+            _set(context, recobj, 'pycsw:Creator', md.identification.creator)
+        if hasattr(md.identification, 'publisher'):
+            _set(context, recobj, 'pycsw:Publisher', md.identification.publisher)
+        if hasattr(md.identification, 'contributor'):
+            _set(context, recobj, 'pycsw:Contributor', md.identification.contributor)
+
+        if (hasattr(md.identification, 'contact') and 
+        hasattr(md.identification.contact, 'organization')):
+            _set(context, recobj, 'pycsw:OrganizationName', md.identification.contact.organization)
+
+        if len(md.identification.securityconstraints) > 0:
+            _set(context, recobj, 'pycsw:SecurityConstraints', 
+            md.identification.securityconstraints[0])
+        if len(md.identification.accessconstraints) > 0:
+            _set(context, recobj, 'pycsw:AccessConstraints', 
+            md.identification.accessconstraints[0])
+        if len(md.identification.otherconstraints) > 0:
+            _set(context, recobj, 'pycsw:OtherConstraints', md.identification.otherconstraints[0])
+
+        if hasattr(md.identification, 'date'):
+            for datenode in md.identification.date:
+                if datenode.type == 'revision':
+                    _set(context, recobj, 'pycsw:RevisionDate', datenode.date)
+                elif datenode.type == 'creation':
+                    _set(context, recobj, 'pycsw:CreationDate', datenode.date)
+                elif datenode.type == 'publication':
+                    _set(context, recobj, 'pycsw:PublicationDate', datenode.date)
+
+        if hasattr(md.identification, 'extent') and hasattr(md.identification.extent, 'description_code'):
+            _set(context, recobj, 'pycsw:GeographicDescriptionCode', md.identification.extent.description_code)
+
+        if len(md.identification.denominators) > 0:
+            _set(context, recobj, 'pycsw:Denominator', md.identification.denominators[0])
+        if len(md.identification.distance) > 0:
+            _set(context, recobj, 'pycsw:DistanceValue', md.identification.distance[0])
+        if len(md.identification.uom) > 0:
+            _set(context, recobj, 'pycsw:DistanceUOM', md.identification.uom[0])
+
+        if len(md.identification.classification) > 0:
+            _set(context, recobj, 'pycsw:Classification', md.identification.classification[0])
+        if len(md.identification.uselimitation) > 0:
+            _set(context, recobj, 'pycsw:ConditionApplyingToAccessAndUse',
+            md.identification.uselimitation[0])
+
+    if hasattr(md.identification, 'format'):
+        _set(context, recobj, 'pycsw:Format', md.distribution.format)
+
+    if md.serviceidentification is not None:
+        _set(context, recobj, 'pycsw:ServiceType', md.serviceidentification.type)
+        _set(context, recobj, 'pycsw:ServiceTypeVersion', md.serviceidentification.version)
+
+        _set(context, recobj, 'pycsw:CouplingType', md.serviceidentification.couplingtype)
+   
+        #if len(md.serviceidentification.operateson) > 0: 
+        #    _set(context, recobj, 'pycsw:operateson = VARCHAR(32), 
+        #_set(context, recobj, 'pycsw:operation VARCHAR(32), 
+        #_set(context, recobj, 'pycsw:operatesonidentifier VARCHAR(32), 
+        #_set(context, recobj, 'pycsw:operatesoname VARCHAR(32), 
+
+
+    if hasattr(md.identification, 'dataquality'):     
+        _set(context, recobj, 'pycsw:Degree', md.dataquality.conformancedegree)
+        _set(context, recobj, 'pycsw:Lineage', md.dataquality.lineage)
+        _set(context, recobj, 'pycsw:SpecificationTitle', md.dataquality.specificationtitle)
+        if hasattr(md.dataquality, 'specificationdate'):
+            _set(context, recobj, 'pycsw:specificationDate',
+            md.dataquality.specificationdate[0].date)
+            _set(context, recobj, 'pycsw:SpecificationDateType',
+            md.dataquality.specificationdate[0].datetype)
+
+    if hasattr(md, 'contact') and len(md.contact) > 0:
+        _set(context, recobj, 'pycsw:ResponsiblePartyRole', md.contact[0].role)
+
+    LOGGER.info('Scanning for links')
+    if hasattr(md, 'distribution'):
+        dist_links = []
+        if hasattr(md.distribution, 'online'):
+            LOGGER.debug('Scanning for gmd:transferOptions element(s)')
+            dist_links.extend(md.distribution.online)
+        if hasattr(md.distribution, 'distributor'):
+            LOGGER.debug('Scanning for gmd:distributorTransferOptions element(s)')
+            for dist_member in md.distribution.distributor:
+                dist_links.extend(dist_member.online)
+        for link in dist_links:
+            linkstr = '%s,%s,%s,%s' % \
+            (link.name, link.description, link.protocol, link.url)
+            links.append(linkstr)
+
+    try:
+        LOGGER.debug('Scanning for srv:SV_ServiceIdentification links')
+        for sident in md.identificationinfo:
+            if hasattr(sident, 'operations'):
+                for sops in sident.operations:
+                    for scpt in sops['connectpoint']:
+                        LOGGER.debug('adding srv link %s', scpt.url)
+                        linkstr = '%s,%s,%s,%s' % \
+                        (scpt.name, scpt.description, scpt.protocol, scpt.url)
+                        links.append(linkstr)
+    except Exception, err:  # srv: identification does not exist
+        LOGGER.debug('no srv:SV_ServiceIdentification links found')
+
+    if len(links) > 0:
+        _set(context, recobj, 'pycsw:Links', '^'.join(links))
+
+    if bbox is not None:
+        try:
+            tmp = '%s,%s,%s,%s' % (bbox.minx, bbox.miny, bbox.maxx, bbox.maxy)
+            _set(context, recobj, 'pycsw:BoundingBox', util.bbox2wktpolygon(tmp))
+        except:  # coordinates are corrupted, do not include
+            _set(context, recobj, 'pycsw:BoundingBox', None)
+    else:
+        _set(context, recobj, 'pycsw:BoundingBox', None)
+
+    return recobj
+
+def _parse_dc(context, repos, exml):
+
+    from owslib.csw import CswRecord
+
+    recobj = repos.dataset()
+    links = []
+
+    md = CswRecord(exml)
+
+    if md.bbox is None:
+        bbox = None
+    else:
+        bbox = md.bbox
+
+    _set(context, recobj, 'pycsw:Identifier', md.identifier)
+    _set(context, recobj, 'pycsw:Typename', 'csw:Record')
+    _set(context, recobj, 'pycsw:Schema', context.namespaces['csw'])
+    _set(context, recobj, 'pycsw:MdSource', 'local')
+    _set(context, recobj, 'pycsw:InsertDate', util.get_today_and_now())
+    _set(context, recobj, 'pycsw:XML', md.xml)
+    _set(context, recobj, 'pycsw:AnyText', util.get_anytext(exml))
+    _set(context, recobj, 'pycsw:Language', md.language)
+    _set(context, recobj, 'pycsw:Type', md.type)
+    _set(context, recobj, 'pycsw:Title', md.title)
+    _set(context, recobj, 'pycsw:AlternateTitle', md.alternative)
+    _set(context, recobj, 'pycsw:Abstract', md.abstract)
+
+    if len(md.subjects) > 0 and None not in md.subjects:
+        _set(context, recobj, 'pycsw:Keywords', ','.join(md.subjects))
+
+    _set(context, recobj, 'pycsw:ParentIdentifier', md.ispartof)
+    _set(context, recobj, 'pycsw:Relation', md.relation)
+    _set(context, recobj, 'pycsw:TempExtent_begin', md.temporal)
+    _set(context, recobj, 'pycsw:TempExtent_end', md.temporal)
+    _set(context, recobj, 'pycsw:ResourceLanguage', md.language)
+    _set(context, recobj, 'pycsw:Creator', md.creator)
+    _set(context, recobj, 'pycsw:Publisher', md.publisher)
+    _set(context, recobj, 'pycsw:Contributor', md.contributor)
+    _set(context, recobj, 'pycsw:OrganizationName', md.rightsholder)
+    _set(context, recobj, 'pycsw:AccessConstraints', md.accessrights)
+    _set(context, recobj, 'pycsw:OtherConstraints', md.license)
+    _set(context, recobj, 'pycsw:Date', md.date)
+    _set(context, recobj, 'pycsw:CreationDate', md.created)
+    _set(context, recobj, 'pycsw:PublicationDate', md.issued)
+    _set(context, recobj, 'pycsw:Modified', md.modified)
+    _set(context, recobj, 'pycsw:Format', md.format)
+    _set(context, recobj, 'pycsw:Source', md.source)
+
+    for ref in md.references:
+        tmp = ',,%s,%s' % (ref['scheme'], ref['url'])
+        links.append(tmp)
+    for uri in md.uris:
+        tmp = '%s,%s,%s,%s' % \
+        (uri['name'], uri['description'], uri['protocol'], uri['url'])
+        links.append(tmp)
+
+    if len(links) > 0:
+        _set(context, recobj, 'pycsw:Links', '^'.join(links))
+
+    if bbox is not None:
+        try:
+            tmp = '%s,%s,%s,%s' % (bbox.minx, bbox.miny, bbox.maxx, bbox.maxy)
+            _set(context, recobj, 'pycsw:BoundingBox', util.bbox2wktpolygon(tmp))
+        except:  # coordinates are corrupted, do not include
+            _set(context, recobj, 'pycsw:BoundingBox', None)
+    else:
+        _set(context, recobj, 'pycsw:BoundingBox', None)
+
+    return recobj
+
diff --git a/pycsw/opensearch.py b/pycsw/opensearch.py
new file mode 100644
index 0000000..e99d504
--- /dev/null
+++ b/pycsw/opensearch.py
@@ -0,0 +1,69 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+from lxml import etree
+from pycsw import util
+
+class OpenSearch(object):
+    """OpenSearch wrapper class"""
+
+    def __init__(self, context):
+        """initialize"""
+
+        self.namespaces = {
+            'atom': 'http://www.w3.org/2005/Atom',
+            'opensearch': 'http://a9.com/-/spec/opensearch/1.1/'
+        }
+
+        self.context = context
+        self.context.namespaces.update(self.namespaces)
+
+    def response_csw2opensearch(self, element, cfg):
+        """transform a CSW response into an OpenSearch response"""
+
+        if util.xmltag_split(element.tag) == 'GetRecordsResponse':
+
+            startindex = int(element.xpath('//@nextRecord')[0]) - int(element.xpath('//@numberOfRecordsReturned')[0])
+            if startindex < 1:
+                startindex = 1
+
+            node = etree.Element(util.nspath_eval('atom:feed', self.context.namespaces), nsmap=self.namespaces)
+            etree.SubElement(node, util.nspath_eval('atom:id', self.context.namespaces)).text = cfg.get('server', 'url')
+            etree.SubElement(node, util.nspath_eval('atom:title', self.context.namespaces)).text = cfg.get('metadata:main', 'identification_title')
+            #etree.SubElement(node, util.nspath_eval('atom:updated', self.context.namespaces)).text = element.xpath('//@timestamp')[0]
+
+            etree.SubElement(node, util.nspath_eval('opensearch:totalResults', self.context.namespaces)).text = element.xpath('//@numberOfRecordsMatched')[0]
+            etree.SubElement(node, util.nspath_eval('opensearch:startIndex', self.context.namespaces)).text = str(startindex)
+            etree.SubElement(node, util.nspath_eval('opensearch:itemsPerPage', self.context.namespaces)).text = element.xpath('//@numberOfRecordsReturned')[0]
+
+            for rec in element.xpath('//atom:entry', namespaces=self.context.namespaces):
+                node.append(rec)
+
+        return node
diff --git a/pycsw/plugins/__init__.py b/pycsw/plugins/__init__.py
new file mode 100644
index 0000000..f98f82b
--- /dev/null
+++ b/pycsw/plugins/__init__.py
@@ -0,0 +1,29 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
diff --git a/pycsw/plugins/outputschemas/__init__.py b/pycsw/plugins/outputschemas/__init__.py
new file mode 100644
index 0000000..067ff50
--- /dev/null
+++ b/pycsw/plugins/outputschemas/__init__.py
@@ -0,0 +1,30 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2013 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+__all__ = ['atom', 'dif', 'fgdc']
diff --git a/pycsw/plugins/outputschemas/atom.py b/pycsw/plugins/outputschemas/atom.py
new file mode 100644
index 0000000..cd1b7d1
--- /dev/null
+++ b/pycsw/plugins/outputschemas/atom.py
@@ -0,0 +1,122 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import os
+from lxml import etree
+from pycsw import util
+
+NAMESPACE = 'http://www.w3.org/2005/Atom'
+NAMESPACES = {'atom': NAMESPACE, 'georss': 'http://www.georss.org/georss'}
+
+XPATH_MAPPINGS = {
+    'pycsw:Identifier': 'atom:id',
+    'pycsw:Title': 'atom:title',
+    'pycsw:Creator': 'atom:author',
+    'pycsw:Abstract': 'atom:summary',
+    'pycsw:PublicationDate': 'atom:published',
+    'pycsw:Keywords': 'atom:category',
+    'pycsw:Contributor': 'atom:contributor',
+    'pycsw:AccessConstraints': 'atom:rights',
+    'pycsw:Modified': 'atom:updated',
+    'pycsw:Source': 'atom:source',
+}
+
+def write_record(result, esn, context, url=None):
+    ''' Return csw:SearchResults child as lxml.etree.Element '''
+
+    typename = util.getqattr(result, context.md_core_model['mappings']['pycsw:Typename'])
+
+    if esn == 'full' and typename == 'atom:entry':
+        # dump record as is and exit
+        return etree.fromstring(util.getqattr(result, context.md_core_model['mappings']['pycsw:XML']))
+
+    node = etree.Element(util.nspath_eval('atom:entry', NAMESPACES), nsmap=NAMESPACES)
+    node.attrib[util.nspath_eval('xsi:schemaLocation', context.namespaces)] = \
+            '%s http://www.kbcafe.com/rss/atom.xsd.xml' % NAMESPACES['atom']
+
+    # author
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:Creator'])
+     
+    if val:
+        etree.SubElement(node, util.nspath_eval('atom:author', NAMESPACES)).text = val
+
+    # category
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:Keywords'])
+
+    if val:
+        for kw in val.split(','):
+            etree.SubElement(node, util.nspath_eval('atom:category', NAMESPACES)).text = kw
+
+
+    for qval in ['pycsw:Contributor', 'pycsw:Identifier']:
+        val = util.getqattr(result, context.md_core_model['mappings'][qval])
+        if val:
+            etree.SubElement(node, util.nspath_eval(XPATH_MAPPINGS[qval], NAMESPACES)).text = val
+
+    rlinks = util.getqattr(result, context.md_core_model['mappings']['pycsw:Links'])
+    if rlinks:
+        for link in rlinks.split('^'):
+            linkset = link.split(',')
+       
+            url2 = etree.SubElement(node, util.nspath_eval('atom:link', NAMESPACES), href=linkset[-1], type=linkset[2], title=linkset[1])
+
+    etree.SubElement(node, util.nspath_eval('atom:link', NAMESPACES), href='%s?service=CSW&version=2.0.2&request=GetRepositoryItem&id=%s' % (url, util.getqattr(result, context.md_core_model['mappings']['pycsw:Identifier'])))
+
+    for qval in ['pycsw:PublicationDate', 'pycsw:AccessConstraints', 'pycsw:Source', 'pycsw:Abstract', 'pycsw:Title', 'pycsw:Modified']:
+        val = util.getqattr(result, context.md_core_model['mappings'][qval])
+        if val:
+            etree.SubElement(node, util.nspath_eval(XPATH_MAPPINGS[qval], NAMESPACES)).text = val
+
+    # bbox extent
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:BoundingBox'])
+    bboxel = write_extent(val, context.namespaces)
+    if bboxel is not None:
+        node.append(bboxel)
+
+    return node
+
+def write_extent(bbox, nsmap):
+    ''' Generate BBOX extent '''
+    
+    if bbox is not None:
+        try:
+            bbox2 = util.wkt2geom(bbox, bounds=False)
+        except:
+            return None
+
+        where = etree.Element(util.nspath_eval('georss:where', NAMESPACES))
+        polygon = etree.SubElement(where, util.nspath_eval('gml:Polygon', nsmap), srsName='urn:x-ogc:def:crs:EPSG:6.11:4326')
+        exterior = etree.SubElement(polygon, util.nspath_eval('gml:exterior', nsmap))
+        lring = etree.SubElement(exterior, util.nspath_eval('gml:LinearRing', nsmap))
+        poslist = etree.SubElement(lring, util.nspath_eval('gml:posList', nsmap)).text = \
+        ' '.join(['%s %s' % (str(i[1]), str(i[0])) for i in list(bbox2.exterior.coords)])
+    
+        return where
+    return None
diff --git a/pycsw/plugins/outputschemas/dif.py b/pycsw/plugins/outputschemas/dif.py
new file mode 100644
index 0000000..46583e5
--- /dev/null
+++ b/pycsw/plugins/outputschemas/dif.py
@@ -0,0 +1,180 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+from lxml import etree
+from pycsw import util
+
+NAMESPACE = 'http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/'
+NAMESPACES = {'dif': NAMESPACE}
+
+XPATH_MAPPINGS = {
+    'pycsw:Title': 'dif:Entry_Title', 
+    'pycsw:Creator': 'dif:Data_Set_Citation/dif:Dataset_Creator', 
+    'pycsw:TopicCategory': 'dif:ISO_Topic_Category', 
+    'pycsw:Keywords': 'dif:Keyword',
+    'pycsw:Abstract': 'dif:Summary', 
+    'pycsw:Publisher': 'dif:Data_Set_Citation/dif:Dataset_Publisher', 
+    'pycsw:OrganizationName': 'dif:Originating_Center',
+    'pycsw:CreationDate': 'dif:DIF_Creation_Date','pycsw:PublicationDate': 'dif:Data_Set_Citation/dif:Dataset_Release_Date', 
+    'pycsw:Format': 'dif:Data_Set_Citation/dif:Data_Presentation_Form', 
+    'pycsw:ResourceLanguage': 'dif:Data_Set_Language',
+    'pycsw:Relation': 'dif:Related_URL/dif:URL', 
+    'pycsw:AccessConstraints': 'dif:Access_Constraints',
+    'pycsw:TempExtent_begin': 'dif:Temporal_Coverage/dif:Start_Date', 
+    'pycsw:TempExtent_end': 'dif:Temporal_Coverage/dif:Stop_Date', 
+}
+
+def write_record(result, esn, context, url=None):
+    ''' Return csw:SearchResults child as lxml.etree.Element '''
+
+    typename = util.getqattr(result, context.md_core_model['mappings']['pycsw:Typename'])
+
+    if esn == 'full' and typename == 'dif:DIF':
+        # dump record as is and exit
+        return etree.fromstring(util.getqattr(result, context.md_core_model['mappings']['pycsw:XML']))
+
+    node = etree.Element(util.nspath_eval('dif:DIF', NAMESPACES))
+    node.attrib[util.nspath_eval('xsi:schemaLocation', context.namespaces)] = \
+    '%s http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/dif.xsd' % NAMESPACE
+
+    # identifier
+    etree.SubElement(node, util.nspath_eval('dif:Entry_ID', NAMESPACES)).text = util.getqattr(result, context.md_core_model['mappings']['pycsw:Identifier'])
+
+    # title
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:Title'])
+    if not val:
+        val = ''
+    etree.SubElement(node, util.nspath_eval('dif:Entry_Title', NAMESPACES)).text = val
+
+    # citation
+    citation = etree.SubElement(node, util.nspath_eval('dif:Data_Set_Citation', NAMESPACES))
+
+    # creator
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:Creator'])
+    etree.SubElement(citation, util.nspath_eval('dif:Dataset_Creator', NAMESPACES)).text = val
+
+    # date
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:PublicationDate'])
+    etree.SubElement(citation, util.nspath_eval('dif:Dataset_Release_Date', NAMESPACES)).text = val
+
+    # publisher
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:Publisher'])
+    etree.SubElement(citation, util.nspath_eval('dif:Dataset_Publisher', NAMESPACES)).text = val
+
+    # format
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:Format'])
+    etree.SubElement(citation, util.nspath_eval('dif:Data_Presentation_Form', NAMESPACES)).text = val
+
+    # iso topic category
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:TopicCategory'])
+    etree.SubElement(node, util.nspath_eval('dif:ISO_Topic_Category', NAMESPACES)).text = val
+
+    # keywords
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:Keywords'])
+
+    if val:
+        for kw in val.split(','):
+            etree.SubElement(node, util.nspath_eval('dif:Keyword', NAMESPACES)).text = kw
+
+    # temporal
+    temporal = etree.SubElement(node, util.nspath_eval('dif:Temporal_Coverage', NAMESPACES))
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:TempExtent_begin'])
+    val2 = util.getqattr(result, context.md_core_model['mappings']['pycsw:TempExtent_end'])
+    etree.SubElement(temporal, util.nspath_eval('dif:Start_Date', NAMESPACES)).text = val 
+    etree.SubElement(temporal, util.nspath_eval('dif:End_Date', NAMESPACES)).text = val2
+
+    # bbox extent
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:BoundingBox'])
+    bboxel = write_extent(val, NAMESPACES)
+    if bboxel is not None:
+        node.append(bboxel)
+
+    # access constraints
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:AccessConstraints'])
+    etree.SubElement(node, util.nspath_eval('dif:Access_Constraints', NAMESPACES)).text = val
+
+    # language
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:ResourceLanguage'])
+    etree.SubElement(node, util.nspath_eval('dif:Data_Set_Language', NAMESPACES)).text = val
+
+    # contributor
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:OrganizationName'])
+    etree.SubElement(node, util.nspath_eval('dif:Originating_Center', NAMESPACES)).text = val
+
+    # abstract
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:Abstract'])
+    if not val:
+        val = ''
+    etree.SubElement(node, util.nspath_eval('dif:Summary', NAMESPACES)).text = val
+
+    # date 
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:CreationDate'])
+    etree.SubElement(node, util.nspath_eval('dif:DIF_Creation_Date', NAMESPACES)).text = val
+
+    # URL
+    val = util.getqattr(result, context.md_core_model['mappings']['pycsw:Relation'])
+    url = etree.SubElement(node, util.nspath_eval('dif:Related_URL', NAMESPACES))
+    etree.SubElement(url, util.nspath_eval('dif:URL', NAMESPACES)).text = val
+
+    rlinks = util.getqattr(result, context.md_core_model['mappings']['pycsw:Links'])
+    if rlinks:
+        for link in rlinks.split('^'):
+            linkset = link.split(',')
+       
+            url2 = etree.SubElement(node, util.nspath_eval('dif:Related_URL', NAMESPACES))
+
+            urltype = etree.SubElement(url2, util.nspath_eval('dif:URL_Content_Type', NAMESPACES))
+            etree.SubElement(urltype, util.nspath_eval('dif:Type', NAMESPACES)).text = linkset[2]
+
+            etree.SubElement(url2, util.nspath_eval('dif:URL', NAMESPACES)).text = linkset[-1]
+            etree.SubElement(url2, util.nspath_eval('dif:Description', NAMESPACES)).text = linkset[1]
+
+    etree.SubElement(node, util.nspath_eval('dif:Metadata_Name', NAMESPACES)).text = 'CEOS IDN DIF'
+    etree.SubElement(node, util.nspath_eval('dif:Metadata_Version', NAMESPACES)).text = '9.7'
+
+    return node
+
+def write_extent(bbox, nsmap):
+    ''' Generate BBOX extent '''
+    
+    from shapely.wkt import loads
+    
+    if bbox is not None:
+        try:
+            bbox2 = util.wkt2geom(bbox)
+        except:
+            return None
+        extent = etree.Element(util.nspath_eval('dif:Spatial_Coverage', nsmap))
+        etree.SubElement(extent, util.nspath_eval('dif:Southernmost_Latitude', nsmap)).text = str(bbox2[1])
+        etree.SubElement(extent, util.nspath_eval('dif:Northernmost_Latitude', nsmap)).text = str(bbox2[3])
+        etree.SubElement(extent, util.nspath_eval('dif:Westernmost_Longitude', nsmap)).text = str(bbox2[0])
+        etree.SubElement(extent, util.nspath_eval('dif:Easternmost_Longitude', nsmap)).text = str(bbox2[2])
+        return extent
+    return None
diff --git a/pycsw/plugins/outputschemas/fgdc.py b/pycsw/plugins/outputschemas/fgdc.py
new file mode 100644
index 0000000..e14fb76
--- /dev/null
+++ b/pycsw/plugins/outputschemas/fgdc.py
@@ -0,0 +1,180 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+from lxml import etree
+from pycsw import util
+
+#NAMESPACE = 'http://www.fgdc.gov/metadata/csdgm'
+NAMESPACE = 'http://www.opengis.net/cat/csw/csdgm'
+NAMESPACES = {'fgdc': NAMESPACE}
+
+XPATH_MAPPINGS = {
+    'pycsw:Identifier': 'idinfo/datasetid',
+    'pycsw:Title': 'idinfo/citation/citeinfo/title',
+    'pycsw:Creator': 'idinfo/citation/citeinfo/origin',
+    'pycsw:Publisher': 'idinfo/citation/citeinfo/publinfo/publish',
+    'pycsw:Abstract': 'idinfo/descript/abstract',
+    'pycsw:Format': 'idinfo/citation/citeinfo/geoform',
+    'pycsw:PublicationDate': 'idinfo/citation/citeinfo/pubdate',
+    'pycsw:Keywords': 'idinfo/keywords/theme/themekey',
+    'pycsw:TempExtent_begin': 'idinfo/timeperd/timeinfo/rngdates/begdate',
+    'pycsw:TempExtent_end': 'idinfo/timeperd/timeinfo/rngdates/enddate',
+    'pycsw:Contributor': 'idinfo/datacred',
+    'pycsw:AccessConstraints': 'idinfo/accconst',
+    'pycsw:Modified': 'metainfo/metd',
+    'pycsw:Type': 'spdoinfo/direct',
+    'pycsw:Source': 'lineage/srcinfo/srccite/citeinfo/title',
+    'pycsw:Relation': 'idinfo/citation/citeinfo/onlink',
+}
+
+def write_record(recobj, esn, context, url=None):
+    ''' Return csw:SearchResults child as lxml.etree.Element '''
+    typename = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Typename'])
+    if esn == 'full' and typename == 'fgdc:metadata':
+        # dump record as is and exit
+        return etree.fromstring(util.getqattr(recobj, context.md_core_model['mappings']['pycsw:XML']))
+
+    node = etree.Element('metadata')
+    node.attrib[util.nspath_eval('xsi:noNamespaceSchemaLocation', context.namespaces)] = \
+    'http://www.fgdc.gov/metadata/fgdc-std-001-1998.xsd'
+
+    idinfo = etree.SubElement(node, 'idinfo')
+    # identifier
+    etree.SubElement(idinfo, 'datasetid').text = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Identifier'])
+
+    citation = etree.SubElement(idinfo, 'citation')
+    citeinfo = etree.SubElement(citation, 'citeinfo')
+
+    # title
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Title'])
+    etree.SubElement(citeinfo, 'title').text = val
+
+    # publisher
+    publinfo = etree.SubElement(citeinfo, 'publinfo')
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Publisher']) or ''
+    etree.SubElement(publinfo, 'publish').text = val
+
+    # origin
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Creator']) or ''
+    etree.SubElement(citeinfo, 'origin').text = val
+
+    # keywords
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Keywords'])
+    if val:
+        keywords = etree.SubElement(idinfo, 'keywords')
+        theme = etree.SubElement(keywords, 'theme')
+        for v in val.split(','):
+            etree.SubElement(theme, 'themekey').text = v
+
+    # accessconstraints
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:AccessConstraints']) or ''
+    etree.SubElement(idinfo, 'accconst').text = val
+
+    # abstract
+    descript = etree.SubElement(idinfo, 'descript')
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Abstract']) or ''
+    etree.SubElement(descript, 'abstract').text = val
+
+    # time
+    datebegin = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:TempExtent_begin'])
+    dateend = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:TempExtent_end'])
+    if all([datebegin, dateend]):
+        timeperd = etree.SubElement(idinfo, 'timeperd')
+        timeinfo = etree.SubElement(timeperd, 'timeinfo')
+        rngdates = etree.SubElement(timeinfo, 'timeinfo')
+        begdate = etree.SubElement(rngdates, 'begdate').text = datebegin
+        enddate = etree.SubElement(rngdates, 'enddate').text = dateend
+
+    # bbox extent
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:BoundingBox'])
+    bboxel = write_extent(val)
+    if bboxel is not None:
+        idinfo.append(bboxel)
+
+    # contributor
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Contributor']) or ''
+    etree.SubElement(idinfo, 'datacred').text = val
+
+    # direct
+    spdoinfo = etree.SubElement(idinfo, 'spdoinfo')
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Type']) or ''
+    etree.SubElement(spdoinfo, 'direct').text = val
+
+    # formname
+    distinfo = etree.SubElement(node, 'distinfo')
+    stdorder = etree.SubElement(distinfo, 'stdorder')
+    digform = etree.SubElement(stdorder, 'digform')
+    digtinfo = etree.SubElement(digform, 'digtinfo')
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Format']) or ''
+    etree.SubElement(digtinfo, 'formname').text = val
+    etree.SubElement(citeinfo, 'geoform').text = val
+
+    # source
+    lineage = etree.SubElement(node, 'lineage')
+    srcinfo = etree.SubElement(lineage, 'srcinfo')
+    srccite = etree.SubElement(srcinfo, 'srccite')
+    sciteinfo = etree.SubElement(srccite, 'citeinfo')
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Source']) or ''
+    etree.SubElement(sciteinfo, 'title').text = val
+
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Relation']) or ''
+    etree.SubElement(citeinfo, 'onlink').text = val
+
+    # links
+    rlinks = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Links'])
+    if rlinks:
+        for link in rlinks.split('^'):
+            linkset = link.split(',')
+            etree.SubElement(citeinfo, 'onlink', type=linkset[2]).text = linkset[-1]
+
+    # metd
+    metainfo = etree.SubElement(node, 'metainfo')
+    val = util.getqattr(recobj, context.md_core_model['mappings']['pycsw:Modified']) or ''
+    etree.SubElement(metainfo, 'metd').text = val
+
+    return node
+
+def write_extent(bbox):
+    ''' Generate BBOX extent '''
+    
+    if bbox is not None:
+        try:
+            bbox2 = util.wkt2geom(bbox)
+        except:
+            return None
+
+        spdom = etree.Element('spdom')
+        bounding = etree.SubElement(spdom, 'bounding')
+        etree.SubElement(bounding, 'westbc').text = str(bbox2[0])
+        etree.SubElement(bounding, 'eastbc').text = str(bbox2[2])
+        etree.SubElement(bounding, 'northbc').text = str(bbox2[3])
+        etree.SubElement(bounding, 'southbc').text = str(bbox2[1])
+        return spdom
+    return None
diff --git a/pycsw/plugins/profiles/__init__.py b/pycsw/plugins/profiles/__init__.py
new file mode 100644
index 0000000..f98f82b
--- /dev/null
+++ b/pycsw/plugins/profiles/__init__.py
@@ -0,0 +1,29 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
diff --git a/pycsw/plugins/profiles/apiso/__init__.py b/pycsw/plugins/profiles/apiso/__init__.py
new file mode 100644
index 0000000..f98f82b
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/__init__.py
@@ -0,0 +1,29 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
diff --git a/pycsw/plugins/profiles/apiso/apiso.py b/pycsw/plugins/profiles/apiso/apiso.py
new file mode 100644
index 0000000..312d6c9
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/apiso.py
@@ -0,0 +1,667 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#                Angelos Tzotsos <tzotsos at gmail.com>
+#
+# Copyright (c) 2011 Tom Kralidis
+# Copyright (c) 2011 Angelos Tzotsos
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import os
+from lxml import etree
+from pycsw import config, util
+from pycsw.plugins.profiles import profile
+
+CODELIST = 'http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml'
+CODESPACE = 'ISOTC211/19115'
+
+class APISO(profile.Profile):
+    ''' APISO class '''
+    def __init__(self, model, namespaces, context):
+        self.context = context
+
+        self.namespaces = {
+            'apiso': 'http://www.opengis.net/cat/csw/apiso/1.0',
+            'gco': 'http://www.isotc211.org/2005/gco',
+            'gmd': 'http://www.isotc211.org/2005/gmd',
+            'srv': 'http://www.isotc211.org/2005/srv',
+            'xlink': 'http://www.w3.org/1999/xlink'
+        }
+
+        self.inspire_namespaces = {
+            'inspire_ds': 'http://inspire.ec.europa.eu/schemas/inspire_ds/1.0',
+            'inspire_common': 'http://inspire.ec.europa.eu/schemas/common/1.0'
+        }
+
+
+        self.repository = {
+            'gmd:MD_Metadata': {
+                'outputschema': 'http://www.isotc211.org/2005/gmd',
+                'queryables': {
+                    'SupportedISOQueryables': {
+                        'apiso:Subject': {'xpath': 'gmd:identificationInfo/gmd:MD_Identification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/gco:CharacterString|gmd:identificationInfo/gmd:MD_DataIdentification/gmd:topicCategory/gmd:MD_TopicCategoryCode', 'dbcol': self.context.md_core_model['mappings']['pycsw:Keywords']},
+                        'apiso:Title': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Title']},
+                        'apiso:Abstract': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:abstract/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Abstract']},
+                        'apiso:Format': {'xpath': 'gmd:distributionInfo/gmd:MD_Distribution/gmd:distributionFormat/gmd:MD_Format/gmd:name/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Format']},
+                        'apiso:Identifier': {'xpath': 'gmd:fileIdentifier/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Identifier']},
+                        'apiso:Modified': {'xpath': 'gmd:dateStamp/gco:Date', 'dbcol': self.context.md_core_model['mappings']['pycsw:Modified']},
+                        'apiso:Type': {'xpath': 'gmd:hierarchyLevel/gmd:MD_ScopeCode', 'dbcol': self.context.md_core_model['mappings']['pycsw:Type']},
+                        'apiso:BoundingBox': {'xpath': 'apiso:BoundingBox', 'dbcol': self.context.md_core_model['mappings']['pycsw:BoundingBox']},
+                        'apiso:CRS': {'xpath': 'concat("urn:ogc:def:crs:","gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier/gmd:codeSpace/gco:CharacterString",":","gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier/gmd:version/gco:CharacterString",":","gmd:referenceSystemInfo/gmd:MD_ReferenceSystem/gmd:referenceSystemIdentifier/gmd:RS_Identifier/gmd:code/gco:CharacterString")', 'dbcol': self.context [...]
+                        'apiso:AlternateTitle': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:alternateTitle/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:AlternateTitle']},
+                        'apiso:RevisionDate': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date[gmd:dateType/gmd:CI_DateTypeCode/@codeListValue="revision"]/gmd:date/gco:Date', 'dbcol': self.context.md_core_model['mappings']['pycsw:RevisionDate']},
+                        'apiso:CreationDate': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date[gmd:dateType/gmd:CI_DateTypeCode/@codeListValue="creation"]/gmd:date/gco:Date', 'dbcol': self.context.md_core_model['mappings']['pycsw:CreationDate']},
+                        'apiso:PublicationDate': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:date/gmd:CI_Date[gmd:dateType/gmd:CI_DateTypeCode/@codeListValue="publication"]/gmd:date/gco:Date', 'dbcol': self.context.md_core_model['mappings']['pycsw:PublicationDate']},
+                        'apiso:OrganisationName': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:OrganizationName']},
+                        'apiso:HasSecurityConstraints': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_SecurityConstraints', 'dbcol': self.context.md_core_model['mappings']['pycsw:SecurityConstraints']},
+                        'apiso:Language': {'xpath': 'gmd:language/gmd:LanguageCode|gmd:language/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Language']},
+                        'apiso:ParentIdentifier': {'xpath': 'gmd:parentIdentifier/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:ParentIdentifier']},
+                        'apiso:KeywordType': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:type/gmd:MD_KeywordTypeCode', 'dbcol': self.context.md_core_model['mappings']['pycsw:KeywordType']},
+                        'apiso:TopicCategory': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:topicCategory/gmd:MD_TopicCategoryCode', 'dbcol': self.context.md_core_model['mappings']['pycsw:TopicCategory']},
+                        'apiso:ResourceLanguage': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:code/gmd:MD_LanguageTypeCode', 'dbcol': self.context.md_core_model['mappings']['pycsw:ResourceLanguage']},
+                        'apiso:GeographicDescriptionCode': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:GeographicDescriptionCode']},
+                        'apiso:Denominator': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:spatialResolution/gmd:MD_Resolution/gmd:equivalentScale/gmd:MD_RepresentativeFraction/gmd:denominator/gco:Integer', 'dbcol': self.context.md_core_model['mappings']['pycsw:Denominator']},
+                        'apiso:DistanceValue': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:spatialResolution/gmd:MD_Resolution/gmd:distance/gco:Distance', 'dbcol': self.context.md_core_model['mappings']['pycsw:DistanceValue']},
+                        'apiso:DistanceUOM': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:spatialResolution/gmd:MD_Resolution/gmd:distance/gco:Distance/@uom', 'dbcol': self.context.md_core_model['mappings']['pycsw:DistanceUOM']},
+                        'apiso:TempExtent_begin': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition', 'dbcol': self.context.md_core_model['mappings']['pycsw:TempExtent_begin']},
+                        'apiso:TempExtent_end': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:temporalElement/gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition', 'dbcol': self.context.md_core_model['mappings']['pycsw:TempExtent_end']},
+                        'apiso:AnyText': {'xpath': '//', 'dbcol': self.context.md_core_model['mappings']['pycsw:AnyText']},
+                        'apiso:ServiceType': {'xpath': 'gmd:identificationInfo/srv:SV_ServiceIdentification/srv:serviceType/gco:LocalName', 'dbcol': self.context.md_core_model['mappings']['pycsw:ServiceType']},
+                        'apiso:ServiceTypeVersion': {'xpath': 'gmd:identificationInfo/srv:SV_ServiceIdentification/srv:serviceTypeVersion/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:ServiceTypeVersion']},
+                        'apiso:Operation': {'xpath': 'gmd:identificationInfo/srv:SV_ServiceIdentification/srv:containsOperations/srv:SV_OperationMetadata/srv:operationName/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Operation']},
+                        'apiso:CouplingType': {'xpath': 'gmd:identificationInfo/srv:SV_ServiceIdentification/srv:couplingType/srv:SV_CouplingType', 'dbcol': self.context.md_core_model['mappings']['pycsw:CouplingType']},
+                        'apiso:OperatesOn': {'xpath': 'gmd:identificationInfo/srv:SV_ServiceIdentification/srv:operatesOn/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:identifier/gmd:RS_Identifier/gmd:code/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:OperatesOn']},
+                        'apiso:OperatesOnIdentifier': {'xpath': 'gmd:identificationInfo/srv:SV_ServiceIdentification/srv:coupledResource/srv:SV_CoupledResource/srv:identifier/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:OperatesOnIdentifier']},
+                        'apiso:OperatesOnName': {'xpath': 'gmd:identificationInfo/srv:SV_ServiceIdentification/srv:coupledResource/srv:SV_CoupledResource/srv:operationName/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:OperatesOnName']},
+                    },
+                    'AdditionalQueryables': {
+                        'apiso:Degree': {'xpath': 'gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:pass/gco:Boolean', 'dbcol': self.context.md_core_model['mappings']['pycsw:Degree']},
+                        'apiso:AccessConstraints': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:accessConstraints/gmd:MD_RestrictionCode', 'dbcol': self.context.md_core_model['mappings']['pycsw:AccessConstraints']},
+                        'apiso:OtherConstraints': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:otherConstraints/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:OtherConstraints']},
+                        'apiso:Classification': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:accessConstraints/gmd:MD_ClassificationCode', 'dbcol': self.context.md_core_model['mappings']['pycsw:Classification']},
+                        'apiso:ConditionApplyingToAccessAndUse': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:useLimitation/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:ConditionApplyingToAccessAndUse']},
+                        'apiso:Lineage': {'xpath': 'gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:lineage/gmd:LI_Lineage/gmd:statement/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Lineage']},
+                        'apiso:ResponsiblePartyRole': {'xpath': 'gmd:contact/gmd:CI_ResponsibleParty/gmd:role/gmd:CI_RoleCode', 'dbcol': self.context.md_core_model['mappings']['pycsw:ResponsiblePartyRole']},
+                        'apiso:SpecificationTitle': {'xpath': 'gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:specification/gmd:CI_Citation/gmd:title/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:SpecificationTitle']},
+                        'apiso:SpecificationDate': {'xpath': 'gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:specification/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:date/gco:Date', 'dbcol': self.context.md_core_model['mappings']['pycsw:SpecificationDate']},
+                        'apiso:SpecificationDateType': {'xpath': 'gmd:dataQualityInfo/gmd:DQ_DataQuality/gmd:report/gmd:DQ_DomainConsistency/gmd:result/gmd:DQ_ConformanceResult/gmd:specification/gmd:CI_Citation/gmd:date/gmd:CI_Date/gmd:dateType/gmd:CI_DateTypeCode', 'dbcol': self.context.md_core_model['mappings']['pycsw:SpecificationDateType']},
+                        'apiso:Creator': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName[gmd:role/gmd:CI_RoleCode/@codeListValue="originator"]/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Creator']},
+                        'apiso:Publisher': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName[gmd:role/gmd:CI_RoleCode/@codeListValue="publisher"]/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Publisher']},
+                        'apiso:Contributor': {'xpath': 'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName[gmd:role/gmd:CI_RoleCode/@codeListValue="contributor"]/gco:CharacterString', 'dbcol': self.context.md_core_model['mappings']['pycsw:Contributor']},
+                        'apiso:Relation': {'xpath': 'gmd:identificationInfo/gmd:MD_Data_Identification/gmd:aggregationInfo', 'dbcol': self.context.md_core_model['mappings']['pycsw:Relation']}
+                    }
+                },
+                'mappings': {
+                    'csw:Record': {
+                        # map APISO queryables to DC queryables
+                        'apiso:Title': 'dc:title',
+                        'apiso:Creator': 'dc:creator',
+                        'apiso:Subject': 'dc:subject',
+                        'apiso:Abstract': 'dct:abstract',
+                        'apiso:Publisher': 'dc:publisher',
+                        'apiso:Contributor': 'dc:contributor',
+                        'apiso:Modified': 'dct:modified',
+                        #'apiso:Date': 'dc:date',
+                        'apiso:Type': 'dc:type',
+                        'apiso:Format': 'dc:format',
+                        'apiso:Language': 'dc:language',
+                        'apiso:Relation': 'dc:relation',
+                        'apiso:AccessConstraints': 'dc:rights',
+                    }
+                }
+            }
+        }
+
+        profile.Profile.__init__(self,
+            name='apiso',
+            version='1.0.0',
+            title='ISO Metadata Application Profile',
+            url='http://portal.opengeospatial.org/files/?artifact_id=21460',
+            namespace=self.namespaces['gmd'],
+            typename='gmd:MD_Metadata',
+            outputschema=self.namespaces['gmd'],
+            prefixes=['apiso', 'gmd'],
+            model=model,
+            core_namespaces=namespaces,
+            added_namespaces=self.namespaces,
+            repository=self.repository['gmd:MD_Metadata'])
+
+    def extend_core(self, model, namespaces, config):
+        ''' Extend core configuration '''
+
+        # update INSPIRE vars
+        self.context.namespaces.update(self.inspire_namespaces)
+
+        # update harvest resource types with WMS, since WMS is not a typename,
+        if 'Harvest' in model['operations']:
+            model['operations']['Harvest']['parameters']['ResourceType']['values'].append('http://www.isotc211.org/schemas/2005/gmd/')
+
+        # set INSPIRE config
+        if config.has_section('metadata:inspire') and config.has_option('metadata:inspire', 'enabled') and config.get('metadata:inspire', 'enabled') == 'true':
+            self.inspire_config = {}
+            self.inspire_config['languages_supported'] = config.get('metadata:inspire', 'languages_supported')
+            self.inspire_config['default_language'] = config.get('metadata:inspire', 'default_language')
+            self.inspire_config['date'] = config.get('metadata:inspire', 'date')
+            self.inspire_config['gemet_keywords'] = config.get('metadata:inspire', 'gemet_keywords')
+            self.inspire_config['conformity_service'] = config.get('metadata:inspire', 'conformity_service')
+            self.inspire_config['contact_name'] = config.get('metadata:inspire', 'contact_name')
+            self.inspire_config['contact_email'] = config.get('metadata:inspire', 'contact_email')
+            self.inspire_config['temp_extent'] = config.get('metadata:inspire', 'temp_extent')
+        else:
+            self.inspire_config = None
+
+        self.ogc_schemas_base = config.get('server', 'ogc_schemas_base')
+        self.url = config.get('server', 'url')
+
+    def check_parameters(self, kvp):
+        '''Check for Language parameter in GetCapabilities request'''
+
+        if self.inspire_config is not None:
+            result = None
+            if 'language' not in kvp:
+                self.inspire_config['current_language'] = self.inspire_config['default_language']
+            else:
+                if kvp['language'] not in self.inspire_config['languages_supported'].split(','):
+                    text = 'Requested Language not supported, Supported languages: %s' % self.inspire_config['languages_supported']
+                    return {'error': 'true', 'locator': 'language', 'code': 'InvalidParameterValue', 'text': text}
+                else:
+                    self.inspire_config['current_language'] = kvp['language']
+                    return None
+            return None
+        return None
+
+    def get_extendedcapabilities(self):
+        ''' Add child to ows:OperationsMetadata Element '''
+
+        if self.inspire_config is not None:
+
+            ex_caps = etree.Element(
+                util.nspath_eval('inspire_ds:ExtendedCapabilities', self.inspire_namespaces))
+
+            ex_caps.attrib[util.nspath_eval('xsi:schemaLocation', self.context.namespaces)] = \
+            '%s %s/inspire_ds.xsd' % \
+            (self.inspire_namespaces['inspire_ds'], self.inspire_namespaces['inspire_ds'])
+
+            # Resource Locator
+            res_loc = etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:ResourceLocator', self.inspire_namespaces))
+
+            etree.SubElement(res_loc,
+            util.nspath_eval('inspire_common:URL', self.inspire_namespaces)).text = '%sservice=CSW&version=2.0.2&request=GetCapabilities' % (util.bind_url(self.url))
+
+            etree.SubElement(res_loc,
+            util.nspath_eval('inspire_common:MediaType', self.inspire_namespaces)).text = 'application/xml'
+
+            # Resource Type
+            etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:ResourceType', self.inspire_namespaces)).text = 'service'
+
+            # Temporal Reference
+            temp_ref = etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:TemporalReference', self.inspire_namespaces))
+
+            temp_extent = etree.SubElement(temp_ref,
+            util.nspath_eval('inspire_common:TemporalExtent', self.inspire_namespaces))
+
+            val = self.inspire_config['temp_extent'].split('/')
+
+            if len(val) == 1:
+                etree.SubElement(temp_extent,
+                util.nspath_eval('inspire_common:IndividualDate', self.inspire_namespaces)).text = val[0]
+
+            else:
+                interval_dates = etree.SubElement(temp_extent,
+                util.nspath_eval('inspire_common:IntervalOfDates', self.inspire_namespaces))
+
+                etree.SubElement(interval_dates,
+                util.nspath_eval('inspire_common:StartingDate', self.inspire_namespaces)).text = val[0]
+
+                etree.SubElement(interval_dates,
+                util.nspath_eval('inspire_common:EndDate', self.inspire_namespaces)).text = val[1]
+
+            # Conformity - service
+            cfm = etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:Conformity', self.inspire_namespaces))
+
+            spec = etree.SubElement(cfm,
+            util.nspath_eval('inspire_common:Specification', self.inspire_namespaces))
+
+            spec.attrib[util.nspath_eval('xsi:type', self.context.namespaces)] =  'inspire_common:citationInspireInteroperabilityRegulation_eng'
+
+            etree.SubElement(spec,
+            util.nspath_eval('inspire_common:Title', self.inspire_namespaces)).text = 'COMMISSION REGULATION (EU) No 1089/2010 of 23 November 2010 implementing Directive 2007/2/EC of the European Parliament and of the Council as regards interoperability of spatial data sets and services'
+
+            etree.SubElement(spec,
+            util.nspath_eval('inspire_common:DateOfPublication', self.inspire_namespaces)).text = '2010-12-08'
+
+            etree.SubElement(spec,
+            util.nspath_eval('inspire_common:URI', self.inspire_namespaces)).text = 'OJ:L:2010:323:0011:0102:EN:PDF'
+
+            spec_loc = etree.SubElement(spec,
+            util.nspath_eval('inspire_common:ResourceLocator', self.inspire_namespaces))
+
+            etree.SubElement(spec_loc,
+            util.nspath_eval('inspire_common:URL', self.inspire_namespaces)).text = 'http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2010:323:0011:0102:EN:PDF'
+
+            etree.SubElement(spec_loc,
+            util.nspath_eval('inspire_common:MediaType', self.inspire_namespaces)).text = 'application/pdf'
+
+            spec = etree.SubElement(cfm,
+            util.nspath_eval('inspire_common:Degree', self.inspire_namespaces)).text = self.inspire_config['conformity_service']
+
+            # Metadata Point of Contact
+            poc = etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:MetadataPointOfContact', self.inspire_namespaces))
+
+            etree.SubElement(poc,
+            util.nspath_eval('inspire_common:OrganisationName', self.inspire_namespaces)).text = self.inspire_config['contact_name']
+
+            etree.SubElement(poc,
+            util.nspath_eval('inspire_common:EmailAddress', self.inspire_namespaces)).text = self.inspire_config['contact_email']
+
+            # Metadata Date
+            etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:MetadataDate', self.inspire_namespaces)).text = self.inspire_config['date']
+
+            # Spatial Data Service Type
+            etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:SpatialDataServiceType', self.inspire_namespaces)).text = 'discovery'
+
+            # Mandatory Keyword
+            mkey = etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:MandatoryKeyword', self.inspire_namespaces))
+
+            mkey.attrib[util.nspath_eval('xsi:type', self.context.namespaces)] = 'inspire_common:classificationOfSpatialDataService'
+
+            etree.SubElement(mkey,
+            util.nspath_eval('inspire_common:KeywordValue', self.inspire_namespaces)).text = 'infoCatalogueService'
+
+            # Gemet Keywords
+
+            for gkw in self.inspire_config['gemet_keywords'].split(','):
+                gkey = etree.SubElement(ex_caps,
+                util.nspath_eval('inspire_common:Keyword', self.inspire_namespaces))
+
+                gkey.attrib[util.nspath_eval('xsi:type', self.context.namespaces)] = 'inspire_common:inspireTheme_eng'
+
+                ocv = etree.SubElement(gkey,
+                util.nspath_eval('inspire_common:OriginatingControlledVocabulary', self.inspire_namespaces))
+
+                etree.SubElement(ocv,
+                util.nspath_eval('inspire_common:Title', self.inspire_namespaces)).text = 'GEMET - INSPIRE themes'
+
+                etree.SubElement(ocv,
+                util.nspath_eval('inspire_common:DateOfPublication', self.inspire_namespaces)).text = '2008-06-01'
+
+                etree.SubElement(gkey,
+                util.nspath_eval('inspire_common:KeywordValue', self.inspire_namespaces)).text = gkw
+
+            # Languages
+            slang = etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:SupportedLanguages', self.inspire_namespaces))
+
+            dlang = etree.SubElement(slang,
+            util.nspath_eval('inspire_common:DefaultLanguage', self.inspire_namespaces))
+
+            etree.SubElement(dlang,
+            util.nspath_eval('inspire_common:Language', self.inspire_namespaces)).text = self.inspire_config['default_language']
+
+            for l in self.inspire_config['languages_supported'].split(','):
+                lang = etree.SubElement(slang,
+                util.nspath_eval('inspire_common:SupportedLanguage', self.inspire_namespaces))
+
+                etree.SubElement(lang,
+                util.nspath_eval('inspire_common:Language', self.inspire_namespaces)).text = l
+
+            clang = etree.SubElement(ex_caps,
+            util.nspath_eval('inspire_common:ResponseLanguage', self.inspire_namespaces))
+            etree.SubElement(clang,
+            util.nspath_eval('inspire_common:Language', self.inspire_namespaces)).text = self.inspire_config['current_language']
+
+            return ex_caps
+
+    def get_schemacomponents(self):
+        ''' Return schema components as lxml.etree.Element list '''
+
+        node1 = etree.Element(
+        util.nspath_eval('csw:SchemaComponent', self.context.namespaces),
+        schemaLanguage='XMLSCHEMA', targetNamespace=self.namespace,
+        parentSchema='gmd.xsd')
+
+        schema = etree.parse(os.path.join(self.context.pycsw_home,
+                 'plugins', 'profiles', 'apiso', 'schemas', 'ogc', 'iso',
+                 '19139', '20060504', 'gmd', 'identification.xsd')).getroot()
+
+        node1.append(schema)
+
+        node2 = etree.Element(
+        util.nspath_eval('csw:SchemaComponent', self.context.namespaces),
+        schemaLanguage='XMLSCHEMA', targetNamespace=self.namespace,
+        parentSchema='gmd.xsd')
+
+        schema = etree.parse(os.path.join(self.context.pycsw_home, 'plugins',
+                 'profiles', 'apiso', 'schemas', 'ogc', 'iso', '19139',
+                 '20060504', 'srv', 'serviceMetadata.xsd')).getroot()
+
+        node2.append(schema)
+
+        return [node1, node2]
+
+    def check_getdomain(self, kvp):
+        '''Perform extra profile specific checks in the GetDomain request'''
+        return None
+
+    def write_record(self, result, esn, outputschema, queryables):
+        ''' 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'):
+            # dump record as is and exit
+            return etree.fromstring(util.getqattr(result, self.context.md_core_model['mappings']['pycsw:XML']))
+
+        if typename == 'csw:Record':  # transform csw:Record -> gmd:MD_Metadata model mappings
+            util.transform_mappings(queryables, self.repository['mappings']['csw:Record'])
+
+        node = etree.Element(util.nspath_eval('gmd:MD_Metadata', self.namespaces))
+        node.attrib[util.nspath_eval('xsi:schemaLocation', self.context.namespaces)] = \
+        '%s %s/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd' % (self.namespace, self.ogc_schemas_base)
+
+        # identifier
+        idval = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Identifier'])
+
+        identifier = etree.SubElement(node, util.nspath_eval('gmd:fileIdentifier', self.namespaces))
+        etree.SubElement(identifier, util.nspath_eval('gco:CharacterString', self.namespaces)).text = idval
+
+        if esn in ['summary', 'full']:
+            # language
+            val = util.getqattr(result, queryables['apiso:Language']['dbcol'])
+
+            lang = etree.SubElement(node, util.nspath_eval('gmd:language', self.namespaces))
+            etree.SubElement(lang, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val
+
+        # hierarchyLevel
+        mtype = util.getqattr(result, queryables['apiso:Type']['dbcol']) or None
+
+        if mtype is not None: 
+            hierarchy = etree.SubElement(node, util.nspath_eval('gmd:hierarchyLevel', self.namespaces))
+            hierarchy.append(_write_codelist_element('gmd:MD_ScopeCode', mtype, self.namespaces))
+
+        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
+
+            # date
+            val = util.getqattr(result, queryables['apiso:Modified']['dbcol'])
+            date = etree.SubElement(node, util.nspath_eval('gmd:dateStamp', self.namespaces))
+            if val and val.find('T') != -1:
+                dateel = 'gco:DateTime'
+            else:
+                dateel = 'gco:Date'
+            etree.SubElement(date, util.nspath_eval(dateel, self.namespaces)).text = val
+
+            metadatastandardname = 'ISO19115'
+            metadatastandardversion = '2003/Cor.1:2006'
+
+            if mtype == 'service':
+                metadatastandardname = 'ISO19119'
+                metadatastandardversion = '2005/PDAM 1'
+
+            # metadata standard name
+            standard = etree.SubElement(node, util.nspath_eval('gmd:metadataStandardName', self.namespaces))
+            etree.SubElement(standard, util.nspath_eval('gco:CharacterString', self.namespaces)).text = metadatastandardname
+
+            # metadata standard version
+            standardver = etree.SubElement(node, util.nspath_eval('gmd:metadataStandardVersion', self.namespaces))
+            etree.SubElement(standardver, util.nspath_eval('gco:CharacterString', self.namespaces)).text = metadatastandardversion
+
+        # title
+        val = util.getqattr(result, queryables['apiso:Title']['dbcol']) or ''
+        identification = etree.SubElement(node, util.nspath_eval('gmd:identificationInfo', self.namespaces))
+
+        if mtype == 'service':
+           restagname = 'srv:SV_ServiceIdentification'
+        else:
+           restagname = 'gmd:MD_DataIdentification'
+          
+        resident = etree.SubElement(identification, util.nspath_eval(restagname, self.namespaces), id=idval)
+        tmp2 = etree.SubElement(resident, util.nspath_eval('gmd:citation', self.namespaces))
+        tmp3 = etree.SubElement(tmp2, util.nspath_eval('gmd:CI_Citation', self.namespaces))
+        tmp4 = etree.SubElement(tmp3, util.nspath_eval('gmd:title', self.namespaces))
+        etree.SubElement(tmp4, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val
+
+        # creation date
+        val = util.getqattr(result, queryables['apiso:CreationDate']['dbcol'])
+        if val is not None:
+            tmp3.append(_write_date(val, 'creation', self.namespaces))
+        # publication date
+        val = util.getqattr(result, queryables['apiso:PublicationDate']['dbcol'])
+        if val is not None:
+            tmp3.append(_write_date(val, 'publication', self.namespaces))
+        # revision date
+        val = util.getqattr(result, queryables['apiso:RevisionDate']['dbcol'])
+        if val is not None:
+            tmp3.append(_write_date(val, 'revision', self.namespaces))
+
+        if esn in ['summary', 'full']:
+            # abstract
+            val = util.getqattr(result, queryables['apiso:Abstract']['dbcol']) or ''
+            tmp = etree.SubElement(resident, util.nspath_eval('gmd:abstract', self.namespaces))
+            etree.SubElement(tmp, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val
+
+            # keywords
+            kw = util.getqattr(result, queryables['apiso:Subject']['dbcol'])
+            if kw is not None:
+                md_keywords = etree.SubElement(resident, util.nspath_eval('gmd:descriptiveKeywords', self.namespaces))
+                md_keywords.append(write_keywords(kw, self.namespaces))
+
+            # spatial resolution
+            val = util.getqattr(result, queryables['apiso:Denominator']['dbcol'])
+            if val:
+                tmp = etree.SubElement(resident, util.nspath_eval('gmd:spatialResolution', self.namespaces))
+                tmp2 = etree.SubElement(tmp, util.nspath_eval('gmd:MD_Resolution', self.namespaces))
+                tmp3 = etree.SubElement(tmp2, util.nspath_eval('gmd:equivalentScale', self.namespaces))
+                tmp4 = etree.SubElement(tmp3, util.nspath_eval('gmd:MD_RepresentativeFraction', self.namespaces))
+                tmp5 = etree.SubElement(tmp4, util.nspath_eval('gmd:denominator', self.namespaces))
+                etree.SubElement(tmp5, util.nspath_eval('gco:Integer', self.namespaces)).text = str(val)
+
+            # resource language
+            val = util.getqattr(result, queryables['apiso:ResourceLanguage']['dbcol'])
+            tmp = etree.SubElement(resident, util.nspath_eval('gmd:language', self.namespaces))
+            etree.SubElement(tmp, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val
+
+            # topic category
+            val = util.getqattr(result, queryables['apiso:TopicCategory']['dbcol'])
+            if val:
+                for v in val.split(','):
+                    tmp = etree.SubElement(resident, util.nspath_eval('gmd:topicCategory', self.namespaces))
+                    etree.SubElement(tmp, util.nspath_eval('gmd:MD_TopicCategoryCode', self.namespaces)).text = val
+
+        # bbox extent
+        val = util.getqattr(result, queryables['apiso:BoundingBox']['dbcol'])
+        bboxel = write_extent(val, self.namespaces)
+        if bboxel is not None and mtype != 'service':
+            resident.append(bboxel)
+
+        # service identification
+
+        if mtype == 'service':
+            # service type
+            # service type version
+            val = util.getqattr(result, queryables['apiso:ServiceType']['dbcol'])
+            val2 = util.getqattr(result, queryables['apiso:ServiceTypeVersion']['dbcol'])
+            if val is not None:
+                tmp = etree.SubElement(resident, util.nspath_eval('srv:serviceType', self.namespaces))
+                etree.SubElement(tmp, util.nspath_eval('gco:LocalName', self.namespaces)).text = val
+                tmp = etree.SubElement(resident, util.nspath_eval('srv:serviceTypeVersion', self.namespaces))
+                etree.SubElement(tmp, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val2
+
+            kw = util.getqattr(result, queryables['apiso:Subject']['dbcol'])
+            if kw is not None:
+                srv_keywords = etree.SubElement(resident, util.nspath_eval('srv:keywords', self.namespaces))
+                srv_keywords.append(write_keywords(kw, self.namespaces))
+                 
+            if bboxel is not None:
+                bboxel.tag = util.nspath_eval('srv:extent', self.namespaces)
+                resident.append(bboxel)
+
+            val = util.getqattr(result, queryables['apiso:CouplingType']['dbcol'])
+            if val is not None:
+                couplingtype = etree.SubElement(resident, util.nspath_eval('srv:couplingType', self.namespaces))
+                etree.SubElement(couplingtype, util.nspath_eval('srv:SV_CouplingType', self.namespaces), codeListValue=val, codeList='%s#SV_CouplingType' % CODELIST).text = val
+
+            if esn in ['summary', 'full']:
+                # all service resources as coupled resources
+                coupledresources = util.getqattr(result, queryables['apiso:OperatesOn']['dbcol'])
+                operations = util.getqattr(result, queryables['apiso:Operation']['dbcol'])
+
+                if coupledresources:
+                    for val2 in coupledresources.split(','):
+                        coupledres = etree.SubElement(resident, util.nspath_eval('srv:coupledResource', self.namespaces))
+                        svcoupledres = etree.SubElement(coupledres, util.nspath_eval('srv:SV_CoupledResource', self.namespaces))
+                        opname = etree.SubElement(svcoupledres, util.nspath_eval('srv:operationName', self.namespaces))
+                        etree.SubElement(opname, util.nspath_eval('gco:CharacterString', self.namespaces)).text = _get_resource_opname(operations)
+                        sid = etree.SubElement(svcoupledres, util.nspath_eval('srv:identifier', self.namespaces))
+                        etree.SubElement(sid, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val2
+
+                # service operations
+                if operations:
+                    for i in operations.split(','):
+                        oper = etree.SubElement(resident, util.nspath_eval('srv:containsOperations', self.namespaces))
+                        tmp = etree.SubElement(oper, util.nspath_eval('srv:SV_OperationMetadata', self.namespaces))
+
+                        tmp2 = etree.SubElement(tmp, util.nspath_eval('srv:operationName', self.namespaces))
+                        etree.SubElement(tmp2, util.nspath_eval('gco:CharacterString', self.namespaces)).text = i
+
+                        tmp3 = etree.SubElement(tmp, util.nspath_eval('srv:DCP', self.namespaces))
+                        etree.SubElement(tmp3, util.nspath_eval('srv:DCPList', self.namespaces), codeList='%s#DCPList' % CODELIST, codeListValue='HTTPGet').text = 'HTTPGet' 
+
+                        tmp4 = etree.SubElement(tmp, util.nspath_eval('srv:DCP', self.namespaces))
+                        etree.SubElement(tmp4, util.nspath_eval('srv:DCPList', self.namespaces), codeList='%s#DCPList' % CODELIST, codeListValue='HTTPPost').text = 'HTTPPost' 
+
+                        connectpoint = etree.SubElement(tmp, util.nspath_eval('srv:connectPoint', self.namespaces))
+                        onlineres = etree.SubElement(connectpoint, util.nspath_eval('gmd:CI_OnlineResource', self.namespaces))
+                        linkage = etree.SubElement(onlineres, util.nspath_eval('gmd:linkage', self.namespaces))
+                        etree.SubElement(linkage, util.nspath_eval('gmd:URL', self.namespaces)).text = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Source'])
+
+                # operates on resource(s)
+                if coupledresources:
+                    for i in coupledresources.split(','):
+                        operates_on = etree.SubElement(resident, util.nspath_eval('srv:operatesOn', self.namespaces), uuidref=i)
+                        operates_on.attrib[util.nspath_eval('xlink:href', self.namespaces)] = '%sservice=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=%s-%s' % (util.bind_url(self.url), idval, i)
+
+        rlinks = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Links'])
+
+        if rlinks:
+            distinfo = etree.SubElement(node, util.nspath_eval('gmd:distributionInfo', self.namespaces))
+            distinfo2 = etree.SubElement(distinfo, util.nspath_eval('gmd:MD_Distribution', self.namespaces))
+            transopts = etree.SubElement(distinfo2, util.nspath_eval('gmd:transferOptions', self.namespaces))
+            dtransopts = etree.SubElement(transopts, util.nspath_eval('gmd:MD_DigitalTransferOptions', self.namespaces))
+
+            for link in rlinks.split('^'):
+                linkset = link.split(',')
+                online = etree.SubElement(dtransopts, util.nspath_eval('gmd:onLine', self.namespaces))
+                online2 = etree.SubElement(online, util.nspath_eval('gmd:CI_OnlineResource', self.namespaces))
+
+                linkage = etree.SubElement(online2, util.nspath_eval('gmd:linkage', self.namespaces))
+                etree.SubElement(linkage, util.nspath_eval('gmd:URL', self.namespaces)).text = linkset[-1]
+
+                protocol = etree.SubElement(online2, util.nspath_eval('gmd:protocol', self.namespaces))
+                etree.SubElement(protocol, util.nspath_eval('gco:CharacterString', self.namespaces)).text = linkset[2]
+
+                name = etree.SubElement(online2, util.nspath_eval('gmd:name', self.namespaces))
+                etree.SubElement(name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = linkset[0]
+
+                desc = etree.SubElement(online2, util.nspath_eval('gmd:description', self.namespaces))
+                etree.SubElement(desc, util.nspath_eval('gco:CharacterString', self.namespaces)).text = linkset[1]
+
+        return node
+
+def write_keywords(keywords, nsmap):
+    """generate gmd:MD_Keywords construct"""
+    md_keywords = etree.Element(util.nspath_eval('gmd:MD_Keywords', nsmap))
+    for kw in keywords.split(','):
+        keyword = etree.SubElement(md_keywords, util.nspath_eval('gmd:keyword', nsmap))
+        etree.SubElement(keyword, util.nspath_eval('gco:CharacterString', nsmap)).text = kw
+    return md_keywords
+
+def write_extent(bbox, nsmap):
+    ''' Generate BBOX extent '''
+
+    if bbox is not None:
+        try:
+            bbox2 = util.wkt2geom(bbox)
+        except:
+            return None
+        extent = etree.Element(util.nspath_eval('gmd:extent', nsmap))
+        ex_extent = etree.SubElement(extent, util.nspath_eval('gmd:EX_Extent', nsmap))
+        ge = etree.SubElement(ex_extent, util.nspath_eval('gmd:geographicElement', nsmap))
+        gbb = etree.SubElement(ge, util.nspath_eval('gmd:EX_GeographicBoundingBox', nsmap))
+        west = etree.SubElement(gbb, util.nspath_eval('gmd:westBoundLongitude', nsmap))
+        east = etree.SubElement(gbb, util.nspath_eval('gmd:eastBoundLongitude', nsmap))
+        south = etree.SubElement(gbb, util.nspath_eval('gmd:southBoundLatitude', nsmap))
+        north = etree.SubElement(gbb, util.nspath_eval('gmd:northBoundLatitude', nsmap))
+
+        etree.SubElement(west, util.nspath_eval('gco:Decimal', nsmap)).text = str(bbox2[0])
+        etree.SubElement(south, util.nspath_eval('gco:Decimal', nsmap)).text = str(bbox2[1])
+        etree.SubElement(east, util.nspath_eval('gco:Decimal', nsmap)).text = str(bbox2[2])
+        etree.SubElement(north, util.nspath_eval('gco:Decimal', nsmap)).text = str(bbox2[3])
+        return extent
+    return None
+
+def _write_date(dateval, datetypeval, nsmap):
+    date1 = etree.Element(util.nspath_eval('gmd:date', nsmap))
+    date2 = etree.SubElement(date1, util.nspath_eval('gmd:CI_Date', nsmap))
+    date3 = etree.SubElement(date2, util.nspath_eval('gmd:date', nsmap))
+    if dateval.find('T') != -1:
+        dateel = 'gco:DateTime'
+    else:
+        dateel = 'gco:Date'
+    etree.SubElement(date3, util.nspath_eval(dateel, nsmap)).text = dateval
+    datetype = etree.SubElement(date2, util.nspath_eval('gmd:dateType', nsmap))
+    datetype.append(_write_codelist_element('gmd:CI_DateTypeCode', datetypeval, nsmap))
+    return date1
+
+def _get_resource_opname(operations):
+    for op in operations.split(','):
+        if op in ['GetMap', 'GetFeature', 'GetCoverage', 'GetObservation']:
+            return op
+    return None
+
+def _write_codelist_element(codelist_element, codelist_value, nsmap):
+    namespace, codelist = codelist_element.split(':')    
+
+    element = etree.Element(util.nspath_eval(codelist_element, nsmap),
+    codeSpace=CODESPACE, codeList='%s#%s' % (CODELIST, codelist),
+    codeListValue=codelist_value)
+
+    element.text = codelist_value
+
+    return element
+
diff --git a/pycsw/plugins/profiles/apiso/docs/apiso.rst b/pycsw/plugins/profiles/apiso/docs/apiso.rst
new file mode 100644
index 0000000..164c532
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/docs/apiso.rst
@@ -0,0 +1,56 @@
+.. _apiso:
+
+ISO Metadata Application Profile (1.0.0)
+----------------------------------------
+
+Overview
+^^^^^^^^
+The ISO Metadata Application Profile (APISO) is a profile of CSW 2.0.2 which enables discovery of geospatial metadata following ISO 19139:2007 and ISO 19119:2005/PDAM 1.
+
+Configuration
+^^^^^^^^^^^^^
+
+No extra configuration is required.
+
+Querying
+^^^^^^^^
+
+ * **typename**: ``gmd:MD_Metadata``
+ * **outputschema**: ``http://www.isotc211.org/2005/gmd``
+
+Enabling APISO Support
+^^^^^^^^^^^^^^^^^^^^^^
+
+To enable APISO support, add ``apiso`` to ``server.profiles`` as specified in :ref:`configuration`.
+
+Testing
+^^^^^^^
+
+A testing interface is available in ``tests/index.html`` which contains tests specific to APISO to demonstrate functionality.  See :ref:`tests` for more information.
+
+INSPIRE Extension
+-----------------
+
+Overview
+^^^^^^^^
+
+APISO includes an extension for enabling `INSPIRE Discovery Services 3.0`_ support.  To enable the INSPIRE extension to APISO, create a ``[metadata:inspire]`` section in the main configuration with ``enabled`` set to ``true``.
+
+Configuration
+^^^^^^^^^^^^^
+
+**[metadata:inspire]**
+
+- **enabled**: whether to enable the INSPIRE extension (``true`` or ``false``)
+- **languages_supported**: supported languages (see http://inspire.ec.europa.eu/schemas/common/1.0/enums/enum_eng.xsd, simpleType ``euLanguageISO6392B``)
+- **default_language**: the default language (see http://inspire.ec.europa.eu/schemas/common/1.0/enums/enum_eng.xsd, simpleType ``euLanguageISO6392B``)
+- **date**: date of INSPIRE metadata offering (in `ISO 8601`_ format)
+- **gemet_keywords**: a comma-seperated keyword list of `GEMET INSPIRE theme keywords`_ about the service (see http://inspire.ec.europa.eu/schemas/common/1.0/enums/enum_eng.xsd, complexType ``inspireTheme_eng``)
+- **conformity_service**: the level of INSPIRE conformance for spatial data sets and services (``conformant``, ``notConformant``, ``notEvaluated``)
+- **contact_organization**: the organization name responsible for the INSPIRE metadata
+- **contact_email**: the email address of entity responsible for the INSPIRE metadata
+- **temp_extent**: temporal extent of the service (in `ISO 8601`_ format).  Either a single date (i.e. ``yyyy-mm-dd``), or an extent (i.e. ``yyyy-mm-dd/yyyy-mm-dd``)
+
+.. _`INSPIRE Discovery Services 3.0`: http://inspire.jrc.ec.europa.eu/documents/Network_Services/TechnicalGuidance_DiscoveryServices_v3.0.pdf
+.. _`GEMET INSPIRE theme keywords`: http://www.eionet.europa.eu/gemet/inspire_themes
+.. _`ISO 8601`: http://en.wikipedia.org/wiki/ISO_8601
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/csw/2.0.2/profiles/apiso/1.0.0/ReadMe.txt b/pycsw/plugins/profiles/apiso/schemas/ogc/csw/2.0.2/profiles/apiso/1.0.0/ReadMe.txt
new file mode 100644
index 0000000..75a8b8e
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/csw/2.0.2/profiles/apiso/1.0.0/ReadMe.txt
@@ -0,0 +1,24 @@
+OpenGIS(r) CSW 2.0.2 ISO Metadata Application Profile ReadMe.txt
+
+2007-07-19  Uwe Voges
+
+  * csw/2.0.2/profiles/apiso/1.0.0: See OGC 07-045 for associated specification
+  * apiso/1.0.0: validated using oXygen XML Editor 8.2 build 2007062515 (Xerces-J 2.9.0) - kstegemoller
+  * apiso/1.0.0: validated using XMLSpy 2007 sp1 - Uwe Voges
+  * iso/19139/20060504: added ISO-19139 used by apiso/1.0.0
+  * APISO 1.0.0 builds upon the following schemas
+    + OGC csw/2.0.2
+    + OGC xlink/1.0.0
+    + ISO iso/19139/20060504
+    + OGC ows/1.0.0
+    + OGC filter/1.1.0
+    + OGC gml/3.1.1/base
+
+The Open Geospatial Consortium, Inc. official schema repository is at
+  http://schemas.opengis.net/ .
+Policies, Procedures, Terms, and Conditions of OGC(r) are available
+  http://www.opengeospatial.org/ogc/policies/ .
+Additional rights of use are described at
+  http://www.opengeospatial.org/legal/ . 
+
+Copyright (c) 2007 Open Geospatial Consortium, Inc. All Rights Reserved.
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd
new file mode 100644
index 0000000..1f93321
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink"
+           xmlns:gmd="http://www.isotc211.org/2005/gmd">
+    <!-- ================================= Annotation ================================ -->
+    <xs:annotation>
+        <xs:documentation>ISO Wrapper to include service related type to GMD</xs:documentation>
+    </xs:annotation>
+    <!-- ================================== Imports & Includes ================================== -->
+    <xs:include schemaLocation="../../../../../iso/19139/20060504/gmd/gmd.xsd"/>
+    <xs:import namespace="http://www.isotc211.org/2005/srv" schemaLocation="../../../../../iso/19139/20060504/srv/srv.xsd"/>
+</xs:schema>
+ 
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/ReadMe.txt b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/ReadMe.txt
new file mode 100644
index 0000000..c4ac291
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/ReadMe.txt
@@ -0,0 +1,19 @@
+19139 XSchemas TS RC (2006 May 4)
+-----------------------------------------------
+
+OGC GML 3.2.0 version => ISO 19136 XSchemas DIS (2005 november)
+ -- http://www.isotc211.org/2005/
+
+These schemas from ISO 19139 version 2005-DIS (Draft International Standard)
+dated 2006 May 4. For the sake of convenience, GML 3.2 XML schemas (version
+19136 DIS - 2005 november) are (temporarily) provided with the 19139 set of
+schemas. They were retrieved from http://www.isotc211.org/2005/ . Once these
+schemas are finalized they will become OGC GML 3.2.1 and ISO/TS 19136.
+
+Changes made to these ISO 19139 schemas by OGC:
+  * changed xlink references from ../xlink/xlinks.xsd to ../../../../xlink/1.0.0/xlinks.xsd
+    so they use http://schemas.opengis.net/xlink/1.0.0/xlinks.xsd .
+  * removed xlinks directory and schema
+  * replaced 19139-GML_readme.txt with this document.
+
+-- Kevin Stegemoller 2007-08-14
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/Version.txt b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/Version.txt
new file mode 100644
index 0000000..41a0303
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/Version.txt
@@ -0,0 +1,6 @@
+19139 XSchemas TS RC (2006 May 4)
+-----------------------------------------------
+
+GML version => 19136 XSchemas DIS (2005 november)
+
+
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gco/basicTypes.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gco/basicTypes.xsd
new file mode 100644
index 0000000..803f899
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gco/basicTypes.xsd
@@ -0,0 +1,429 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gco" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:gco="http://www.isotc211.org/2005/gco">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:00:05 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="../gml/gml.xsd"/>
+	<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="../../../../../../../../../../pycsw/schemas/w3c/1999/xlink.xsd"/>
+	<xs:include schemaLocation="../gco/gcoBase.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- =========================================================================== -->
+	<xs:complexType name="TypeName_Type">
+		<xs:annotation>
+			<xs:documentation>A TypeName is a LocalName that references either a recordType or object type in some form of schema. The stored value "aName" is the returned value for the "aName()" operation. This is the types name.  - For parsing from types (or objects) the parsible name normally uses a "." navigation separator, so that it is of the form  [class].[member].[memberOfMember]. ...)</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="aName" type="gco:CharacterString_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="TypeName" type="gco:TypeName_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="TypeName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:TypeName"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MemberName_Type">
+		<xs:annotation>
+			<xs:documentation>A MemberName is a LocalName that references either an attribute slot in a record or  recordType or an attribute, operation, or association role in an object instance or  type description in some form of schema. The stored value "aName" is the returned value for the "aName()" operation.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="aName" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="attributeType" type="gco:TypeName_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MemberName" type="gco:MemberName_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MemberName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:MemberName"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="Multiplicity_Type">
+		<xs:annotation>
+			<xs:documentation>Use to represent the possible cardinality of a relation. Represented by a set of simple multiplicity ranges.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="range" type="gco:MultiplicityRange_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="Multiplicity" type="gco:Multiplicity_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Multiplicity_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Multiplicity"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MultiplicityRange_Type">
+		<xs:annotation>
+			<xs:documentation>A component of a multiplicity, consisting of an non-negative lower bound, and a potentially infinite upper bound.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="lower" type="gco:Integer_PropertyType"/>
+					<xs:element name="upper" type="gco:UnlimitedInteger_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MultiplicityRange" type="gco:MultiplicityRange_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MultiplicityRange_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:MultiplicityRange"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!--================================================-->
+	<!-- ================== Measure ===================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Measure" type="gml:MeasureType"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Measure_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Measure"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Length" type="gml:LengthType" substitutionGroup="gco:Measure"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Length_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Length"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Angle" type="gml:AngleType" substitutionGroup="gco:Measure"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Angle_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Angle"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Scale" type="gml:ScaleType" substitutionGroup="gco:Measure"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Scale_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Scale"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Distance" type="gml:LengthType" substitutionGroup="gco:Length"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Distance_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Distance"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CharacterString" type="xs:string"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CharacterString_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:CharacterString"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Boolean" type="xs:boolean"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Boolean_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Boolean"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractGenericName" type="gml:CodeType" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="GenericName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:AbstractGenericName"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="LocalName" type="gml:CodeType" substitutionGroup="gco:AbstractGenericName"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LocalName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:LocalName"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="ScopedName" type="gml:CodeType" substitutionGroup="gco:AbstractGenericName"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ScopedName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:ScopedName"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ============================= UOM ========================================= -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomAngle_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomLength_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomScale_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UnitOfMeasure_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomArea_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomVelocity_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomTime_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomVolume_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- =========================== Date & DateTime ================================= -->
+	<!--=============================================-->
+	<xs:element name="DateTime" type="xs:dateTime"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DateTime_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:DateTime"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="Date_Type">
+		<xs:union memberTypes="xs:date xs:gYearMonth xs:gYear"/>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="Date" type="gco:Date_Type" nillable="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Date_PropertyType">
+		<xs:choice minOccurs="0">
+			<xs:element ref="gco:Date"/>
+			<xs:element ref="gco:DateTime"/>
+		</xs:choice>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- =========================== Number basic type =============================== -->
+	<!--=======================================================-->
+	<xs:complexType name="Number_PropertyType">
+		<xs:choice minOccurs="0">
+			<xs:element ref="gco:Real"/>
+			<xs:element ref="gco:Decimal"/>
+			<xs:element ref="gco:Integer"/>
+		</xs:choice>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Decimal" type="xs:decimal"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Decimal_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Decimal"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Real" type="xs:double"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Real_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Real"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Integer" type="xs:integer"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Integer_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Integer"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ============================= UnlimitedInteger ================================ -->
+	<!--NB: The encoding mechanism below is based on the use of XCPT (see the usage of xsi:nil in XML instance).-->
+	<!--================= Type ==================-->
+	<xs:complexType name="UnlimitedInteger_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:nonNegativeInteger">
+				<xs:attribute name="isInfinite" type="xs:boolean"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="UnlimitedInteger" type="gco:UnlimitedInteger_Type" nillable="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="UnlimitedInteger_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:UnlimitedInteger"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ========================= Record & RecordType ============================== -->
+	<!--================= Record ==================-->
+	<xs:element name="Record"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Record_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Record"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--================= RecordType ==================-->
+	<xs:complexType name="RecordType_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attributeGroup ref="xlink:simpleAttrs"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="RecordType" type="gco:RecordType_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="RecordType_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:RecordType"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- =========================== Binary basic type ================================ -->
+	<!--NB: this type is not declared in 19103 but used in 19115. -->
+	<!--================= Type ==================-->
+	<xs:complexType name="Binary_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="src" type="xs:anyURI"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="Binary" type="gco:Binary_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Binary_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gco:Binary"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!--================================================-->
+	<!-- =============================================== -->
+	<!--================================================-->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gco/gco.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gco/gco.xsd
new file mode 100644
index 0000000..65af021
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gco/gco.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gco" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:00:06 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="../gco/basicTypes.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gco/gcoBase.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gco/gcoBase.xsd
new file mode 100644
index 0000000..4f6f796
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gco/gcoBase.xsd
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gco" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This schema provides:
+		1.  tools to handle specific objects like "code lists" and "record";
+		2. Some XML types representing that do not follow the general encoding rules.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="../../../../../../../../../../pycsw/schemas/w3c/1999/xlink.xsd"/>
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="../gml/gml.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- =========================================================================== -->
+	<!-- ========================= IM_Object: abstract Root ============================= -->
+	<!--================= Type ===================-->
+	<xs:complexType name="AbstractObject_Type" abstract="true">
+		<xs:sequence/>
+		<xs:attributeGroup ref="gco:ObjectIdentification"/>
+	</xs:complexType>
+	<!--================= Element =================-->
+	<xs:element name="AbstractObject" type="gco:AbstractObject_Type" abstract="true"/>
+	<!-- ========================================================================== -->
+	<!-- ====================== Reference of a resource =============================== -->
+	<!--The following attributeGroup 'extends' the GML  gml:AssociationAttributeGroup-->
+	<xs:attributeGroup name="ObjectReference">
+		<xs:attributeGroup ref="xlink:simpleAttrs"/>
+		<xs:attribute name="uuidref" type="xs:string"/>
+	</xs:attributeGroup>
+	<!--================== NULL ====================-->
+	<xs:attribute name="nilReason" type="gml:NilReasonType"/>
+	<!--=============== PropertyType =================-->
+	<xs:complexType name="ObjectReference_PropertyType">
+		<xs:sequence/>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ====================== Identification of a resource ============================== -->
+	<xs:attributeGroup name="ObjectIdentification">
+		<xs:attribute name="id" type="xs:ID"/>
+		<xs:attribute name="uuid" type="xs:string"/>
+	</xs:attributeGroup>
+	<!-- ========================================================================== -->
+	<!-- ====================== The CodeList prototype ================================= -->
+	<!--It is used to refer to a specific codeListValue in a register-->
+	<!--================= Type ==================-->
+	<xs:complexType name="CodeListValue_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="codeList" type="xs:anyURI" use="required"/>
+				<xs:attribute name="codeListValue" type="xs:anyURI" use="required"/>
+				<xs:attribute name="codeSpace" type="xs:anyURI"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ========================== The isoType attribute ============================== -->
+	<xs:attribute name="isoType" type="xs:string"/>
+	<!--==============End================-->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/applicationSchema.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/applicationSchema.xsd
new file mode 100644
index 0000000..fbf8f52
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/applicationSchema.xsd
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_ApplicationSchemaInformation_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the application schema used to build the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gmd:CI_Citation_PropertyType"/>
+					<xs:element name="schemaLanguage" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="constraintLanguage" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="schemaAscii" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="graphicsFile" type="gco:Binary_PropertyType" minOccurs="0"/>
+					<xs:element name="softwareDevelopmentFile" type="gco:Binary_PropertyType" minOccurs="0"/>
+					<xs:element name="softwareDevelopmentFileFormat" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ApplicationSchemaInformation" type="gmd:MD_ApplicationSchemaInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ApplicationSchemaInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ApplicationSchemaInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/citation.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/citation.xsd
new file mode 100644
index 0000000..b4508da
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/citation.xsd
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/referenceSystem.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="CI_ResponsibleParty_Type">
+		<xs:annotation>
+			<xs:documentation>Identification of, and means of communication with, person(s) and organisations associated with the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="individualName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="organisationName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="positionName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="contactInfo" type="gmd:CI_Contact_PropertyType" minOccurs="0"/>
+					<xs:element name="role" type="gmd:CI_RoleCode_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_ResponsibleParty" type="gmd:CI_ResponsibleParty_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_ResponsibleParty_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_ResponsibleParty"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Citation_Type">
+		<xs:annotation>
+			<xs:documentation>Standardized resource reference</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="title" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="alternateTitle" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="date" type="gmd:CI_Date_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="edition" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="editionDate" type="gco:Date_PropertyType" minOccurs="0"/>
+					<xs:element name="identifier" type="gmd:MD_Identifier_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="citedResponsibleParty" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="presentationForm" type="gmd:CI_PresentationFormCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="series" type="gmd:CI_Series_PropertyType" minOccurs="0"/>
+					<xs:element name="otherCitationDetails" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="collectiveTitle" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="ISBN" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="ISSN" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Citation" type="gmd:CI_Citation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Citation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Citation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Address_Type">
+		<xs:annotation>
+			<xs:documentation>Location of the responsible individual or organisation</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="deliveryPoint" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="city" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="administrativeArea" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="postalCode" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="country" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="electronicMailAddress" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Address" type="gmd:CI_Address_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Address_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Address"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_OnlineResource_Type">
+		<xs:annotation>
+			<xs:documentation>Information about online sources from which the dataset, specification, or community profile name and extended metadata elements can be obtained.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="linkage" type="gmd:URL_PropertyType"/>
+					<xs:element name="protocol" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="applicationProfile" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="name" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="function" type="gmd:CI_OnLineFunctionCode_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_OnlineResource" type="gmd:CI_OnlineResource_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_OnlineResource_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_OnlineResource"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Contact_Type">
+		<xs:annotation>
+			<xs:documentation>Information required enabling contact with the  responsible person and/or organisation</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="phone" type="gmd:CI_Telephone_PropertyType" minOccurs="0"/>
+					<xs:element name="address" type="gmd:CI_Address_PropertyType" minOccurs="0"/>
+					<xs:element name="onlineResource" type="gmd:CI_OnlineResource_PropertyType" minOccurs="0"/>
+					<xs:element name="hoursOfService" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="contactInstructions" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Contact" type="gmd:CI_Contact_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Contact_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Contact"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Telephone_Type">
+		<xs:annotation>
+			<xs:documentation>Telephone numbers for contacting the responsible individual or organisation</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="voice" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="facsimile" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Telephone" type="gmd:CI_Telephone_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Telephone_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Telephone"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Date_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="date" type="gco:Date_PropertyType"/>
+					<xs:element name="dateType" type="gmd:CI_DateTypeCode_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Date" type="gmd:CI_Date_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Date_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Date"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CI_Series_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="issueIdentification" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="page" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CI_Series" type="gmd:CI_Series_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_Series_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_Series"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="URL" type="xs:anyURI"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="URL_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:URL"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CI_RoleCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_RoleCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_RoleCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CI_PresentationFormCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_PresentationFormCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_PresentationFormCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CI_OnLineFunctionCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_OnLineFunctionCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_OnLineFunctionCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="CI_DateTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CI_DateTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:CI_DateTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/constraints.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/constraints.xsd
new file mode 100644
index 0000000..d3cf941
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/constraints.xsd
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:01 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_Constraints_Type">
+		<xs:annotation>
+			<xs:documentation>Restrictions on the access and use of a dataset or metadata</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="useLimitation" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Constraints" type="gmd:MD_Constraints_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Constraints_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Constraints"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_LegalConstraints_Type">
+		<xs:annotation>
+			<xs:documentation>Restrictions and legal prerequisites for accessing and using the dataset.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_Constraints_Type">
+				<xs:sequence>
+					<xs:element name="accessConstraints" type="gmd:MD_RestrictionCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="useConstraints" type="gmd:MD_RestrictionCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="otherConstraints" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_LegalConstraints" type="gmd:MD_LegalConstraints_Type" substitutionGroup="gmd:MD_Constraints"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_LegalConstraints_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_LegalConstraints"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_SecurityConstraints_Type">
+		<xs:annotation>
+			<xs:documentation>Handling restrictions imposed on the dataset because of national security, privacy, or other concerns</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_Constraints_Type">
+				<xs:sequence>
+					<xs:element name="classification" type="gmd:MD_ClassificationCode_PropertyType"/>
+					<xs:element name="userNote" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="classificationSystem" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="handlingDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_SecurityConstraints" type="gmd:MD_SecurityConstraints_Type" substitutionGroup="gmd:MD_Constraints"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_SecurityConstraints_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_SecurityConstraints"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ClassificationCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ClassificationCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ClassificationCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_RestrictionCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_RestrictionCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_RestrictionCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/content.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/content.xsd
new file mode 100644
index 0000000..9089c36
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/content.xsd
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_FeatureCatalogueDescription_Type">
+		<xs:annotation>
+			<xs:documentation>Information identifing the feature catalogue</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_ContentInformation_Type">
+				<xs:sequence>
+					<xs:element name="complianceCode" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="language" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="includedWithDataset" type="gco:Boolean_PropertyType"/>
+					<xs:element name="featureTypes" type="gco:GenericName_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="featureCatalogueCitation" type="gmd:CI_Citation_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_FeatureCatalogueDescription" type="gmd:MD_FeatureCatalogueDescription_Type" substitutionGroup="gmd:AbstractMD_ContentInformation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_FeatureCatalogueDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_FeatureCatalogueDescription"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_CoverageDescription_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the domain of the raster cell</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_ContentInformation_Type">
+				<xs:sequence>
+					<xs:element name="attributeDescription" type="gco:RecordType_PropertyType"/>
+					<xs:element name="contentType" type="gmd:MD_CoverageContentTypeCode_PropertyType"/>
+					<xs:element name="dimension" type="gmd:MD_RangeDimension_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_CoverageDescription" type="gmd:MD_CoverageDescription_Type" substitutionGroup="gmd:AbstractMD_ContentInformation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_CoverageDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_CoverageDescription"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_ImageDescription_Type">
+		<xs:annotation>
+			<xs:documentation>Information about an image's suitability for use</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_CoverageDescription_Type">
+				<xs:sequence>
+					<xs:element name="illuminationElevationAngle" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="illuminationAzimuthAngle" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="imagingCondition" type="gmd:MD_ImagingConditionCode_PropertyType" minOccurs="0"/>
+					<xs:element name="imageQualityCode" type="gmd:MD_Identifier_PropertyType" minOccurs="0"/>
+					<xs:element name="cloudCoverPercentage" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="processingLevelCode" type="gmd:MD_Identifier_PropertyType" minOccurs="0"/>
+					<xs:element name="compressionGenerationQuantity" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="triangulationIndicator" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="radiometricCalibrationDataAvailability" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="cameraCalibrationInformationAvailability" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="filmDistortionInformationAvailability" type="gco:Boolean_PropertyType" minOccurs="0"/>
+					<xs:element name="lensDistortionInformationAvailability" type="gco:Boolean_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ImageDescription" type="gmd:MD_ImageDescription_Type" substitutionGroup="gmd:MD_CoverageDescription"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ImageDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ImageDescription"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractMD_ContentInformation_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractMD_ContentInformation" type="gmd:AbstractMD_ContentInformation_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ContentInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractMD_ContentInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_RangeDimension_Type">
+		<xs:annotation>
+			<xs:documentation>Set of adjacent wavelengths in the electro-magnetic spectrum with a common characteristic, such as the visible band</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="sequenceIdentifier" type="gco:MemberName_PropertyType" minOccurs="0"/>
+					<xs:element name="descriptor" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_RangeDimension" type="gmd:MD_RangeDimension_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_RangeDimension_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_RangeDimension"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Band_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_RangeDimension_Type">
+				<xs:sequence>
+					<xs:element name="maxValue" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="minValue" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="units" type="gco:UomLength_PropertyType" minOccurs="0"/>
+					<xs:element name="peakResponse" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="bitsPerValue" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="toneGradation" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="scaleFactor" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="offset" type="gco:Real_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Band" type="gmd:MD_Band_Type" substitutionGroup="gmd:MD_RangeDimension"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Band_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Band"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_CoverageContentTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_CoverageContentTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_CoverageContentTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ImagingConditionCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ImagingConditionCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ImagingConditionCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/dataQuality.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/dataQuality.xsd
new file mode 100644
index 0000000..70762bf
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/dataQuality.xsd
@@ -0,0 +1,554 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:01 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/identification.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="LI_ProcessStep_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="description" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="rationale" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="dateTime" type="gco:DateTime_PropertyType" minOccurs="0"/>
+					<xs:element name="processor" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="source" type="gmd:LI_Source_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="LI_ProcessStep" type="gmd:LI_ProcessStep_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LI_ProcessStep_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:LI_ProcessStep"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="LI_Source_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="scaleDenominator" type="gmd:MD_RepresentativeFraction_PropertyType" minOccurs="0"/>
+					<xs:element name="sourceReferenceSystem" type="gmd:MD_ReferenceSystem_PropertyType" minOccurs="0"/>
+					<xs:element name="sourceCitation" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+					<xs:element name="sourceExtent" type="gmd:EX_Extent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="sourceStep" type="gmd:LI_ProcessStep_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="LI_Source" type="gmd:LI_Source_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LI_Source_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:LI_Source"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="LI_Lineage_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="statement" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="processStep" type="gmd:LI_ProcessStep_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="source" type="gmd:LI_Source_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="LI_Lineage" type="gmd:LI_Lineage_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LI_Lineage_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:LI_Lineage"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_ConformanceResult_Type">
+		<xs:annotation>
+			<xs:documentation>quantitative_result from Quality Procedures -  - renamed to remove implied use limitiation.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Result_Type">
+				<xs:sequence>
+					<xs:element name="specification" type="gmd:CI_Citation_PropertyType"/>
+					<xs:element name="explanation" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="pass" type="gco:Boolean_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_ConformanceResult" type="gmd:DQ_ConformanceResult_Type" substitutionGroup="gmd:AbstractDQ_Result"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_ConformanceResult_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_ConformanceResult"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_QuantitativeResult_Type">
+		<xs:annotation>
+			<xs:documentation>Quantitative_conformance_measure from Quality Procedures.  -  - Renamed to remove implied use limitation -  - OCL - -- result is type specified by valueDomain - result.tupleType = valueDomain</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Result_Type">
+				<xs:sequence>
+					<xs:element name="valueType" type="gco:RecordType_PropertyType" minOccurs="0"/>
+					<xs:element name="valueUnit" type="gco:UnitOfMeasure_PropertyType"/>
+					<xs:element name="errorStatistic" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="value" type="gco:Record_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_QuantitativeResult" type="gmd:DQ_QuantitativeResult_Type" substitutionGroup="gmd:AbstractDQ_Result"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_QuantitativeResult_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_QuantitativeResult"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_Result_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_Result" type="gmd:AbstractDQ_Result_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_Result_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_Result"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_TemporalValidity_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_TemporalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_TemporalValidity" type="gmd:DQ_TemporalValidity_Type" substitutionGroup="gmd:AbstractDQ_TemporalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_TemporalValidity_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_TemporalValidity"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_TemporalConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_TemporalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_TemporalConsistency" type="gmd:DQ_TemporalConsistency_Type" substitutionGroup="gmd:AbstractDQ_TemporalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_TemporalConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_TemporalConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_AccuracyOfATimeMeasurement_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_TemporalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_AccuracyOfATimeMeasurement" type="gmd:DQ_AccuracyOfATimeMeasurement_Type" substitutionGroup="gmd:AbstractDQ_TemporalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_AccuracyOfATimeMeasurement_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_AccuracyOfATimeMeasurement"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_QuantitativeAttributeAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_ThematicAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_QuantitativeAttributeAccuracy" type="gmd:DQ_QuantitativeAttributeAccuracy_Type" substitutionGroup="gmd:AbstractDQ_ThematicAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_QuantitativeAttributeAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_QuantitativeAttributeAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_NonQuantitativeAttributeAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_ThematicAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_NonQuantitativeAttributeAccuracy" type="gmd:DQ_NonQuantitativeAttributeAccuracy_Type" substitutionGroup="gmd:AbstractDQ_ThematicAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_NonQuantitativeAttributeAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_NonQuantitativeAttributeAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_ThematicClassificationCorrectness_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_ThematicAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_ThematicClassificationCorrectness" type="gmd:DQ_ThematicClassificationCorrectness_Type" substitutionGroup="gmd:AbstractDQ_ThematicAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_ThematicClassificationCorrectness_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_ThematicClassificationCorrectness"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_RelativeInternalPositionalAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_PositionalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_RelativeInternalPositionalAccuracy" type="gmd:DQ_RelativeInternalPositionalAccuracy_Type" substitutionGroup="gmd:AbstractDQ_PositionalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_RelativeInternalPositionalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_RelativeInternalPositionalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_GriddedDataPositionalAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_PositionalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_GriddedDataPositionalAccuracy" type="gmd:DQ_GriddedDataPositionalAccuracy_Type" substitutionGroup="gmd:AbstractDQ_PositionalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_GriddedDataPositionalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_GriddedDataPositionalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_AbsoluteExternalPositionalAccuracy_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_PositionalAccuracy_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_AbsoluteExternalPositionalAccuracy" type="gmd:DQ_AbsoluteExternalPositionalAccuracy_Type" substitutionGroup="gmd:AbstractDQ_PositionalAccuracy"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_AbsoluteExternalPositionalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_AbsoluteExternalPositionalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_TopologicalConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_LogicalConsistency_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_TopologicalConsistency" type="gmd:DQ_TopologicalConsistency_Type" substitutionGroup="gmd:AbstractDQ_LogicalConsistency"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_TopologicalConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_TopologicalConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_FormatConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_LogicalConsistency_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_FormatConsistency" type="gmd:DQ_FormatConsistency_Type" substitutionGroup="gmd:AbstractDQ_LogicalConsistency"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_FormatConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_FormatConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_DomainConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_LogicalConsistency_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_DomainConsistency" type="gmd:DQ_DomainConsistency_Type" substitutionGroup="gmd:AbstractDQ_LogicalConsistency"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_DomainConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_DomainConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_ConceptualConsistency_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_LogicalConsistency_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_ConceptualConsistency" type="gmd:DQ_ConceptualConsistency_Type" substitutionGroup="gmd:AbstractDQ_LogicalConsistency"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_ConceptualConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_ConceptualConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_CompletenessOmission_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Completeness_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_CompletenessOmission" type="gmd:DQ_CompletenessOmission_Type" substitutionGroup="gmd:AbstractDQ_Completeness"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_CompletenessOmission_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_CompletenessOmission"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_CompletenessCommission_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Completeness_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_CompletenessCommission" type="gmd:DQ_CompletenessCommission_Type" substitutionGroup="gmd:AbstractDQ_Completeness"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_CompletenessCommission_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_CompletenessCommission"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_TemporalAccuracy_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_TemporalAccuracy" type="gmd:AbstractDQ_TemporalAccuracy_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_TemporalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_TemporalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_ThematicAccuracy_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_ThematicAccuracy" type="gmd:AbstractDQ_ThematicAccuracy_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_ThematicAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_ThematicAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_PositionalAccuracy_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_PositionalAccuracy" type="gmd:AbstractDQ_PositionalAccuracy_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_PositionalAccuracy_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_PositionalAccuracy"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_LogicalConsistency_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_LogicalConsistency" type="gmd:AbstractDQ_LogicalConsistency_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_LogicalConsistency_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_LogicalConsistency"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_Completeness_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDQ_Element_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_Completeness" type="gmd:AbstractDQ_Completeness_Type" abstract="true" substitutionGroup="gmd:AbstractDQ_Element"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_Completeness_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_Completeness"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractDQ_Element_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="nameOfMeasure" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="measureIdentification" type="gmd:MD_Identifier_PropertyType" minOccurs="0"/>
+					<xs:element name="measureDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="evaluationMethodType" type="gmd:DQ_EvaluationMethodTypeCode_PropertyType" minOccurs="0"/>
+					<xs:element name="evaluationMethodDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="evaluationProcedure" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+					<xs:element name="dateTime" type="gco:DateTime_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="result" type="gmd:DQ_Result_PropertyType" maxOccurs="2"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDQ_Element" type="gmd:AbstractDQ_Element_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_Element_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDQ_Element"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_DataQuality_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="scope" type="gmd:DQ_Scope_PropertyType"/>
+					<xs:element name="report" type="gmd:DQ_Element_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="lineage" type="gmd:LI_Lineage_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_DataQuality" type="gmd:DQ_DataQuality_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_DataQuality_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_DataQuality"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DQ_Scope_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="level" type="gmd:MD_ScopeCode_PropertyType"/>
+					<xs:element name="extent" type="gmd:EX_Extent_PropertyType" minOccurs="0"/>
+					<xs:element name="levelDescription" type="gmd:MD_ScopeDescription_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_Scope" type="gmd:DQ_Scope_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_Scope_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_Scope"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DQ_EvaluationMethodTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DQ_EvaluationMethodTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DQ_EvaluationMethodTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/distribution.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/distribution.xsd
new file mode 100644
index 0000000..fee05da
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/distribution.xsd
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_Medium_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the media on which the data can be distributed</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gmd:MD_MediumNameCode_PropertyType" minOccurs="0"/>
+					<xs:element name="density" type="gco:Real_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="densityUnits" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="volumes" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="mediumFormat" type="gmd:MD_MediumFormatCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="mediumNote" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Medium" type="gmd:MD_Medium_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Medium_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Medium"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_DigitalTransferOptions_Type">
+		<xs:annotation>
+			<xs:documentation>Technical means and media by which a dataset is obtained from the distributor</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="unitsOfDistribution" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="transferSize" type="gco:Real_PropertyType" minOccurs="0"/>
+					<xs:element name="onLine" type="gmd:CI_OnlineResource_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="offLine" type="gmd:MD_Medium_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DigitalTransferOptions" type="gmd:MD_DigitalTransferOptions_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DigitalTransferOptions_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DigitalTransferOptions"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_StandardOrderProcess_Type">
+		<xs:annotation>
+			<xs:documentation>Common ways in which the dataset may be obtained or received, and related instructions and fee information</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="fees" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="plannedAvailableDateTime" type="gco:DateTime_PropertyType" minOccurs="0"/>
+					<xs:element name="orderingInstructions" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="turnaround" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_StandardOrderProcess" type="gmd:MD_StandardOrderProcess_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_StandardOrderProcess_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_StandardOrderProcess"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Distributor_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the distributor</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="distributorContact" type="gmd:CI_ResponsibleParty_PropertyType"/>
+					<xs:element name="distributionOrderProcess" type="gmd:MD_StandardOrderProcess_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="distributorFormat" type="gmd:MD_Format_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="distributorTransferOptions" type="gmd:MD_DigitalTransferOptions_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Distributor" type="gmd:MD_Distributor_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Distributor_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Distributor"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Distribution_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the distributor of and options for obtaining the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="distributionFormat" type="gmd:MD_Format_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="distributor" type="gmd:MD_Distributor_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="transferOptions" type="gmd:MD_DigitalTransferOptions_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Distribution" type="gmd:MD_Distribution_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Distribution_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Distribution"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Format_Type">
+		<xs:annotation>
+			<xs:documentation>Description of the form of the data to be distributed</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="version" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="amendmentNumber" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="specification" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="fileDecompressionTechnique" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="formatDistributor" type="gmd:MD_Distributor_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Format" type="gmd:MD_Format_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Format_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Format"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DistributionUnits" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DistributionUnits_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DistributionUnits"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MediumFormatCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MediumFormatCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MediumFormatCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MediumNameCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MediumNameCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MediumNameCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/extent.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/extent.xsd
new file mode 100644
index 0000000..47d2a38
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/extent.xsd
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gsr="http://www.isotc211.org/2005/gsr" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gss" schemaLocation="../gss/gss.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gts" schemaLocation="../gts/gts.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gsr" schemaLocation="../gsr/gsr.xsd"/>
+	<xs:include schemaLocation="../gmd/referenceSystem.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="EX_TemporalExtent_Type">
+		<xs:annotation>
+			<xs:documentation>Time period covered by the content of the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="extent" type="gts:TM_Primitive_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_TemporalExtent" type="gmd:EX_TemporalExtent_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_TemporalExtent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_TemporalExtent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_VerticalExtent_Type">
+		<xs:annotation>
+			<xs:documentation>Vertical domain of dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="minimumValue" type="gco:Real_PropertyType"/>
+					<xs:element name="maximumValue" type="gco:Real_PropertyType"/>
+					<xs:element name="verticalCRS" type="gsr:SC_CRS_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_VerticalExtent" type="gmd:EX_VerticalExtent_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_VerticalExtent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_VerticalExtent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_BoundingPolygon_Type">
+		<xs:annotation>
+			<xs:documentation>Boundary enclosing the dataset expressed as the closed set of (x,y) coordinates of the polygon (last point replicates first point)</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractEX_GeographicExtent_Type">
+				<xs:sequence>
+					<xs:element name="polygon" type="gss:GM_Object_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_BoundingPolygon" type="gmd:EX_BoundingPolygon_Type" substitutionGroup="gmd:AbstractEX_GeographicExtent"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_BoundingPolygon_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_BoundingPolygon"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_Extent_Type">
+		<xs:annotation>
+			<xs:documentation>Information about spatial, vertical, and temporal extent</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="geographicElement" type="gmd:EX_GeographicExtent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="temporalElement" type="gmd:EX_TemporalExtent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="verticalElement" type="gmd:EX_VerticalExtent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_Extent" type="gmd:EX_Extent_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_Extent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_Extent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractEX_GeographicExtent_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Geographic area of the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="extentTypeCode" type="gco:Boolean_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractEX_GeographicExtent" type="gmd:AbstractEX_GeographicExtent_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_GeographicExtent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractEX_GeographicExtent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_GeographicBoundingBox_Type">
+		<xs:annotation>
+			<xs:documentation>Geographic area of the entire dataset referenced to WGS 84</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractEX_GeographicExtent_Type">
+				<xs:sequence>
+					<xs:element name="westBoundLongitude" type="gco:Decimal_PropertyType"/>
+					<xs:element name="eastBoundLongitude" type="gco:Decimal_PropertyType"/>
+					<xs:element name="southBoundLatitude" type="gco:Decimal_PropertyType"/>
+					<xs:element name="northBoundLatitude" type="gco:Decimal_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_GeographicBoundingBox" type="gmd:EX_GeographicBoundingBox_Type" substitutionGroup="gmd:AbstractEX_GeographicExtent"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_GeographicBoundingBox_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_GeographicBoundingBox"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_SpatialTemporalExtent_Type">
+		<xs:annotation>
+			<xs:documentation>Extent with respect to date and time</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:EX_TemporalExtent_Type">
+				<xs:sequence>
+					<xs:element name="spatialExtent" type="gmd:EX_GeographicExtent_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_SpatialTemporalExtent" type="gmd:EX_SpatialTemporalExtent_Type" substitutionGroup="gmd:EX_TemporalExtent"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_SpatialTemporalExtent_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_SpatialTemporalExtent"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EX_GeographicDescription_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractEX_GeographicExtent_Type">
+				<xs:sequence>
+					<xs:element name="geographicIdentifier" type="gmd:MD_Identifier_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EX_GeographicDescription" type="gmd:EX_GeographicDescription_Type" substitutionGroup="gmd:AbstractEX_GeographicExtent"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EX_GeographicDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:EX_GeographicDescription"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/freeText.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/freeText.xsd
new file mode 100644
index 0000000..ec541c9
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/freeText.xsd
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 03-17-2005 17:21:53 ====== Informative package (concepts are not implementable) - pragmatic approach for encoding</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/identification.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="PT_FreeText_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="textGroup" type="gmd:LocalisedCharacterString_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="PT_FreeText" type="gmd:PT_FreeText_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="PT_FreeText_PropertyType">
+		<xs:complexContent>
+			<xs:extension base="gco:CharacterString_PropertyType">
+				<xs:sequence minOccurs="0">
+					<xs:element ref="gmd:PT_FreeText"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="PT_Locale_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="languageCode" type="gmd:LanguageCode_PropertyType"/>
+					<xs:element name="country" type="gmd:Country_PropertyType" minOccurs="0"/>
+					<xs:element name="characterEncoding" type="gmd:MD_CharacterSetCode_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="PT_Locale" type="gmd:PT_Locale_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="PT_Locale_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:PT_Locale"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="LocalisedCharacterString_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="id" type="xs:ID"/>
+				<xs:attribute name="locale" type="xs:anyURI"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="LocalisedCharacterString" type="gmd:LocalisedCharacterString_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LocalisedCharacterString_PropertyType">
+		<xs:complexContent>
+			<xs:extension base="gco:ObjectReference_PropertyType">
+				<xs:sequence minOccurs="0">
+					<xs:element ref="gmd:LocalisedCharacterString"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="PT_LocaleContainer_Type">
+		<xs:sequence>
+			<xs:element name="description" type="gco:CharacterString_PropertyType"/>
+			<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+			<xs:element name="date" type="gmd:CI_Date_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="responsibleParty" type="gmd:CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="localisedString" type="gmd:LocalisedCharacterString_PropertyType" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="PT_LocaleContainer" type="gmd:PT_LocaleContainer_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="PT_LocaleContainer_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:PT_LocaleContainer"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="LanguageCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="LanguageCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:LanguageCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="Country" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Country_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:Country"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--====EOF====-->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/gmd.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/gmd.xsd
new file mode 100644
index 0000000..5a5975a
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/gmd.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="../gmd/metadataApplication.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/identification.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/identification.xsd
new file mode 100644
index 0000000..852babb
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/identification.xsd
@@ -0,0 +1,348 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:05 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/constraints.xsd"/>
+	<xs:include schemaLocation="../gmd/distribution.xsd"/>
+	<xs:include schemaLocation="../gmd/maintenance.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="AbstractMD_Identification_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Basic information about data</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="citation" type="gmd:CI_Citation_PropertyType"/>
+					<xs:element name="abstract" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="purpose" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="credit" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="status" type="gmd:MD_ProgressCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="pointOfContact" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceMaintenance" type="gmd:MD_MaintenanceInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="graphicOverview" type="gmd:MD_BrowseGraphic_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceFormat" type="gmd:MD_Format_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="descriptiveKeywords" type="gmd:MD_Keywords_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceSpecificUsage" type="gmd:MD_Usage_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceConstraints" type="gmd:MD_Constraints_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="aggregationInfo" type="gmd:MD_AggregateInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractMD_Identification" type="gmd:AbstractMD_Identification_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Identification_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractMD_Identification"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_BrowseGraphic_Type">
+		<xs:annotation>
+			<xs:documentation>Graphic that provides an illustration of the dataset (should include a legend for the graphic)</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="fileName" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="fileDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="fileType" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_BrowseGraphic" type="gmd:MD_BrowseGraphic_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_BrowseGraphic_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_BrowseGraphic"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_DataIdentification_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_Identification_Type">
+				<xs:sequence>
+					<xs:element name="spatialRepresentationType" type="gmd:MD_SpatialRepresentationTypeCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="spatialResolution" type="gmd:MD_Resolution_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="language" type="gco:CharacterString_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="characterSet" type="gmd:MD_CharacterSetCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="topicCategory" type="gmd:MD_TopicCategoryCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="environmentDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="extent" type="gmd:EX_Extent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="supplementalInformation" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DataIdentification" type="gmd:MD_DataIdentification_Type" substitutionGroup="gmd:AbstractMD_Identification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DataIdentification_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DataIdentification"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_ServiceIdentification_Type">
+		<xs:annotation>
+			<xs:documentation>See 19119 for further info</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_Identification_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ServiceIdentification" type="gmd:MD_ServiceIdentification_Type" substitutionGroup="gmd:AbstractMD_Identification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ServiceIdentification_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ServiceIdentification"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_RepresentativeFraction_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="denominator" type="gco:Integer_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_RepresentativeFraction" type="gmd:MD_RepresentativeFraction_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_RepresentativeFraction_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_RepresentativeFraction"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Usage_Type">
+		<xs:annotation>
+			<xs:documentation>Brief description of ways in which the dataset is currently used.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="specificUsage" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="usageDateTime" type="gco:DateTime_PropertyType" minOccurs="0"/>
+					<xs:element name="userDeterminedLimitations" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="userContactInfo" type="gmd:CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Usage" type="gmd:MD_Usage_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Usage_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Usage"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Keywords_Type">
+		<xs:annotation>
+			<xs:documentation>Keywords, their type and reference source</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="keyword" type="gco:CharacterString_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="type" type="gmd:MD_KeywordTypeCode_PropertyType" minOccurs="0"/>
+					<xs:element name="thesaurusName" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Keywords" type="gmd:MD_Keywords_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Keywords_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Keywords"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Association_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Association" type="gmd:DS_Association_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Association_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Association"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_AggregateInformation_Type">
+		<xs:annotation>
+			<xs:documentation>Encapsulates the dataset aggregation information</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="aggregateDataSetName" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+					<xs:element name="aggregateDataSetIdentifier" type="gmd:MD_Identifier_PropertyType" minOccurs="0"/>
+					<xs:element name="associationType" type="gmd:DS_AssociationTypeCode_PropertyType"/>
+					<xs:element name="initiativeType" type="gmd:DS_InitiativeTypeCode_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_AggregateInformation" type="gmd:MD_AggregateInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_AggregateInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_AggregateInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Resolution_Type">
+		<xs:choice>
+			<xs:element name="equivalentScale" type="gmd:MD_RepresentativeFraction_PropertyType"/>
+			<xs:element name="distance" type="gco:Distance_PropertyType"/>
+		</xs:choice>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Resolution" type="gmd:MD_Resolution_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Resolution_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Resolution"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="MD_TopicCategoryCode_Type">
+		<xs:annotation>
+			<xs:documentation>High-level geospatial data thematic classification to assist in the grouping and search of available geospatial datasets</xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="farming"/>
+			<xs:enumeration value="biota"/>
+			<xs:enumeration value="boundaries"/>
+			<xs:enumeration value="climatologyMeteorologyAtmosphere"/>
+			<xs:enumeration value="economy"/>
+			<xs:enumeration value="elevation"/>
+			<xs:enumeration value="environment"/>
+			<xs:enumeration value="geoscientificInformation"/>
+			<xs:enumeration value="health"/>
+			<xs:enumeration value="imageryBaseMapsEarthCover"/>
+			<xs:enumeration value="intelligenceMilitary"/>
+			<xs:enumeration value="inlandWaters"/>
+			<xs:enumeration value="location"/>
+			<xs:enumeration value="oceans"/>
+			<xs:enumeration value="planningCadastre"/>
+			<xs:enumeration value="society"/>
+			<xs:enumeration value="structure"/>
+			<xs:enumeration value="transportation"/>
+			<xs:enumeration value="utilitiesCommunication"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_TopicCategoryCode" type="gmd:MD_TopicCategoryCode_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_TopicCategoryCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_TopicCategoryCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_CharacterSetCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_CharacterSetCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_CharacterSetCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_SpatialRepresentationTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_SpatialRepresentationTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_SpatialRepresentationTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ProgressCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ProgressCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ProgressCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_KeywordTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_KeywordTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_KeywordTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DS_AssociationTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_AssociationTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_AssociationTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DS_InitiativeTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_InitiativeTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_InitiativeTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/maintenance.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/maintenance.xsd
new file mode 100644
index 0000000..7d1d9b1
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/maintenance.xsd
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== Status of the dataset or progress of a review</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gts" schemaLocation="../gts/gts.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_MaintenanceInformation_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the scope and frequency of updating</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="maintenanceAndUpdateFrequency" type="gmd:MD_MaintenanceFrequencyCode_PropertyType"/>
+					<xs:element name="dateOfNextUpdate" type="gco:Date_PropertyType" minOccurs="0"/>
+					<xs:element name="userDefinedMaintenanceFrequency" type="gts:TM_PeriodDuration_PropertyType" minOccurs="0"/>
+					<xs:element name="updateScope" type="gmd:MD_ScopeCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="updateScopeDescription" type="gmd:MD_ScopeDescription_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="maintenanceNote" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="contact" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MaintenanceInformation" type="gmd:MD_MaintenanceInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MaintenanceInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MaintenanceInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_ScopeDescription_Type">
+		<xs:annotation>
+			<xs:documentation>Description of the class of information covered by the information</xs:documentation>
+		</xs:annotation>
+		<xs:choice>
+			<xs:element name="attributes" type="gco:ObjectReference_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="features" type="gco:ObjectReference_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="featureInstances" type="gco:ObjectReference_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="attributeInstances" type="gco:ObjectReference_PropertyType" maxOccurs="unbounded"/>
+			<xs:element name="dataset" type="gco:CharacterString_PropertyType"/>
+			<xs:element name="other" type="gco:CharacterString_PropertyType"/>
+		</xs:choice>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ScopeDescription" type="gmd:MD_ScopeDescription_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ScopeDescription_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ScopeDescription"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MaintenanceFrequencyCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MaintenanceFrequencyCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MaintenanceFrequencyCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ScopeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ScopeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ScopeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/metadataApplication.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/metadataApplication.xsd
new file mode 100644
index 0000000..d63ec41
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/metadataApplication.xsd
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:05 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/metadataEntity.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="AbstractDS_Aggregate_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Identifiable collection of datasets</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="composedOf" type="gmd:DS_DataSet_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="seriesMetadata" type="gmd:MD_Metadata_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="subset" type="gmd:DS_Aggregate_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="superset" type="gmd:DS_Aggregate_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractDS_Aggregate" type="gmd:AbstractDS_Aggregate_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Aggregate_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractDS_Aggregate"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_DataSet_Type">
+		<xs:annotation>
+			<xs:documentation>Identifiable collection of data</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="has" type="gmd:MD_Metadata_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="partOf" type="gmd:DS_Aggregate_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_DataSet" type="gmd:DS_DataSet_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_DataSet_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_DataSet"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_OtherAggregate_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDS_Aggregate_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_OtherAggregate" type="gmd:DS_OtherAggregate_Type" substitutionGroup="gmd:AbstractDS_Aggregate"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_OtherAggregate_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_OtherAggregate"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Series_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDS_Aggregate_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Series" type="gmd:DS_Series_Type" substitutionGroup="gmd:AbstractDS_Aggregate"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Series_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Series"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Initiative_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDS_Aggregate_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Initiative" type="gmd:DS_Initiative_Type" substitutionGroup="gmd:AbstractDS_Aggregate"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Initiative_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Initiative"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Platform_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:DS_Series_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Platform" type="gmd:DS_Platform_Type" substitutionGroup="gmd:DS_Series"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Platform_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Platform"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Sensor_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:DS_Series_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Sensor" type="gmd:DS_Sensor_Type" substitutionGroup="gmd:DS_Series"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Sensor_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Sensor"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_ProductionSeries_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:DS_Series_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_ProductionSeries" type="gmd:DS_ProductionSeries_Type" substitutionGroup="gmd:DS_Series"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_ProductionSeries_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_ProductionSeries"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_StereoMate_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:DS_OtherAggregate_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_StereoMate" type="gmd:DS_StereoMate_Type" substitutionGroup="gmd:DS_OtherAggregate"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_StereoMate_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_StereoMate"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/metadataEntity.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/metadataEntity.xsd
new file mode 100644
index 0000000..77c4a27
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/metadataEntity.xsd
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:00 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/spatialRepresentation.xsd"/>
+	<xs:include schemaLocation="../gmd/metadataExtension.xsd"/>
+	<xs:include schemaLocation="../gmd/content.xsd"/>
+	<xs:include schemaLocation="../gmd/metadataApplication.xsd"/>
+	<xs:include schemaLocation="../gmd/applicationSchema.xsd"/>
+	<xs:include schemaLocation="../gmd/portrayalCatalogue.xsd"/>
+	<xs:include schemaLocation="../gmd/dataQuality.xsd"/>
+	<xs:include schemaLocation="../gmd/freeText.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_Metadata_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the metadata</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="fileIdentifier" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="language" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="characterSet" type="gmd:MD_CharacterSetCode_PropertyType" minOccurs="0"/>
+					<xs:element name="parentIdentifier" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="hierarchyLevel" type="gmd:MD_ScopeCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="hierarchyLevelName" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="contact" type="gmd:CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="dateStamp" type="gco:Date_PropertyType"/>
+					<xs:element name="metadataStandardName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="metadataStandardVersion" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="dataSetURI" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="spatialRepresentationInfo" type="gmd:MD_SpatialRepresentation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="referenceSystemInfo" type="gmd:MD_ReferenceSystem_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="metadataExtensionInfo" type="gmd:MD_MetadataExtensionInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="identificationInfo" type="gmd:MD_Identification_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="contentInfo" type="gmd:MD_ContentInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="distributionInfo" type="gmd:MD_Distribution_PropertyType" minOccurs="0"/>
+					<xs:element name="dataQualityInfo" type="gmd:DQ_DataQuality_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="portrayalCatalogueInfo" type="gmd:MD_PortrayalCatalogueReference_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="metadataConstraints" type="gmd:MD_Constraints_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="applicationSchemaInfo" type="gmd:MD_ApplicationSchemaInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="metadataMaintenance" type="gmd:MD_MaintenanceInformation_PropertyType" minOccurs="0"/>
+					<xs:element name="series" type="gmd:DS_Aggregate_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="describes" type="gmd:DS_DataSet_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="propertyType" type="gco:ObjectReference_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="featureType" type="gco:ObjectReference_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="featureAttribute" type="gco:ObjectReference_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Metadata" type="gmd:MD_Metadata_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Metadata_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Metadata"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/metadataExtension.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/metadataExtension.xsd
new file mode 100644
index 0000000..21202ec
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/metadataExtension.xsd
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== Method used to represent geographic information in the dataset</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_ExtendedElementInformation_Type">
+		<xs:annotation>
+			<xs:documentation>New metadata element, not found in ISO 19115, which is required to describe geographic data</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="shortName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="domainCode" type="gco:Integer_PropertyType" minOccurs="0"/>
+					<xs:element name="definition" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="obligation" type="gmd:MD_ObligationCode_PropertyType" minOccurs="0"/>
+					<xs:element name="condition" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="dataType" type="gmd:MD_DatatypeCode_PropertyType"/>
+					<xs:element name="maximumOccurrence" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="domainValue" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="parentEntity" type="gco:CharacterString_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="rule" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="rationale" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="source" type="gmd:CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ExtendedElementInformation" type="gmd:MD_ExtendedElementInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ExtendedElementInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ExtendedElementInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_MetadataExtensionInformation_Type">
+		<xs:annotation>
+			<xs:documentation>Information describing metadata extensions.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="extensionOnLineResource" type="gmd:CI_OnlineResource_PropertyType" minOccurs="0"/>
+					<xs:element name="extendedElementInformation" type="gmd:MD_ExtendedElementInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_MetadataExtensionInformation" type="gmd:MD_MetadataExtensionInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_MetadataExtensionInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_MetadataExtensionInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="MD_ObligationCode_Type">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="mandatory"/>
+			<xs:enumeration value="optional"/>
+			<xs:enumeration value="conditional"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ObligationCode" type="gmd:MD_ObligationCode_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ObligationCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ObligationCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DatatypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DatatypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DatatypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/portrayalCatalogue.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/portrayalCatalogue.xsd
new file mode 100644
index 0000000..0b774c6
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/portrayalCatalogue.xsd
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:03 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_PortrayalCatalogueReference_Type">
+		<xs:annotation>
+			<xs:documentation>Information identifing the portrayal catalogue used</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="portrayalCatalogueCitation" type="gmd:CI_Citation_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_PortrayalCatalogueReference" type="gmd:MD_PortrayalCatalogueReference_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_PortrayalCatalogueReference_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_PortrayalCatalogueReference"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/referenceSystem.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/referenceSystem.xsd
new file mode 100644
index 0000000..bf3864b
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/referenceSystem.xsd
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:04 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/citation.xsd"/>
+	<xs:include schemaLocation="../gmd/extent.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="RS_Identifier_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_Identifier_Type">
+				<xs:sequence>
+					<xs:element name="codeSpace" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="version" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="RS_Identifier" type="gmd:RS_Identifier_Type" substitutionGroup="gmd:MD_Identifier"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="RS_Identifier_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:RS_Identifier"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_ReferenceSystem_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="referenceSystemIdentifier" type="gmd:RS_Identifier_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ReferenceSystem" type="gmd:MD_ReferenceSystem_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ReferenceSystem_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ReferenceSystem"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Identifier_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="authority" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+					<xs:element name="code" type="gco:CharacterString_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Identifier" type="gmd:MD_Identifier_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Identifier_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Identifier"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractRS_ReferenceSystem_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Description of the spatial and temporal reference systems used in the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gmd:RS_Identifier_PropertyType"/>
+					<xs:element name="domainOfValidity" type="gmd:EX_Extent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractRS_ReferenceSystem" type="gmd:AbstractRS_ReferenceSystem_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="RS_ReferenceSystem_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractRS_ReferenceSystem"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/spatialRepresentation.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/spatialRepresentation.xsd
new file mode 100644
index 0000000..e67de38
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmd/spatialRepresentation.xsd
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gmd="http://www.isotc211.org/2005/gmd">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:02 ====== Frequency with which modifications and deletations are made to the data after it is first produced</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gss" schemaLocation="../gss/gss.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/citation.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MD_GridSpatialRepresentation_Type">
+		<xs:annotation>
+			<xs:documentation>Types and numbers of raster spatial objects in the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_SpatialRepresentation_Type">
+				<xs:sequence>
+					<xs:element name="numberOfDimensions" type="gco:Integer_PropertyType"/>
+					<xs:element name="axisDimensionProperties" type="gmd:MD_Dimension_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="cellGeometry" type="gmd:MD_CellGeometryCode_PropertyType"/>
+					<xs:element name="transformationParameterAvailability" type="gco:Boolean_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_GridSpatialRepresentation" type="gmd:MD_GridSpatialRepresentation_Type" substitutionGroup="gmd:AbstractMD_SpatialRepresentation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_GridSpatialRepresentation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_GridSpatialRepresentation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_VectorSpatialRepresentation_Type">
+		<xs:annotation>
+			<xs:documentation>Information about the vector spatial objects in the dataset</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_SpatialRepresentation_Type">
+				<xs:sequence>
+					<xs:element name="topologyLevel" type="gmd:MD_TopologyLevelCode_PropertyType" minOccurs="0"/>
+					<xs:element name="geometricObjects" type="gmd:MD_GeometricObjects_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_VectorSpatialRepresentation" type="gmd:MD_VectorSpatialRepresentation_Type" substitutionGroup="gmd:AbstractMD_SpatialRepresentation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_VectorSpatialRepresentation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_VectorSpatialRepresentation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractMD_SpatialRepresentation_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Digital mechanism used to represent spatial information</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractMD_SpatialRepresentation" type="gmd:AbstractMD_SpatialRepresentation_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_SpatialRepresentation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractMD_SpatialRepresentation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Georeferenceable_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_GridSpatialRepresentation_Type">
+				<xs:sequence>
+					<xs:element name="controlPointAvailability" type="gco:Boolean_PropertyType"/>
+					<xs:element name="orientationParameterAvailability" type="gco:Boolean_PropertyType"/>
+					<xs:element name="orientationParameterDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="georeferencedParameters" type="gco:Record_PropertyType"/>
+					<xs:element name="parameterCitation" type="gmd:CI_Citation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Georeferenceable" type="gmd:MD_Georeferenceable_Type" substitutionGroup="gmd:MD_GridSpatialRepresentation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Georeferenceable_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Georeferenceable"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Dimension_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="dimensionName" type="gmd:MD_DimensionNameTypeCode_PropertyType"/>
+					<xs:element name="dimensionSize" type="gco:Integer_PropertyType"/>
+					<xs:element name="resolution" type="gco:Measure_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Dimension" type="gmd:MD_Dimension_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Dimension_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Dimension"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Georectified_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:MD_GridSpatialRepresentation_Type">
+				<xs:sequence>
+					<xs:element name="checkPointAvailability" type="gco:Boolean_PropertyType"/>
+					<xs:element name="checkPointDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="cornerPoints" type="gss:GM_Point_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="centerPoint" type="gss:GM_Point_PropertyType" minOccurs="0"/>
+					<xs:element name="pointInPixel" type="gmd:MD_PixelOrientationCode_PropertyType"/>
+					<xs:element name="transformationDimensionDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="transformationDimensionMapping" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="2"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Georectified" type="gmd:MD_Georectified_Type" substitutionGroup="gmd:MD_GridSpatialRepresentation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Georectified_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Georectified"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_GeometricObjects_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="geometricObjectType" type="gmd:MD_GeometricObjectTypeCode_PropertyType"/>
+					<xs:element name="geometricObjectCount" type="gco:Integer_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_GeometricObjects" type="gmd:MD_GeometricObjects_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_GeometricObjects_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_GeometricObjects"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="MD_PixelOrientationCode_Type">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="center"/>
+			<xs:enumeration value="lowerLeft"/>
+			<xs:enumeration value="lowerRight"/>
+			<xs:enumeration value="upperRight"/>
+			<xs:enumeration value="upperLeft"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_PixelOrientationCode" type="gmd:MD_PixelOrientationCode_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_PixelOrientationCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_PixelOrientationCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_TopologyLevelCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_TopologyLevelCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_TopologyLevelCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_GeometricObjectTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_GeometricObjectTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_GeometricObjectTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_CellGeometryCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_CellGeometryCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_CellGeometryCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DimensionNameTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DimensionNameTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DimensionNameTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/ReadMe.txt b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/ReadMe.txt
new file mode 100644
index 0000000..b5f596d
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/ReadMe.txt
@@ -0,0 +1,26 @@
+19139 XSchemas TS RC (2006 May 4)
+-----------------------------------------------
+
+OGC GML 3.2.0 version => ISO 19136 XSchemas DIS (2005 november)
+ -- http://www.isotc211.org/2005/
+
+These schemas from ISO 19139 version 2005-DIS (Draft International Standard)
+dated 2006 May 4. For the sake of convenience, GML 3.2 XML schemas (version
+19136 DIS - 2005 november) are (temporarily) provided with the 19139 set of
+schemas. They were retrieved from http://www.isotc211.org/2005/ . Once these
+schemas are finalized they will become OGC GML 3.2.1 and ISO/TS 19136.
+
+Changes made to these ISO 19139 schemas by OGC:
+  * changed xlink references from ../xlink/xlinks.xsd to ../../../../xlink/1.0.0/xlinks.xsd
+    so they use http://schemas.opengis.net/xlink/1.0.0/xlinks.xsd .
+    (see W3C XLink 1.0)
+  * removed xlinks directory and schema
+  * replaced 19139-GML_readme.txt with this document.
+
+In Folder "gml": the GML Schema; the root document of the GML Schema is file
+"gml/gml.xsd"
+
+Imported schemas:
+- Folder "xlink": the W3C XLink schema (see W3C XLink 1.0)
+- iso19139 schemas: the GMD schema and contained schemas (see ISO/TS 19139)
+
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/basicTypes.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/basicTypes.xsd
new file mode 100644
index 0000000..1a5ac07
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/basicTypes.xsd
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:basicTypes:3.2.0">basicTypes.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 8.2.
+W3C XML Schema provides a set of built-in “simple” types which define methods for representing values as literals without internal markup.  These are described in W3C XML Schema Part 2:2001.  Because GML is an XML encoding in which instances are described using XML Schema, these simple types shall be used as far as possible and practical for the representation of data types.  W3C XML Schema also provides methods for defining 
+-	new simple types by restriction and combination of the built-in types, and 
+-	complex types, with simple content, but which also have XML attributes.  
+In many places where a suitable built-in simple type is not available, simple content types derived using the XML Schema mechanisms are used for the representation of data types in GML.  
+A set of these simple content types that are required by several GML components are defined in the basicTypes schema, as well as some elements based on them. These are primarily based around components needed to record amounts, counts, flags and terms, together with support for exceptions or null values.</documentation>
+	</annotation>
+	<simpleType name="NilReasonType">
+		<annotation>
+			<documentation>gml:NilReasonType defines a content model that allows recording of an explanation for a void value or other exception.
+gml:NilReasonType is a union of the following enumerated values:
+-	inapplicable there is no value
+-	missing the correct value is not readily available to the sender of this data. Furthermore, a correct value may not exist
+-	template the value will be available later
+-	unknown the correct value is not known to, and not computable by, the sender of this data. However, a correct value probably exists
+-	withheld the value is not divulged
+-	other:text other brief explanation, where text is a string of two or more characters with no included spaces
+and
+-	anyURI which should refer to a resource which describes the reason for the exception
+A particular community may choose to assign more detailed semantics to the standard values provided. Alternatively, the URI method enables a specific or more complete explanation for the absence of a value to be provided elsewhere and indicated by-reference in an instance document.
+gml:NilReasonType is used as a member of a union in a number of simple content types where it is necessary to permit a value from the NilReasonType union as an alternative to the primary type.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration anyURI"/>
+	</simpleType>
+	<simpleType name="NilReasonEnumeration">
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="inapplicable"/>
+					<enumeration value="missing"/>
+					<enumeration value="template"/>
+					<enumeration value="unknown"/>
+					<enumeration value="withheld"/>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+	<element name="Null" type="gml:NilReasonType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<simpleType name="SignType">
+		<annotation>
+			<documentation>gml:SignType is a convenience type with values “+” (plus) and “-“ (minus).</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="-"/>
+			<enumeration value="+"/>
+		</restriction>
+	</simpleType>
+	<simpleType name="booleanOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration boolean anyURI"/>
+	</simpleType>
+	<simpleType name="doubleOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration double anyURI"/>
+	</simpleType>
+	<simpleType name="integerOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration integer anyURI"/>
+	</simpleType>
+	<simpleType name="NameOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration Name anyURI"/>
+	</simpleType>
+	<simpleType name="stringOrNilReason">
+		<annotation>
+			<documentation>Extension to the respective XML Schema built-in simple type to allow a choice of either a value of the built-in simple type or a reason for a nil value.</documentation>
+		</annotation>
+		<union memberTypes="gml:NilReasonEnumeration string anyURI"/>
+	</simpleType>
+	<complexType name="CodeType">
+		<annotation>
+			<documentation>gml:CodeType is a generalized type to be used for a term, keyword or name.
+It adds a XML attribute codeSpace to a term, where the value of the codeSpace attribute (if present) shall indicate a dictionary, thesaurus, classification scheme, authority, or pattern for the term.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attribute name="codeSpace" type="anyURI"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<complexType name="CodeWithAuthorityType">
+		<annotation>
+			<documentation>gml:CodeWithAuthorityType requires that the codeSpace attribute is provided in an instance.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeType">
+				<attribute name="codeSpace" type="anyURI" use="required"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<complexType name="MeasureType">
+		<annotation>
+			<documentation>gml:MeasureType supports recording an amount encoded as a value of XML Schema double, together with a units of measure indicated by an attribute uom, short for “units Of measure”. The value of the uom attribute identifies a reference system for the amount, usually a ratio or interval scale.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="double">
+				<attribute name="uom" type="gml:UomIdentifier" use="required"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="UomIdentifier">
+		<annotation>
+			<documentation>The simple type gml:UomIdentifer defines the syntax and value space of the unit of measure identifier.</documentation>
+		</annotation>
+		<union memberTypes="gml:UomSymbol gml:UomURI"/>
+	</simpleType>
+	<simpleType name="UomSymbol">
+		<annotation>
+			<documentation>This type specifies a character string of length at least one, and restricted such that it must not contain any of the following characters: “:” (colon), “ “ (space), (newline), (carriage return), (tab). This allows values corresponding to familiar abbreviations, such as “kg”, “m/s”, etc. 
+It is recommended that the symbol be an identifier for a unit of measure as specified in the “Unified Code of Units of Measure" (UCUM) (http://aurora.regenstrief.org/UCUM). This provides a set of symbols and a grammar for constructing identifiers for units of measure that are unique, and may be easily entered with a keyboard supporting the limited character set known as 7-bit ASCII. ISO 2955 formerly provided a specification with this scope, but was withdrawn in 2001. UCUM largely follow [...]
+		</annotation>
+		<restriction base="string">
+			<pattern value="[^: \n\r\t]+"/>
+		</restriction>
+	</simpleType>
+	<simpleType name="UomURI">
+		<annotation>
+			<documentation>This type specifies a URI, restricted such that it must start with one of the following sequences: “#”, “./”, “../”, or a string of characters followed by a “:”. These patterns ensure that the most common URI forms are supported, including absolute and relative URIs and URIs that are simple fragment identifiers, but prohibits certain forms of relative URI that could be mistaken for unit of measure symbol . 
+NOTE	It is possible to re-write such a relative URI to conform to the restriction (e.g. “./m/s”).
+In an instance document, on elements of type gml:MeasureType the mandatory uom attribute shall carry a value corresponding to either 
+-	a conventional unit of measure symbol,
+-	a link to a definition of a unit of measure that does not have a conventional symbol, or when it is desired to indicate a precise or variant definition.</documentation>
+		</annotation>
+		<restriction base="anyURI">
+			<pattern value="([a-zA-Z][a-zA-Z0-9\-\+\.]*:|\.\./|\./|#).*"/>
+		</restriction>
+	</simpleType>
+	<complexType name="CoordinatesType">
+		<annotation>
+			<documentation>This type is deprecated for tuples with ordinate values that are numbers.
+CoordinatesType is a text string, intended to be used to record an array of tuples or coordinates. 
+While it is not possible to enforce the internal structure of the string through schema validation, some optional attributes have been provided in previous versions of GML to support a description of the internal structure. These attributes are deprecated. The attributes were intended to be used as follows:
+Decimal	symbol used for a decimal point (default=”.” a stop or period)
+cs        	symbol used to separate components within a tuple or coordinate string (default=”,” a comma)
+ts        	symbol used to separate tuples or coordinate strings (default=” “ a space)
+Since it is based on the XML Schema string type, CoordinatesType may be used in the construction of tables of tuples or arrays of tuples, including ones that contain mixed text and numeric values.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attribute name="decimal" type="string" default="."/>
+				<attribute name="cs" type="string" default=","/>
+				<attribute name="ts" type="string" default="&#x20;"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="booleanList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="boolean"/>
+	</simpleType>
+	<simpleType name="doubleList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="double"/>
+	</simpleType>
+	<simpleType name="integerList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="integer"/>
+	</simpleType>
+	<simpleType name="NameList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="Name"/>
+	</simpleType>
+	<simpleType name="NCNameList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="NCName"/>
+	</simpleType>
+	<simpleType name="QNameList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="QName"/>
+	</simpleType>
+	<simpleType name="booleanOrNilReasonList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="gml:booleanOrNilReason"/>
+	</simpleType>
+	<simpleType name="NameOrNilReasonList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="gml:NameOrNilReason"/>
+	</simpleType>
+	<simpleType name="doubleOrNilReasonList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="gml:doubleOrNilReason"/>
+	</simpleType>
+	<simpleType name="integerOrNilReasonList">
+		<annotation>
+			<documentation>A type for a list of values of the respective simple type.</documentation>
+		</annotation>
+		<list itemType="gml:integerOrNilReason"/>
+	</simpleType>
+	<complexType name="CodeListType">
+		<annotation>
+			<documentation>gml:CodeListType provides for lists of terms. The values in an instance element shall all be valid according to the rules of the dictionary, classification scheme, or authority identified by the value of its codeSpace attribute.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:NameList">
+				<attribute name="codeSpace" type="anyURI"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<complexType name="CodeOrNilReasonListType">
+		<annotation>
+			<documentation>gml:CodeOrNilReasonListType provides for lists of terms. The values in an instance element shall all be valid according to the rules of the dictionary, classification scheme, or authority identified by the value of its codeSpace attribute. An instance element may also include embedded values from NilReasonType. It is intended to be used in situations where a term or classification is expected, but the value may be absent for some reason.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:NameOrNilReasonList">
+				<attribute name="codeSpace" type="anyURI"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<complexType name="MeasureListType">
+		<annotation>
+			<documentation>gml:MeasureListType provides for a list of quantities.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attribute name="uom" type="gml:UomIdentifier" use="required"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<complexType name="MeasureOrNilReasonListType">
+		<annotation>
+			<documentation>gml:MeasureOrNilReasonListType provides for a list of quantities. An instance element may also include embedded values from NilReasonType. It is intended to be used in situations where a value is expected, but the value may be absent for some reason.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleOrNilReasonList">
+				<attribute name="uom" type="gml:UomIdentifier" use="required"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coordinateOperations.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coordinateOperations.xsd
new file mode 100644
index 0000000..42a0770
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coordinateOperations.xsd
@@ -0,0 +1,639 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0" xml:lang="en" xmlns:gml="http://www.opengis.net/gml" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns="http://www.w3.org/2001/XMLSchema">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:coordinateOperations:3.2.0">coordinateOperations.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.6.
+The spatial or temporal coordinate operations schema components can be divided into five logical parts, which define elements and types for XML encoding of the definitions of:
+-	Multiple abstract coordinate operations
+-	Multiple concrete types of coordinate operations, including Transformations and Conversions
+-	Abstract and concrete parameter values and groups
+-	Operation methods
+-	Abstract and concrete operation parameters and groups
+These schema component encodes the Coordinate Operation package of the UML Model for ISO 19111 Clause 11.</documentation>
+	</annotation>
+	<include schemaLocation="referenceSystems.xsd"/>
+	<include schemaLocation="measures.xsd"/>
+	<import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/gmd.xsd"/>
+	<element name="AbstractCoordinateOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:AbstractCoordinateOperation is a mathematical operation on coordinates that transforms or converts coordinates to another coordinate reference system. Many but not all coordinate operations (from CRS A to CRS B) also uniquely define the inverse operation (from CRS B to CRS A). In some cases, the operation method algorithm for the inverse operation is the same as for the forward algorithm, but the signs of some operation parameter values shall be reversed. In other c [...]
+The optional coordinateOperationAccuracy property elements provide estimates of the impact of this coordinate operation on point position accuracy.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractCoordinateOperationType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+					<element ref="gml:operationVersion" minOccurs="0"/>
+					<element ref="gml:coordinateOperationAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:sourceCRS" minOccurs="0"/>
+					<element ref="gml:targetCRS" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="operationVersion" type="string">
+		<annotation>
+			<documentation>gml:operationVersion is the version of the coordinate transformation (i.e., instantiation due to the stochastic nature of the parameters). Mandatory when describing a transformation, and should not be supplied for a conversion.</documentation>
+		</annotation>
+	</element>
+	<element name="coordinateOperationAccuracy">
+		<annotation>
+			<documentation>gml:coordinateOperationAccuracy is an association role to a DQ_PositionalAccuracy object as encoded in ISO/TS 19139, either referencing or containing the definition of that positional accuracy. That object contains an estimate of the impact of this coordinate operation on point accuracy. That is, it gives position error estimates for the target coordinates of this coordinate operation, assuming no errors in the source coordinates.</documentation>
+		</annotation>
+		<complexType>
+			<sequence minOccurs="0">
+				<element ref="gmd:AbstractDQ_PositionalAccuracy"/>
+			</sequence>
+			<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</complexType>
+	</element>
+	<element name="sourceCRS" type="gml:CRSPropertyType">
+		<annotation>
+			<documentation>gml:sourceCRS is an association role to the source CRS (coordinate reference system) of this coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<element name="targetCRS" type="gml:CRSPropertyType">
+		<annotation>
+			<documentation>gml:targetCRS is an association role to the target CRS (coordinate reference system) of this coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CoordinateOperationPropertyType">
+		<annotation>
+			<documentation>gml:CoordinateOperationPropertyType is a property type for association roles to a coordinate operation, either referencing or containing the definition of that coordinate operation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractCoordinateOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="coordinateOperationRef" type="gml:CoordinateOperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AbstractSingleOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:AbstractCoordinateOperation">
+		<annotation>
+			<documentation>gml:AbstractSingleOperation is a single (not concatenated) coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SingleOperationPropertyType">
+		<annotation>
+			<documentation>gml:SingleOperationPropertyType is a property type for association roles to a single operation, either referencing or containing the definition of that single operation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractSingleOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="singleOperationRef" type="gml:SingleOperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AbstractOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:AbstractSingleOperation">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="OperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="operationRef" type="gml:OperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AbstractGeneralConversion" type="gml:AbstractGeneralConversionType" abstract="true" substitutionGroup="gml:AbstractOperation">
+		<annotation>
+			<documentation>gm:AbstractGeneralConversion is an abstract operation on coordinates that does not include any change of datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters. The operationVersion, sourceCRS, and targetCRS elements are omitted in a coordinate conversion.
+This abstract complex type is expected to be extended for well-known operation methods with many Conversion instances, in GML Application Schemas that define operation-method-specialized element names and contents. This conversion uses an operation method, usually with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to  [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralConversionType" abstract="true">
+		<complexContent>
+			<restriction base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:descriptionReference" minOccurs="0"/>
+					<element ref="gml:identifier"/>
+					<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+					<element ref="gml:coordinateOperationAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="GeneralConversionPropertyType">
+		<annotation>
+			<documentation>gml:GeneralConversionPropertyType is a property type for association roles to a general conversion, either referencing or containing the definition of that conversion.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeneralConversion"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="generalConversionRef" type="gml:GeneralConversionPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AbstractGeneralTransformation" type="gml:AbstractGeneralTransformationType" abstract="true" substitutionGroup="gml:AbstractOperation">
+		<annotation>
+			<documentation>gml:AbstractGeneralTransformation is an abstract operation on coordinates that usually includes a change of Datum. The parameters of a coordinate transformation are empirically derived from data containing the coordinates of a series of points in both coordinate reference systems. This computational process is usually "over-determined", allowing derivation of error (or accuracy) estimates for the transformation. Also, the stochastic nature of the parameters may result i [...]
+This abstract complex type is expected to be extended for well-known operation methods with many Transformation instances, in Application Schemas that define operation-method-specialized value element names and contents. This transformation uses an operation method with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralTransformationType" abstract="true">
+		<complexContent>
+			<restriction base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:descriptionReference" minOccurs="0"/>
+					<element ref="gml:identifier"/>
+					<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+					<element ref="gml:operationVersion"/>
+					<element ref="gml:coordinateOperationAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:sourceCRS"/>
+					<element ref="gml:targetCRS"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="GeneralTransformationPropertyType">
+		<annotation>
+			<documentation>gml:GeneralTransformationPropertyType is a property type for association roles to a general transformation, either referencing or containing the definition of that transformation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeneralTransformation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="generalTransformationRef" type="gml:GeneralTransformationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="ConcatenatedOperation" type="gml:ConcatenatedOperationType" substitutionGroup="gml:AbstractCoordinateOperation"/>
+	<complexType name="ConcatenatedOperationType">
+		<annotation>
+			<documentation>gml:ConcatenatedOperation is an ordered sequence of two or more coordinate operations. This sequence of operations is constrained by the requirement that the source coordinate reference system of step (n+1) must be the same as the target coordinate reference system of step (n). The source coordinate reference system of the first step and the target coordinate reference system of the last step are the source and target coordinate reference system associated with the conc [...]
+The gml:coordOperation property elements are an ordered sequence of associations to the two or more operations used by this concatenated operation. The AggregationAttributeGroup should be used to specify that the coordOperation associations are ordered.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:coordOperation" minOccurs="2" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="coordOperation" type="gml:CoordinateOperationPropertyType">
+		<annotation>
+			<documentation>gml:coordOperation is an association role to a coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<element name="usesSingleOperation" type="gml:CoordinateOperationPropertyType" substitutionGroup="gml:coordOperation">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ConcatenatedOperationPropertyType">
+		<annotation>
+			<documentation>gml:ConcatenatedOperationPropertyType is a property type for association roles to a concatenated operation, either referencing or containing the definition of that concatenated operation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ConcatenatedOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="concatenatedOperationRef" type="gml:ConcatenatedOperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="PassThroughOperation" type="gml:PassThroughOperationType" substitutionGroup="gml:AbstractSingleOperation">
+		<annotation>
+			<documentation>gml:PassThroughOperation is a pass-through operation specifies that a subset of a coordinate tuple is subject to a specific coordinate operation.
+The modifiedCoordinate property elements are an ordered sequence of positive integers defining the positions in a coordinate tuple of the coordinates affected by this pass-through operation. The AggregationAttributeGroup should be used to specify that the modifiedCoordinate elements are ordered.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PassThroughOperationType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:modifiedCoordinate" maxOccurs="unbounded"/>
+					<element ref="gml:coordOperation"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="modifiedCoordinate" type="positiveInteger">
+		<annotation>
+			<documentation>gml:modifiedCoordinate is a positive integer defining a position in a coordinate tuple.</documentation>
+		</annotation>
+	</element>
+	<element name="usesOperation" type="gml:CoordinateOperationPropertyType" substitutionGroup="gml:coordOperation">
+		<annotation>
+			<documentation>gml:usesOperation is deprecated, gml:coordOperation shall be used instead.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PassThroughOperationPropertyType">
+		<annotation>
+			<documentation>gml:PassThroughOperationPropertyType is a property type for association roles to a pass through operation, either referencing or containing the definition of that pass through operation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PassThroughOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="passThroughOperationRef" type="gml:PassThroughOperationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="Conversion" type="gml:ConversionType" substitutionGroup="gml:AbstractGeneralConversion">
+		<annotation>
+			<documentation>gml:Conversion is a concrete operation on coordinates that does not include any change of Datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters.
+This concrete complex type can be used without using a GML Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Conversion instance.
+The usesValue property elements are an unordered list of composition associations to the set of parameter values used by this conversion operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ConversionType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralConversionType">
+				<sequence>
+					<element ref="gml:method"/>
+					<element ref="gml:parameterValue" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="method" type="gml:OperationMethodPropertyType">
+		<annotation>
+			<documentation>gml:method is an association role to the operation method used by a coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<element name="usesMethod" type="gml:OperationMethodPropertyType" substitutionGroup="gml:method">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="parameterValue" type="gml:AbstractGeneralParameterValuePropertyType">
+		<annotation>
+			<documentation>gml:parameterValue is a composition association to a parameter value or group of parameter values used by a coordinate operation.</documentation>
+		</annotation>
+	</element>
+	<element name="usesValue" type="gml:AbstractGeneralParameterValuePropertyType" substitutionGroup="gml:parameterValue">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ConversionPropertyType">
+		<annotation>
+			<documentation>gml:ConversionPropertyType is a property type for association roles to a concrete general-purpose conversion, either referencing or containing the definition of that conversion.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Conversion"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="conversionRef" type="gml:ConversionPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="Transformation" type="gml:TransformationType" substitutionGroup="gml:AbstractGeneralTransformation">
+		<annotation>
+			<documentation>gml:Transformation is a concrete object element derived from gml:GeneralTransformation (13.6.2.13).
+This concrete object can be used for all operation methods, without using a GML Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Transformation instance.
+The parameterValue elements are an unordered list of composition associations to the set of parameter values used by this conversion operation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TransformationType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralTransformationType">
+				<sequence>
+					<element ref="gml:method"/>
+					<element ref="gml:parameterValue" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TransformationPropertyType">
+		<annotation>
+			<documentation>gml:TransformationPropertyType is a property type for association roles to a transformation, either referencing or containing the definition of that transformation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Transformation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="transformationRef" type="gml:TransformationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AbstractGeneralParameterValue" type="gml:AbstractGeneralParameterValueType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:AbstractGeneralParameterValue is an abstract parameter value or group of parameter values.
+This abstract complexType is expected to be extended and restricted for well-known operation methods with many instances, in Application Schemas that define operation-method-specialized element names and contents. Specific parameter value elements are directly contained in concrete subtypes, not in this abstract type. All concrete types derived from this type shall extend this type to include one "...Value" element with an appropriate type, which should be one of the element types allowe [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralParameterValueType" abstract="true">
+		<sequence/>
+	</complexType>
+	<complexType name="AbstractGeneralParameterValuePropertyType">
+		<annotation>
+			<documentation>gml:AbstractGeneralParameterValuePropertyType is a  property type for inline association roles to a parameter value or group of parameter values, always containing the values.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:AbstractGeneralParameterValue"/>
+		</sequence>
+	</complexType>
+	<element name="ParameterValue" type="gml:ParameterValueType" substitutionGroup="gml:AbstractGeneralParameterValue">
+		<annotation>
+			<documentation>gml:ParameterValue is a parameter value, an ordered sequence of values, or a reference to a file of parameter values. This concrete complex type may be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one instance. This complex type may be used, extended, or restricted for well-known operation methods, especially for methods with many instances.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ParameterValueType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralParameterValueType">
+				<sequence>
+					<choice>
+						<element ref="gml:value"/>
+						<element ref="gml:dmsAngleValue"/>
+						<element ref="gml:stringValue"/>
+						<element ref="gml:integerValue"/>
+						<element ref="gml:booleanValue"/>
+						<element ref="gml:valueList"/>
+						<element ref="gml:integerValueList"/>
+						<element ref="gml:valueFile"/>
+					</choice>
+					<element ref="gml:operationParameter"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="value" type="gml:MeasureType">
+		<annotation>
+			<documentation>gml:value is a numeric value of an operation parameter, with its associated unit of measure.</documentation>
+		</annotation>
+	</element>
+	<element name="dmsAngleValue" type="gml:DMSAngleType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="stringValue" type="string">
+		<annotation>
+			<documentation>gml:stringValue is a character string value of an operation parameter. A string value does not have an associated unit of measure.</documentation>
+		</annotation>
+	</element>
+	<element name="integerValue" type="positiveInteger">
+		<annotation>
+			<documentation>gml:integerValue is a positive integer value of an operation parameter, usually used for a count. An integer value does not have an associated unit of measure.</documentation>
+		</annotation>
+	</element>
+	<element name="booleanValue" type="boolean">
+		<annotation>
+			<documentation>gml:booleanValue is a boolean value of an operation parameter. A Boolean value does not have an associated unit of measure.</documentation>
+		</annotation>
+	</element>
+	<element name="valueList" type="gml:MeasureListType">
+		<annotation>
+			<documentation>gml:valueList is an ordered sequence of two or more numeric values of an operation parameter list, where each value has the same associated unit of measure. An element of this type contains a space-separated sequence of double values.</documentation>
+		</annotation>
+	</element>
+	<element name="integerValueList" type="gml:integerList">
+		<annotation>
+			<documentation>gml:integerValueList is an ordered sequence of two or more integer values of an operation parameter list, usually used for counts. These integer values do not have an associated unit of measure. An element of this type contains a space-separated sequence of integer values.</documentation>
+		</annotation>
+	</element>
+	<element name="valueFile" type="anyURI">
+		<annotation>
+			<documentation>gml:valueFile is a reference to a file or a part of a file containing one or more parameter values, each numeric value with its associated unit of measure. When referencing a part of a file, that file shall contain multiple identified parts, such as an XML encoded document. Furthermore, the referenced file or part of a file may reference another part of the same or different files, as allowed in XML documents.</documentation>
+		</annotation>
+	</element>
+	<element name="operationParameter" type="gml:OperationParameterPropertyType">
+		<annotation>
+			<documentation>gml:operationParameter is an association role to the operation parameter of which this is a value.</documentation>
+		</annotation>
+	</element>
+	<element name="valueOfParameter" type="gml:OperationParameterPropertyType" substitutionGroup="gml:operationParameter">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="ParameterValueGroup" type="gml:ParameterValueGroupType" substitutionGroup="gml:AbstractGeneralParameterValue">
+		<annotation>
+			<documentation>gml:ParameterValueGroup is a group of related parameter values. The same group can be repeated more than once in a Conversion, Transformation, or higher level ParameterValueGroup, if those instances contain different values of one or more parameterValues which suitably distinquish among those groups. This concrete complex type can be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents. This  [...]
+The parameterValue elements are an unordered set of composition association roles to the parameter values and groups of values included in this group.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ParameterValueGroupType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralParameterValueType">
+				<sequence>
+					<element ref="gml:parameterValue" minOccurs="2" maxOccurs="unbounded"/>
+					<element ref="gml:group"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="includesValue" type="gml:AbstractGeneralParameterValuePropertyType" substitutionGroup="gml:parameterValue">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="group" type="gml:OperationParameterGroupPropertyType">
+		<annotation>
+			<documentation>gml:group is an association role to the operation parameter group for which this element provides parameter values.</documentation>
+		</annotation>
+	</element>
+	<element name="valuesOfGroup" type="gml:OperationParameterGroupPropertyType" substitutionGroup="gml:group">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="OperationMethod" type="gml:OperationMethodType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:OperationMethod is a method (algorithm or procedure) used to perform a coordinate operation. Most operation methods use a number of operation parameters, although some coordinate conversions use none. Each coordinate operation using the method assigns values to these parameters.
+The generalOperationParameter elements are an unordered list of associations to the set of operation parameters and parameter groups used by this operation method.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OperationMethodType">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:formula"/>
+					<element ref="gml:sourceDimensions" minOccurs="0"/>
+					<element ref="gml:targetDimensions" minOccurs="0"/>
+					<element ref="gml:generalOperationParameter" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="formula" type="gml:CodeType">
+		<annotation>
+			<documentation>gml:formula specifies a formula or procedure used by this operation method. The value may be a reference to a publication. Note that the operation method may not be analytic, in which case this element references or contains the procedure, not an analytic formula.</documentation>
+		</annotation>
+	</element>
+	<element name="methodFormula" type="gml:CodeType" substitutionGroup="gml:formula">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="sourceDimensions" type="positiveInteger">
+		<annotation>
+			<documentation>gml:sourceDimensions is the number of dimensions in the source CRS of this operation method.</documentation>
+		</annotation>
+	</element>
+	<element name="targetDimensions" type="positiveInteger">
+		<annotation>
+			<documentation>gml:targetDimensions is the number of dimensions in the target CRS of this operation method.</documentation>
+		</annotation>
+	</element>
+	<element name="generalOperationParameter" type="gml:AbstractGeneralOperationParameterPropertyType">
+		<annotation>
+			<documentation>gml:generalOperationParameter is an association to an operation parameter or parameter group.</documentation>
+		</annotation>
+	</element>
+	<element name="usesParameter" type="gml:AbstractGeneralOperationParameterPropertyType" substitutionGroup="gml:generalOperationParameter">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="OperationMethodPropertyType">
+		<annotation>
+			<documentation>gml:OperationMethodPropertyType is a property type for association roles to a concrete general-purpose operation method, either referencing or containing the definition of that method.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationMethod"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="operationMethodRef" type="gml:OperationMethodPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AbstractGeneralOperationParameter" type="gml:AbstractGeneralOperationParameterType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:GeneralOperationParameter is the abstract definition of a parameter or group of parameters used by an operation method.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralOperationParameterType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:minimumOccurs" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="minimumOccurs" type="nonNegativeInteger">
+		<annotation>
+			<documentation>gml:minimumOccurs is the minimum number of times that values for this parameter group or parameter are required. If this attribute is omitted, the minimum number shall be one.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralOperationParameterPropertyType">
+		<annotation>
+			<documentation>gml:AbstractGeneralOperationParameterPropertyType is a property type for association roles to an operation parameter or group, either referencing or containing the definition of that parameter or group.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeneralOperationParameter"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="abstractGeneralOperationParameterRef" type="gml:AbstractGeneralOperationParameterPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="OperationParameter" type="gml:OperationParameterType" substitutionGroup="gml:AbstractGeneralOperationParameter">
+		<annotation>
+			<documentation>gml:OperationParameter is the definition of a parameter used by an operation method. Most parameter values are numeric, but other types of parameter values are possible. This complex type is expected to be used or extended for all operation methods, without defining operation-method-specialized element names.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OperationParameterType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralOperationParameterType">
+				<sequence/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="OperationParameterPropertyType">
+		<annotation>
+			<documentation>gml:OperationParameterPropertyType is a property type for association roles to an operation parameter, either referencing or containing the definition of that parameter.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationParameter"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="operationParameterRef" type="gml:OperationParameterPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="OperationParameterGroup" type="gml:OperationParameterGroupType" substitutionGroup="gml:AbstractGeneralOperationParameter">
+		<annotation>
+			<documentation>gml:OperationParameterGroup is the definition of a group of parameters used by an operation method. This complex type is expected to be used or extended for all applicable operation methods, without defining operation-method-specialized element names.
+The generalOperationParameter elements are an unordered list of associations to the set of operation parameters that are members of this group.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OperationParameterGroupType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralOperationParameterType">
+				<sequence>
+					<element ref="gml:maximumOccurs" minOccurs="0"/>
+					<element ref="gml:generalOperationParameter" minOccurs="2" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="maximumOccurs" type="positiveInteger">
+		<annotation>
+			<documentation>gml:maximumOccurs is the maximum number of times that values for this parameter group may be included. If this attribute is omitted, the maximum number shall be one.</documentation>
+		</annotation>
+	</element>
+	<element name="includesParameter" type="gml:AbstractGeneralOperationParameterPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="OperationParameterGroupPropertyType">
+		<annotation>
+			<documentation>gml:OperationParameterPropertyType is a property type for association roles to an operation parameter group, either referencing or containing the definition of that parameter group.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationParameterGroup"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="operationParameterGroupRef" type="gml:OperationParameterPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coordinateReferenceSystems.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coordinateReferenceSystems.xsd
new file mode 100644
index 0000000..bd8e82f
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coordinateReferenceSystems.xsd
@@ -0,0 +1,526 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:coordinateReferenceSystems:3.2.0">coordinateReferenceSystems.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.3.
+The spatial-temporal coordinate reference systems schema components are divided into two logical parts. One part defines elements and types for XML encoding of abstract coordinate reference systems definitions. The larger part defines specialized constructs for XML encoding of definitions of the multiple concrete types of spatial-temporal coordinate reference systems.
+These schema components encode the Coordinate Reference System packages of the UML Models of ISO 19111 Clause 8 and ISO/DIS 19136 D.3.10, with the exception of the abstract "SC_CRS" class.</documentation>
+	</annotation>
+	<include schemaLocation="coordinateSystems.xsd"/>
+	<include schemaLocation="datums.xsd"/>
+	<include schemaLocation="coordinateOperations.xsd"/>
+	<element name="AbstractSingleCRS" type="gml:AbstractCRSType" abstract="true" substitutionGroup="gml:AbstractCRS">
+		<annotation>
+			<documentation>gml:AbstractSingleCRS implements a coordinate reference system consisting of one coordinate system and one datum (as opposed to a Compound CRS).</documentation>
+		</annotation>
+	</element>
+	<complexType name="SingleCRSPropertyType">
+		<annotation>
+			<documentation>gml:SingleCRSPropertyType is a property type for association roles to a single coordinate reference system, either referencing or containing the definition of that coordinate reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractSingleCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="singleCRSRef" type="gml:SingleCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AbstractGeneralDerivedCRS" type="gml:AbstractGeneralDerivedCRSType" abstract="true" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:AbstractGeneralDerivedCRS is a coordinate reference system that is defined by its coordinate conversion from another coordinate reference system. This abstract complex type shall not be used, extended, or restricted, in a GML Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGeneralDerivedCRSType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<element ref="gml:conversion"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="conversion" type="gml:GeneralConversionPropertyType">
+		<annotation>
+			<documentation>gml:conversion is an association role to the coordinate conversion used to define the derived CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="definedByConversion" type="gml:GeneralConversionPropertyType" substitutionGroup="gml:conversion">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="CompoundCRS" type="gml:CompoundCRSType" substitutionGroup="gml:AbstractCRS">
+		<annotation>
+			<documentation>gml:CompundCRS is a coordinate reference system describing the position of points through two or more independent coordinate reference systems. It is associated with a non-repeating sequence of two or more instances of SingleCRS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CompoundCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<element ref="gml:componentReferenceSystem" minOccurs="2" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="componentReferenceSystem" type="gml:SingleCRSPropertyType">
+		<annotation>
+			<documentation>The gml:componentReferenceSystem elements are an ordered sequence of associations to all the component coordinate reference systems included in this compound coordinate reference system. The gml:AggregationAttributeGroup should be used to specify that the gml:componentReferenceSystem properties are ordered.</documentation>
+		</annotation>
+	</element>
+	<element name="includesSingleCRS" type="gml:SingleCRSPropertyType" substitutionGroup="gml:componentReferenceSystem">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="CompoundCRSPropertyType">
+		<annotation>
+			<documentation>gml:CompoundCRSPropertyType is a property type for association roles to a compound coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CompoundCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="compoundCRSRef" type="gml:CompoundCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="GeodeticCRS" type="gml:GeodeticCRSType" substitutionGroup="gml:AbstractSingleCRS"/>
+	<complexType name="GeodeticCRSType">
+		<annotation>
+			<documentation>gml:GeodeticCRS is a coordinate reference system based on a geodetic datum.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:ellipsoidalCS"/>
+						<element ref="gml:cartesianCS"/>
+						<element ref="gml:sphericalCS"/>
+					</choice>
+					<element ref="gml:geodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ellipsoidalCS" type="gml:EllipsoidalCSPropertyType">
+		<annotation>
+			<documentation>gml:ellipsoidalCS is an association role to the ellipsoidal coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesEllipsoidalCS" type="gml:EllipsoidalCSPropertyType" substitutionGroup="gml:ellipsoidalCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="cartesianCS" type="gml:CartesianCSPropertyType">
+		<annotation>
+			<documentation>gml:cartesianCS is an association role to the Cartesian coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesCartesianCS" type="gml:CartesianCSPropertyType" substitutionGroup="gml:cartesianCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="sphericalCS" type="gml:SphericalCSPropertyType">
+		<annotation>
+			<documentation>gml:sphericalCS is an association role to the spherical coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesSphericalCS" type="gml:SphericalCSPropertyType" substitutionGroup="gml:sphericalCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="geodeticDatum" type="gml:GeodeticDatumPropertyType">
+		<annotation>
+			<documentation>gml:geodeticDatum is an association role to the geodetic datum used by this CRS.
+</documentation>
+		</annotation>
+	</element>
+	<element name="usesGeodeticDatum" type="gml:GeodeticDatumPropertyType" substitutionGroup="gml:geodeticDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="GeodeticCRSPropertyType">
+		<annotation>
+			<documentation>gml:GeodeticCRSPropertyType is a property type for association roles to a geodetic coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeodeticCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="VerticalCRS" type="gml:VerticalCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:VerticalCRS is a 1D coordinate reference system used for recording heights or depths. Vertical CRSs make use of the direction of gravity to define the concept of height or depth, but the relationship with gravity may not be straightforward. By implication, ellipsoidal heights (h) cannot be captured in a vertical coordinate reference system. Ellipsoidal heights cannot exist independently, but only as an inseparable part of a 3D coordinate tuple defined in a geographi [...]
+		</annotation>
+	</element>
+	<complexType name="VerticalCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<element ref="gml:verticalCS"/>
+					<element ref="gml:verticalDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="verticalCS" type="gml:VerticalCSPropertyType">
+		<annotation>
+			<documentation>gml:verticalCS is an association role to the vertical coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesVerticalCS" type="gml:VerticalCSPropertyType" substitutionGroup="gml:verticalCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="verticalDatum" type="gml:VerticalDatumPropertyType">
+		<annotation>
+			<documentation>gml:verticalDatum is an association role to the vertical datum used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesVerticalDatum" type="gml:VerticalDatumPropertyType" substitutionGroup="gml:verticalDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="VerticalCRSPropertyType">
+		<annotation>
+			<documentation>gml:VerticalCRSPropertyType is a property type for association roles to a vertical coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="verticalCRSRef" type="gml:VerticalCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="ProjectedCRS" type="gml:ProjectedCRSType" substitutionGroup="gml:AbstractGeneralDerivedCRS">
+		<annotation>
+			<documentation>gml:ProjectedCRS is a 2D coordinate reference system used to approximate the shape of the earth on a planar surface, but in such a way that the distortion that is inherent to the approximation is carefully controlled and known. Distortion correction is commonly applied to calculated bearings and distances to produce values that are a close match to actual field values.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ProjectedCRSType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralDerivedCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:baseGeodeticCRS"/>
+						<element ref="gml:baseGeographicCRS"/>
+					</choice>
+					<element ref="gml:cartesianCS"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="baseGeodeticCRS" type="gml:GeodeticCRSPropertyType">
+		<annotation>
+			<documentation>gml:baseGeodeticCRS is an association role to the geodetic coordinate reference system used by this projected CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="baseGeographicCRS" type="gml:GeographicCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ProjectedCRSPropertyType">
+		<annotation>
+			<documentation>gml:ProjectedCRSPropertyType is a property type for association roles to a projected coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ProjectedCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="projectedCRSRef" type="gml:ProjectedCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="DerivedCRS" type="gml:DerivedCRSType" substitutionGroup="gml:AbstractGeneralDerivedCRS">
+		<annotation>
+			<documentation>gml:DerivedCRS is a single coordinate reference system that is defined by its coordinate conversion from another single coordinate reference system known as the base CRS. The base CRS can be a projected coordinate reference system, if this DerivedCRS is used for a georectified grid coverage as described in ISO 19123, Clause 8.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DerivedCRSType">
+		<complexContent>
+			<extension base="gml:AbstractGeneralDerivedCRSType">
+				<sequence>
+					<element ref="gml:baseCRS"/>
+					<element ref="gml:derivedCRSType"/>
+					<element ref="gml:coordinateSystem"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="baseCRS" type="gml:SingleCRSPropertyType">
+		<annotation>
+			<documentation>gml:baseCRS is an association role to the coordinate reference system used by this derived CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="derivedCRSType" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>The gml:derivedCRSType property describes the type of a derived coordinate reference system. The required codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property.</documentation>
+		</annotation>
+	</element>
+	<element name="coordinateSystem" type="gml:CoordinateSystemPropertyType">
+		<annotation>
+			<documentation>An association role to the coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesCS" type="gml:CoordinateSystemPropertyType" substitutionGroup="gml:coordinateSystem">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DerivedCRSPropertyType">
+		<annotation>
+			<documentation>gml:DerivedCRSPropertyType is a property type for association roles to a non-projected derived coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:DerivedCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="derivedCRSRef" type="gml:DerivedCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="EngineeringCRS" type="gml:EngineeringCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:EngineeringCRS is a contextually local coordinate reference system which can be divided into two broad categories:
+-	earth-fixed systems applied to engineering activities on or near the surface of the earth;
+-	CRSs on moving platforms such as road vehicles, vessels, aircraft, or spacecraft, see ISO 19111 8.3.</documentation>
+		</annotation>
+	</element>
+	<complexType name="EngineeringCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<element ref="gml:coordinateSystem"/>
+					<element ref="gml:engineeringDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="engineeringDatum" type="gml:EngineeringDatumPropertyType">
+		<annotation>
+			<documentation>gml:engineeringDatum is an association role to the engineering datum used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesEngineeringDatum" type="gml:EngineeringDatumPropertyType" substitutionGroup="gml:engineeringDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="EngineeringCRSPropertyType">
+		<annotation>
+			<documentation>gml:EngineeringCRSPropertyType is a property type for association roles to an engineering coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EngineeringCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="engineeringCRSRef" type="gml:EngineeringCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="ImageCRS" type="gml:ImageCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:ImageCRS is an engineering coordinate reference system applied to locations in images. Image coordinate reference systems are treated as a separate sub-type because the definition of the associated image datum contains two attributes not relevant to other engineering datums.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ImageCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:cartesianCS"/>
+						<element ref="gml:affineCS"/>
+						<element ref="gml:usesObliqueCartesianCS"/>
+					</choice>
+					<element ref="gml:imageDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="affineCS" type="gml:AffineCSPropertyType">
+		<annotation>
+			<documentation>gml:affineCS is an association role to the affine coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesAffineCS" type="gml:AffineCSPropertyType" substitutionGroup="gml:affineCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="imageDatum" type="gml:ImageDatumPropertyType">
+		<annotation>
+			<documentation>gml:imageDatum is an association role to the image datum used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesImageDatum" type="gml:ImageDatumPropertyType" substitutionGroup="gml:imageDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesObliqueCartesianCS" type="gml:ObliqueCartesianCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ImageCRSPropertyType">
+		<annotation>
+			<documentation>gml:ImageCRSPropertyType is a property type for association roles to an image coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ImageCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="imageCRSRef" type="gml:ImageCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="TemporalCRS" type="gml:TemporalCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<documentation>gml:TemporalCRS is a 1D coordinate reference system used for the recording of time.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TemporalCRSType">
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:timeCS"/>
+						<element ref="gml:usesTemporalCS"/>
+					</choice>
+					<element ref="gml:temporalDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="timeCS" type="gml:TimeCSPropertyType">
+		<annotation>
+			<documentation>gml:timeCS is an association role to the time coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesTimeCS" type="gml:TimeCSPropertyType" substitutionGroup="gml:timeCS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="usesTemporalCS" type="gml:TemporalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="temporalDatum" type="gml:TemporalDatumPropertyType">
+		<annotation>
+			<documentation>gml:temporalDatum is an association role to the temporal datum used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<element name="usesTemporalDatum" type="gml:TemporalDatumPropertyType" substitutionGroup="gml:temporalDatum">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="TemporalCRSPropertyType">
+		<annotation>
+			<documentation>gml:TemporalCRSPropertyType is a property type for association roles to a temporal coordinate reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="temporalCRSRef" type="gml:TemporalCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="GeographicCRS" type="gml:GeographicCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="GeographicCRSType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<element ref="gml:usesEllipsoidalCS"/>
+					<element ref="gml:usesGeodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="GeographicCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeographicCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="geographicCRSRef" type="gml:GeographicCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="GeocentricCRS" type="gml:GeocentricCRSType" substitutionGroup="gml:AbstractSingleCRS">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="GeocentricCRSType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCRSType">
+				<sequence>
+					<choice>
+						<element ref="gml:usesCartesianCS"/>
+						<element ref="gml:usesSphericalCS"/>
+					</choice>
+					<element ref="gml:usesGeodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="GeocentricCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeocentricCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="geocentricCRSRef" type="gml:GeocentricCRSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coordinateSystems.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coordinateSystems.xsd
new file mode 100644
index 0000000..2ef777b
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coordinateSystems.xsd
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:coordinateSystems:3.2.0">coordinateSystems.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.4.
+The coordinate systems schema components can be divded into  three logical parts, which define elements and types for XML encoding of the definitions of:
+-	Coordinate system axes
+-	Abstract coordinate system
+-	Multiple concrete types of spatial-temporal coordinate systems
+These schema components encode the Coordinate System packages of the UML Models of ISO 19111 Clause 9 and ISO/DIS 19136 D.3.10.</documentation>
+	</annotation>
+	<include schemaLocation="referenceSystems.xsd"/>
+	<element name="CoordinateSystemAxis" type="gml:CoordinateSystemAxisType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:CoordinateSystemAxis is a definition of a coordinate system axis.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CoordinateSystemAxisType">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:axisAbbrev"/>
+					<element ref="gml:axisDirection"/>
+					<element ref="gml:minimumValue" minOccurs="0"/>
+					<element ref="gml:maximumValue" minOccurs="0"/>
+					<element ref="gml:rangeMeaning" minOccurs="0"/>
+				</sequence>
+				<attribute ref="gml:uom" use="required"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="axisAbbrev" type="gml:CodeType">
+		<annotation>
+			<documentation>gml:axisAbbrev is the abbreviation used for this coordinate system axis; this abbreviation is also used to identify the coordinates in the coordinate tuple. The codeSpace attribute may reference a source of more information on a set of standardized abbreviations, or on this abbreviation.</documentation>
+		</annotation>
+	</element>
+	<element name="axisDirection" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>gml:axisDirection is the direction of this coordinate system axis (or in the case of Cartesian projected coordinates, the direction of this coordinate system axis at the origin).
+Within any set of coordinate system axes, only one of each pair of terms may be used. For earth-fixed CRSs, this direction is often approximate and intended to provide a human interpretable meaning to the axis. When a geodetic datum is used, the precise directions of the axes may therefore vary slightly from this approximate direction.
+The codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property.</documentation>
+		</annotation>
+	</element>
+	<element name="minimumValue" type="double">
+		<annotation>
+			<documentation>The gml:minimumValue and gml:maximumValue properties allow the specification of minimum and maximum value normally allowed for this axis, in the unit of measure for the axis. For a continuous angular axis such as longitude, the values wrap-around at this value. Also, values beyond this minimum/maximum can be used for specified purposes, such as in a bounding box. A value of minus infinity shall be allowed for the gml:minimumValue element, a value of plus infiniy for the [...]
+		</annotation>
+	</element>
+	<element name="maximumValue" type="double">
+		<annotation>
+			<documentation>The gml:minimumValue and gml:maximumValue properties allow the specification of minimum and maximum value normally allowed for this axis, in the unit of measure for the axis. For a continuous angular axis such as longitude, the values wrap-around at this value. Also, values beyond this minimum/maximum can be used for specified purposes, such as in a bounding box. A value of minus infinity shall be allowed for the gml:minimumValue element, a value of plus infiniy for the [...]
+		</annotation>
+	</element>
+	<element name="rangeMeaning" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>gml:rangeMeaning describes the meaning of axis value range specified by gml:minimumValue and gml:maximumValue. This element shall be omitted when both gml:minimumValue and gml:maximumValue are omitted. This element should be included when gml:minimumValue and/or gml:maximumValue are included. If this element is omitted when the gml:minimumValue and/or gml:maximumValue are included, the meaning is unspecified. The codeSpace attribute shall reference a source of informati [...]
+		</annotation>
+	</element>
+	<attribute name="uom" type="anyURI">
+		<annotation>
+			<documentation>The uom attribute provides an identifier of the unit of measure used for this coordinate system axis. The value of this coordinate in a coordinate tuple shall be recorded using this unit of measure, whenever those coordinates use a coordinate reference system that uses a coordinate system that uses this axis.</documentation>
+		</annotation>
+	</attribute>
+	<complexType name="CoordinateSystemAxisPropertyType">
+		<annotation>
+			<documentation>gml:CoordinateSystemAxisPropertyType is a property type for association roles to a coordinate system axis, either referencing or containing the definition of that axis.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CoordinateSystemAxis"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="coordinateSystemAxisRef" type="gml:CoordinateSystemAxisPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AbstractCoordinateSystem" type="gml:AbstractCoordinateSystemType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:AbstractCoordinateSystem is a coordinate system (CS) is the non-repeating sequence of coordinate system axes that spans a given coordinate space. A CS is derived from a set of mathematical rules for specifying how coordinates in a given space are to be assigned to points. The coordinate values in a coordinate tuple shall be recorded in the order in which the coordinate system axes associations are recorded. This abstract complex type shall not be used, extended, or  [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractCoordinateSystemType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:axis" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="axis" type="gml:CoordinateSystemAxisPropertyType">
+		<annotation>
+			<documentation>The gml:axis property is an association role (ordered sequence) to the coordinate system axes included in this coordinate system. The coordinate values in a coordinate tuple shall be recorded in the order in which the coordinate system axes associations are recorded, whenever those coordinates use a coordinate reference system that uses this coordinate system. The gml:AggregationAttributeGroup should be used to specify that the axis objects are ordered.</documentation>
+		</annotation>
+	</element>
+	<element name="usesAxis" type="gml:CoordinateSystemAxisPropertyType" substitutionGroup="gml:axis">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="CoordinateSystemPropertyType">
+		<annotation>
+			<documentation>gml:CoordinateSystemPropertyType is a property type for association roles to a coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractCoordinateSystem"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="coordinateSystemRef" type="gml:CoordinateSystemPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="EllipsoidalCS" type="gml:EllipsoidalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:EllipsoidalCS is a two- or three-dimensional coordinate system in which position is specified by geodetic latitude, geodetic longitude, and (in the three-dimensional case) ellipsoidal height. An EllipsoidalCS shall have two or three gml:axis property elements; the number of associations shall equal the dimension of the CS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="EllipsoidalCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="EllipsoidalCSPropertyType">
+		<annotation>
+			<documentation>gml:EllipsoidalCSPropertyType is a property type for association roles to an ellipsoidal coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EllipsoidalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="ellipsoidalCSRef" type="gml:EllipsoidalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="CartesianCS" type="gml:CartesianCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:CartesianCS is a 1-, 2-, or 3-dimensional coordinate system. In the 1-dimensional case, it contains a single straight coordinate axis. In the 2- and 3-dimensional cases gives the position of points relative to orthogonal straight axes. In the multi-dimensional case, all axes shall have the same length unit of measure. A CartesianCS shall have one, two, or three gml:axis property elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CartesianCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="CartesianCSPropertyType">
+		<annotation>
+			<documentation>gml:CartesianCSPropertyType is a property type for association roles to a Cartesian coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CartesianCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="cartesianCSRef" type="gml:CartesianCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="VerticalCS" type="gml:VerticalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:VerticalCS is a one-dimensional coordinate system used to record the heights or depths of points. Such a coordinate system is usually dependent on the Earth's gravity field, perhaps loosely as when atmospheric pressure is the basis for the vertical coordinate system axis. A VerticalCS shall have one gml:axis property element.</documentation>
+		</annotation>
+	</element>
+	<complexType name="VerticalCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="VerticalCSPropertyType">
+		<annotation>
+			<documentation>gml:VerticalCSPropertyType is a property type for association roles to a vertical coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="verticalCSRef" type="gml:VerticalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="TimeCS" type="gml:TimeCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:TimeCS is a one-dimensional coordinate system containing a time axis, used to describe the temporal position of a point in the specified time units from a specified time origin. A TimeCS shall have one gml:axis property element.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeCSPropertyType">
+		<annotation>
+			<documentation>gml:TimeCSPropertyType is a property type for association roles to a time coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="TemporalCS" type="gml:TemporalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="TemporalCSType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="TemporalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="temporalCSRef" type="gml:TemporalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="LinearCS" type="gml:LinearCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:LinearCS is a one-dimensional coordinate system that consists of the points that lie on the single axis described. The associated coordinate is the distance – with or without offset – from the specified datum to the point along the axis. A LinearCS shall have one gml:axis property element.</documentation>
+		</annotation>
+	</element>
+	<complexType name="LinearCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="LinearCSPropertyType">
+		<annotation>
+			<documentation>gml:LinearCSPropertyType is a property type for association roles to a linear coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:LinearCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="linearCSRef" type="gml:LinearCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="UserDefinedCS" type="gml:UserDefinedCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:UserDefinedCS is a two- or three-dimensional coordinate system that consists of any combination of coordinate axes not covered by any other coordinate system type. A UserDefinedCS shall have two or three gml:axis property elements; the number of property elements shall equal the dimension of the CS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="UserDefinedCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="UserDefinedCSPropertyType">
+		<annotation>
+			<documentation>gml:UserDefinedCSPropertyType is a property type for association roles to a user-defined coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:UserDefinedCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="userDefinedCSRef" type="gml:UserDefinedCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="SphericalCS" type="gml:SphericalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:SphericalCS is a three-dimensional coordinate system with one distance measured from the origin and two angular coordinates. A SphericalCS shall have three gml:axis property elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SphericalCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="SphericalCSPropertyType">
+		<annotation>
+			<documentation>gml:SphericalCSPropertyType is property type for association roles to a spherical coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:SphericalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="sphericalCSRef" type="gml:SphericalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="PolarCS" type="gml:PolarCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:PolarCS ia s two-dimensional coordinate system in which position is specified by the distance from the origin and the angle between the line from the origin to a point and a reference direction. A PolarCS shall have two gml:axis property elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PolarCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="PolarCSPropertyType">
+		<annotation>
+			<documentation>gml:PolarCSPropertyType is a property type for association roles to a polar coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PolarCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="polarCSRef" type="gml:PolarCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="CylindricalCS" type="gml:CylindricalCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:CylindricalCS is a three-dimensional coordinate system consisting of a polar coordinate system extended by a straight coordinate axis perpendicular to the plane spanned by the polar coordinate system. A CylindricalCS shall have three gml:axis property elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CylindricalCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="CylindricalCSPropertyType">
+		<annotation>
+			<documentation>gml:CylindricalCSPropertyType is a property type for association roles to a cylindrical coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CylindricalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="cylindricalCSRef" type="gml:CylindricalCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="AffineCS" type="gml:AffineCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<documentation>gml:AffineCS is a two- or three-dimensional coordinate system with straight axes that are not necessarily orthogonal. An AffineCS shall have two or three gml:axis property elements; the number of property elements shall equal the dimension of the CS.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AffineCSType">
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="AffineCSPropertyType">
+		<annotation>
+			<documentation>gml:AffineCSPropertyType is a property type for association roles to an affine coordinate system, either referencing or containing the definition of that coordinate system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AffineCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="ObliqueCartesianCS" type="gml:ObliqueCartesianCSType" substitutionGroup="gml:AbstractCoordinateSystem">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ObliqueCartesianCSType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="ObliqueCartesianCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ObliqueCartesianCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="obliqueCartesianCSRef" type="gml:ObliqueCartesianCSPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coverage.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coverage.xsd
new file mode 100644
index 0000000..629d44c
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/coverage.xsd
@@ -0,0 +1,462 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:coverage:3.2.0">coverage.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 20.3.
+A coverage incorporates a mapping from a spatiotemporal domain to a range set, the latter providing the set in which the attribute values live.  The range set may be an arbitrary set including discrete lists, integer or floating point ranges, and multi-dimensional vector spaces.
+A coverage can be viewed as the graph of the coverage function f:A à B, that is as the set of ordered pairs {(x, f(x)) | where x is in A}. This view is especially applicable to the GML encoding of a coverage.  In the case of a discrete coverage, the domain set A is partitioned into a collection of subsets (typically a disjoint collection) A = UAi and the function f is constant on each Ai. For a spatial domain, the Ai are geometry elements, hence the coverage can be viewed as a collection [...]
+A coverage is implemented as a GML feature. We can thus speak of a “temperature distribution feature”, or a “remotely sensed image feature”, or a “soil distribution feature”.
+As is the case for any GML object, a coverage object may also be the value of a property of a feature.  
+</documentation>
+	</annotation>
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="valueObjects.xsd"/>
+	<include schemaLocation="grids.xsd"/>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<complexType name="AbstractCoverageType" abstract="true">
+		<annotation>
+			<documentation>The base type for coverages is gml:AbstractCoverageType. The basic elements of a coverage can be seen in this content model: the coverage contains gml:domainSet and gml:rangeSet properties. The gml:domainSet property describes the domain of the coverage and the gml:rangeSet property describes the range of the coverage.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:domainSet"/>
+					<element ref="gml:rangeSet"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractCoverage" type="gml:AbstractCoverageType" abstract="true" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<documentation>This element serves as the head of a substitution group which may contain any coverage whose type is derived from gml:AbstractCoverageType.  It may act as a variable in the definition of content models where it is required to permit any coverage to be valid.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractDiscreteCoverageType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractCoverageType">
+				<sequence>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractDiscreteCoverage" type="gml:AbstractDiscreteCoverageType" abstract="true" substitutionGroup="gml:AbstractCoverage">
+		<annotation>
+			<documentation>A discrete coverage consists of a domain set, range set and optionally a coverage function. The domain set consists of either spatial or temporal geometry objects, finite in number. The range set is comprised of a finite number of attribute values each of which is associated to every direct position within any single spatiotemporal object in the domain. In other words, the range values are constant on each spatiotemporal object in the domain. This coverage function maps [...]
+This element serves as the head of a substitution group which may contain any discrete coverage whose type is derived from gml:AbstractDiscreteCoverageType.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractContinuousCoverageType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractCoverageType">
+				<sequence>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractContinuousCoverage" type="gml:AbstractContinuousCoverageType" abstract="true" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<documentation>A continuous coverage as defined in ISO 19123 is a coverage that can return different values for the same feature attribute at different direct positions within a single spatiotemporal object in its spatiotemporal domain. The base type for continuous coverages is AbstractContinuousCoverageType.
+The coverageFunction element describes the mapping function. 
+The abstract element gml:AbstractContinuousCoverage serves as the head of a substitution group which may contain any continuous coverage whose type is derived from gml:AbstractContinuousCoverageType.</documentation>
+		</annotation>
+	</element>
+	<element name="domainSet" type="gml:DomainSetType">
+		<annotation>
+			<documentation>The gml:domainSet property element describes the spatio-temporal region of interest, within which the coverage is defined. Its content model is given by gml:DomainSetType.
+The value of the domain is thus a choice between a gml:AbstractGeometry and a gml:AbstractTimeObject.  In the instance these abstract elements will normally be substituted by a geometry complex or temporal complex, to represent spatial coverages and time-series, respectively.  
+The presence of the gml:AssociationAttributeGroup means that domainSet follows the usual GML property model and may use the xlink:href attribute to point to the domain, as an alternative to describing the domain inline. Ownership semantics may be provided using the gml:OwnershipAttributeGroup.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="DomainSetType">
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:AbstractGeometry"/>
+				<element ref="gml:AbstractTimeObject"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="rangeSet" type="gml:RangeSetType">
+		<annotation>
+			<documentation>The gml:rangeSet property element contains the values of the coverage (sometimes called the attribute values).  Its content model is given by gml:RangeSetType.
+This content model supports a structural description of the range.  The semantic information describing the range set is embedded using a uniform method, as part of the explicit values, or as a template value accompanying the representation using gml:DataBlock and gml:File.
+The values from each component (or “band”) in the range may be encoded within a gml:ValueArray element or a concrete member of the gml:AbstractScalarValueList substitution group . Use of these elements satisfies the value-type homogeneity requirement.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RangeSetType">
+		<choice>
+			<element ref="gml:ValueArray" maxOccurs="unbounded"/>
+			<element ref="gml:AbstractScalarValueList" maxOccurs="unbounded"/>
+			<element ref="gml:DataBlock"/>
+			<element ref="gml:File"/>
+		</choice>
+	</complexType>
+	<element name="DataBlock" type="gml:DataBlockType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:DataBlock describes the Range as a block of text encoded values similar to a Common Separated Value (CSV) representation.
+The range set parameterization is described by the property gml:rangeParameters.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DataBlockType">
+		<sequence>
+			<element ref="gml:rangeParameters"/>
+			<choice>
+				<element ref="gml:tupleList"/>
+				<element ref="gml:doubleOrNilReasonTupleList"/>
+			</choice>
+		</sequence>
+	</complexType>
+	<element name="rangeParameters" type="gml:RangeParametersType"/>
+	<complexType name="RangeParametersType">
+		<annotation>
+			<documentation>gml:RangeParameterType is a framework for the description of the range parameters each of which is a gml:AbstractValue.  Specific range parameters are defined through the creation of a GML Application Schema that provides elements that are substitutable for gml:AbstractValue.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:AbstractValue" minOccurs="0"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="tupleList" type="gml:CoordinatesType">
+		<annotation>
+			<documentation>gml:CoordinatesType consists of a list of coordinate tuples, with each coordinate tuple separated by the ts or tuple separator (whitespace), and each coordinate in the tuple by the cs or coordinate separator (comma).
+The gml:tupleList encoding is effectively “band-interleaved”.</documentation>
+		</annotation>
+	</element>
+	<element name="doubleOrNilReasonTupleList" type="gml:doubleOrNilReasonList">
+		<annotation>
+			<documentation>gml:doubleOrNilReasonList consists of a list of gml:doubleOrNilReason values, each separated by a whitespace. The gml:doubleOrNilReason values are grouped into tuples where the dimension of each tuple in the list is equal to the number of range parameters.</documentation>
+		</annotation>
+	</element>
+	<element name="File" type="gml:FileType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>for efficiency reasons, GML also provides a means of encoding the range set in an arbitrary external encoding, such as a binary file.  This encoding may be “well-known” but this is not required. This mode uses the gml:File element.
+The values of the coverage (attribute values in the range set) are transmitted in a external file that is referenced from the XML structure described by gml:FileType.  The external file is referenced by the gml:fileReference property that is an anyURI (the gml:fileName property has been deprecated).  This means that the external file may be located remotely from the referencing GML instance. 
+The gml:compression property points to a definition of a compression algorithm through an anyURI.  This may be a retrievable, computable definition or simply a reference to an unambiguous name for the compression method.
+The gml:mimeType property points to a definition of the file mime type.
+The gml:fileStructure property is defined by the gml:FileValueModelType.  This is simple enumerated type restriction on string.  The only value supported in GML is “Record Interleaved”.  Additional values may be supported in future releases of GML.  Note further that all values shall be enclosed in a single file. Multi-file structures for values are not supported in GML.
+The semantics of the range set is described as above using the gml:rangeParameters property.
+Note that if any compression algorithm is applied, the structure above applies only to the pre-compression or post-decompression structure of the file.
+Note that the fields within a record match the gml:valueComponents of the gml:CompositeValue in document order.</documentation>
+		</annotation>
+	</element>
+	<complexType name="FileType">
+		<sequence>
+			<element ref="gml:rangeParameters"/>
+			<choice>
+				<element name="fileName" type="anyURI"/>
+				<element name="fileReference" type="anyURI"/>
+			</choice>
+			<element name="fileStructure" type="gml:FileValueModelType"/>
+			<element name="mimeType" type="anyURI" minOccurs="0"/>
+			<element name="compression" type="anyURI" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<simpleType name="FileValueModelType">
+		<restriction base="string">
+			<enumeration value="Record Interleaved"/>
+		</restriction>
+	</simpleType>
+	<element name="coverageFunction" type="gml:CoverageFunctionType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>The gml:coverageFunction property describes the mapping function from the domain to the range of the coverage.
+The value of the CoverageFunction is one of gml:CoverageMappingRule and gml:GridFunction.
+If the gml:coverageFunction property is omitted for a gridded coverage (including rectified gridded coverages) the gml:startPoint is assumed to be the value of the gml:low property in the gml:Grid geometry, and the gml:sequenceRule is assumed to be linear and the gml:axisOrder property is assumed to be “+1 +2”.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CoverageFunctionType">
+		<choice>
+			<element ref="gml:MappingRule"/>
+			<element ref="gml:CoverageMappingRule"/>
+			<element ref="gml:GridFunction"/>
+		</choice>
+	</complexType>
+	<element name="CoverageMappingRule" type="gml:MappingRuleType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:CoverageMappingRule provides a formal or informal description of the coverage function.
+The mapping rule may be defined as an in-line string (gml:ruleDefinition) or via a remote reference through xlink:href (gml:ruleReference).  
+If no rule name is specified, the default is ‘Linear’ with respect to members of the domain in document order.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MappingRuleType" final="#all">
+		<choice>
+			<element name="ruleDefinition" type="string"/>
+			<element name="ruleReference" type="gml:ReferenceType"/>
+		</choice>
+	</complexType>
+	<element name="MappingRule" type="gml:StringOrRefType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="GridFunction" type="gml:GridFunctionType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:GridFunction provides an explicit mapping rule for grid geometries, i.e. the domain shall be a geometry of type grid.  It describes the mapping of grid posts (discrete point grid coverage) or grid cells (discrete surface coverage) to the values in the range set.
+The gml:startPoint is the index position of a point in the grid that is mapped to the first point in the range set (this is also the index position of the first grid post).  If the gml:startPoint property is omitted the gml:startPoint is assumed to be equal to the value of gml:low in the gml:Grid geometry. Subsequent points in the mapping are determined by the value of the gml:sequenceRule.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GridFunctionType">
+		<sequence>
+			<element name="sequenceRule" type="gml:SequenceRuleType" minOccurs="0"/>
+			<element name="startPoint" type="gml:integerList" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<complexType name="SequenceRuleType">
+		<annotation>
+			<documentation>The gml:SequenceRuleType is derived from the gml:SequenceRuleEnumeration through the addition of an axisOrder attribute.  The gml:SequenceRuleEnumeration is an enumerated type. The rule names are defined in ISO 19123. If no rule name is specified the default is “Linear”.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:SequenceRuleEnumeration">
+				<attribute name="order" type="gml:IncrementOrder">
+					<annotation>
+						<appinfo>deprecated</appinfo>
+					</annotation>
+				</attribute>
+				<attribute name="axisOrder" type="gml:AxisDirectionList"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="SequenceRuleEnumeration">
+		<restriction base="string">
+			<enumeration value="Linear"/>
+			<enumeration value="Boustrophedonic"/>
+			<enumeration value="Cantor-diagonal"/>
+			<enumeration value="Spiral"/>
+			<enumeration value="Morton"/>
+			<enumeration value="Hilbert"/>
+		</restriction>
+	</simpleType>
+	<simpleType name="AxisDirectionList">
+		<annotation>
+			<documentation>The different values in a gml:AxisDirectionList indicate the incrementation order to be used on all axes of the grid. Each axis shall be mentioned once and only once.</documentation>
+		</annotation>
+		<list itemType="gml:AxisDirection"/>
+	</simpleType>
+	<simpleType name="AxisDirection">
+		<annotation>
+			<documentation>The value of a gml:AxisDirection indicates the incrementation order to be used on an axis of the grid.</documentation>
+		</annotation>
+		<restriction base="string">
+			<pattern value="[\+\-][1-9][0-9]*"/>
+		</restriction>
+	</simpleType>
+	<simpleType name="IncrementOrder">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="+x+y"/>
+			<enumeration value="+y+x"/>
+			<enumeration value="+x-y"/>
+			<enumeration value="-x-y"/>
+		</restriction>
+	</simpleType>
+	<element name="MultiPointCoverage" type="gml:MultiPointCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>In a gml:MultiPointCoverage the domain set is a gml:MultiPoint, that is a collection of arbitrarily distributed geometric points.
+The content model is derived by restriction from gml:AbstractDiscreteCoverageType. Note that the restriction replaces the generic gml:domainSet by the specific gml:multiPointDomain whose value is a gml:MultiPoint.
+In a gml:MultiPointCoverage the mapping from the domain to the range is straightforward.
+-	For gml:DataBlock encodings the points of the gml:MultiPoint are mapped in document order to the tuples of the data block.
+-	For gml:CompositeValue encodings the points of the gml:MultiPoint are mapped to the members of the composite value in document order.
+-	For gml:File encodings the points of the gml:MultiPoint are mapped to the records of the file in sequential order.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiPointCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiPointDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="multiPointDomain" type="gml:MultiPointDomainType" substitutionGroup="gml:domainSet"/>
+	<complexType name="MultiPointDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiPoint"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="MultiCurveCoverage" type="gml:MultiCurveCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>In a gml:MultiCurveCoverage the domain is partioned into a collection of curves comprising a gml:MultiCurve.  The coverage function then maps each curve in the collection to a value in the range set.
+The content model is derived by restriction from gml:AbstractDiscreteCoverageType. Note that the restriction replaces the generic gml:domainSet by the specific gml:multiCurveDomain whose value is a gml:MultiCurve.
+In a gml:MultiCurveCoverage the mapping from the domain to the range is straightforward.
+-	For gml:DataBlock encodings the curves of the gml:MultiCurve are mapped in document order to the tuples of the data block.
+-	For gml:CompositeValue encodings the curves of the gml:MultiCurve are mapped to the members of the composite value in document order.
+-	For gml:File encodings the curves of the gml:MultiCurve are mapped to the records of the file in sequential order.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiCurveCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiCurveDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="multiCurveDomain" type="gml:MultiCurveDomainType" substitutionGroup="gml:domainSet"/>
+	<complexType name="MultiCurveDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiCurve"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="MultiSurfaceCoverage" type="gml:MultiSurfaceCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>In a gml:MultiSurfaceCoverage the domain is partioned into a collection of surfaces comprising a gml:MultiSurface.  The coverage function than maps each surface in the collection to a value in the range set.
+The content model is derived by restriction from gml:AbstractDiscreteCoverageType. Note that the restriction replaces the generic gml:domainSet by the specific gml:multiSurfaceDomain whose value is a gml:MultiSurface.
+In a gml:MultiSurfaceCoverage the mapping from the domain to the range is straightforward.
+-	For gml:DataBlock encodings the surfaces of the gml:MultiSurface are mapped in document order to the tuples of the data block.
+-	For gml:CompositeValue encodings the surfaces of the gml:MultiSurface are mapped to the members of the composite value in document order.
+-	For gml:File encodings the surfaces of the gml:MultiSurface are mapped to the records of the file in sequential order.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiSurfaceCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiSurfaceDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="multiSurfaceDomain" type="gml:MultiSurfaceDomainType" substitutionGroup="gml:domainSet"/>
+	<complexType name="MultiSurfaceDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiSurface"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="MultiSolidCoverage" type="gml:MultiSolidCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>In a gml:MultiSolidCoverage the domain is partioned into a collection of solids comprising a gml:MultiSolid.  The coverage function than maps each solid in the collection to a value in the range set.
+The content model is derived by restriction from gml:AbstractDiscreteCoverageType. Note that the restriction replaces the generic gml:domainSet by the specific gml:multiSolidDomain whose value is a gml:MultiSolid.
+In a gml:MultiSolidCoverage the mapping from the domain to the range is straightforward.
+-	For gml:DataBlock encodings the solids of the gml:MultiSolid are mapped in document order to the tuples of the data block.
+-	For gml:CompositeValue encodings the solids of the gml:MultiSolid are mapped to the members of the composite value in document order.
+-	For gml:File encodings the solids of the gml:MultiSolid are mapped to the records of the file in sequential order.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiSolidCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiSolidDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="multiSolidDomain" type="gml:MultiSolidDomainType" substitutionGroup="gml:domainSet"/>
+	<complexType name="MultiSolidDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiSolid"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="GridCoverage" type="gml:GridCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>A gml:GriddedCoverage is a discrete point coverage in which the domain set is a geometric grid of points.
+Note that this is the same as the gml:MultiPointCoverage except that we have a gml:gridDomain property to describe the domain.
+The simple gridded coverage is not geometrically referenced and hence no geometric positions are assignable to the points in the grid. Such geometric positioning is introduced in the gml:RectifiedGridCoverage.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GridCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:gridDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="gridDomain" type="gml:GridDomainType" substitutionGroup="gml:domainSet"/>
+	<complexType name="GridDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<choice>
+						<choice>
+							<element ref="gml:Grid"/>
+						</choice>
+						<choice/>
+					</choice>
+				</sequence>
+				<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="RectifiedGridCoverage" type="gml:RectifiedGridCoverageType" substitutionGroup="gml:AbstractDiscreteCoverage">
+		<annotation>
+			<documentation>The gml:RectifiedGridCoverage is a discrete point coverage based on a rectified grid. It is similar to the grid coverage except that the points of the grid are geometrically referenced. The rectified grid coverage has a domain that is a gml:RectifiedGrid geometry.
+The coverage domain is described by gml:rectifiedGridDomain.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RectifiedGridCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:rectifiedGridDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="rectifiedGridDomain" type="gml:RectifiedGridDomainType" substitutionGroup="gml:domainSet"/>
+	<complexType name="RectifiedGridDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:RectifiedGrid"/>
+				</sequence>
+				<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/datums.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/datums.xsd
new file mode 100644
index 0000000..83213dd
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/datums.xsd
@@ -0,0 +1,342 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Clemens Portele (interactive instruments) -->
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:datums:3.2.0">datums.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.5
+The datums schema components can be divided into three logical parts, which define elements and types for XML encoding of the definitions of:
+-	Abstract datum
+-	Geodetic datums, including ellipsoid and prime meridian
+-	Multiple other concrete types of spatial or temporal datums
+These schema components encode the Datum packages of the UML Models of ISO 19111 Clause 10 and ISO/DIS 19136 D.3.10.</documentation>
+	</annotation>
+	<include schemaLocation="referenceSystems.xsd"/>
+	<include schemaLocation="measures.xsd"/>
+	<element name="AbstractDatum" type="gml:AbstractDatumType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A gml:AbstractDatum specifies the relationship of a coordinate system to the earth, thus creating a coordinate reference system. A datum uses a parameter or set of parameters that determine the location of the origin of the coordinate reference system. Each datum subtype may be associated with only specific types of coordinate systems. This abstract complex type shall not be used, extended, or restricted, in a GML Application Schema, to define a concrete subtype with a  [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractDatumType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+					<element ref="gml:anchorDefinition" minOccurs="0"/>
+					<element ref="gml:realizationEpoch" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="anchorDefinition" type="gml:CodeType">
+		<annotation>
+			<documentation>gml:anchorDefinition is a description, possibly including coordinates, of the definition used to anchor the datum to the Earth. Also known as the "origin", especially for engineering and image datums. The codeSpace attribute may be used to reference a source of more detailed on this point or surface, or on a set of such descriptions.
+-	For a geodetic datum, this point is also known as the fundamental point, which is traditionally the point where the relationship between geoid and ellipsoid is defined. In some cases, the "fundamental point" may consist of a number of points. In those cases, the parameters defining the geoid/ellipsoid relationship have been averaged for these points, and the averages adopted as the datum definition.
+-	For an engineering datum, the anchor definition may be a physical point, or it may be a point with defined coordinates in another CRS.may
+-	For an image datum, the anchor definition is usually either the centre of the image or the corner of the image.
+-	For a temporal datum, this attribute is not defined. Instead of the anchor definition, a temporal datum carries a separate time origin of type DateTime.</documentation>
+		</annotation>
+	</element>
+	<element name="anchorPoint" type="gml:CodeType" substitutionGroup="gml:anchorDefinition">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="realizationEpoch" type="date">
+		<annotation>
+			<documentation>gml:realizationEpoch is the time after which this datum definition is valid. See ISO 19111 Table 32 for details.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DatumPropertyType">
+		<annotation>
+			<documentation>gml:DatumPropertyType is a property type for association roles to a datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="datumRef" type="gml:DatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="GeodeticDatum" type="gml:GeodeticDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>gml:GeodeticDatum is a geodetic datum defines the precise location and orientation in 3-dimensional space of a defined ellipsoid (or sphere), or of a Cartesian coordinate system centered in this ellipsoid (or sphere).</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeodeticDatumType">
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:primeMeridian"/>
+					<element ref="gml:ellipsoid"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="primeMeridian" type="gml:PrimeMeridianPropertyType">
+		<annotation>
+			<documentation>gml:primeMeridian is an association role to the prime meridian used by this geodetic datum.</documentation>
+		</annotation>
+	</element>
+	<element name="usesPrimeMeridian" type="gml:PrimeMeridianPropertyType" substitutionGroup="gml:primeMeridian">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="ellipsoid" type="gml:EllipsoidPropertyType">
+		<annotation>
+			<documentation>gml:ellipsoid is an association role to the ellipsoid used by this geodetic datum.</documentation>
+		</annotation>
+	</element>
+	<element name="usesEllipsoid" type="gml:EllipsoidPropertyType" substitutionGroup="gml:ellipsoid">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="GeodeticDatumPropertyType">
+		<annotation>
+			<documentation>gml:GeodeticDatumPropertyType is a property type for association roles to a geodetic datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeodeticDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="geodeticDatumRef" type="gml:GeodeticDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="Ellipsoid" type="gml:EllipsoidType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A gml:Ellipsoid is a geometric figure that may be used to describe the approximate shape of the earth. In mathematical terms, it is a surface formed by the rotation of an ellipse about its minor axis.</documentation>
+		</annotation>
+	</element>
+	<complexType name="EllipsoidType">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:semiMajorAxis"/>
+					<element ref="gml:secondDefiningParameter"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="semiMajorAxis" type="gml:MeasureType">
+		<annotation>
+			<documentation>gml:semiMajorAxis specifies the length of the semi-major axis of the ellipsoid, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a length, such as metres or feet.</documentation>
+		</annotation>
+	</element>
+	<element name="secondDefiningParameter">
+		<annotation>
+			<documentation>gml:secondDefiningParameter is a property containing the definition of the second parameter that defines the shape of an ellipsoid. An ellipsoid requires two defining parameters: semi-major axis and inverse flattening or semi-major axis and semi-minor axis. When the reference body is a sphere rather than an ellipsoid, only a single defining parameter is required, namely the radius of the sphere; in that case, the semi-major axis "degenerates" into the radius of the sphere.
+The inverseFlattening element contains the inverse flattening value of the ellipsoid. This value is a scale factor (or ratio). It uses gml:LengthType with the restriction that the unit of measure referenced by the uom attribute must be suitable for a scale factor, such as percent, permil, or parts-per-million.
+The semiMinorAxis element contains the length of the semi-minor axis of the ellipsoid. When the isSphere element is included, the ellipsoid is degenerate and is actually a sphere. The sphere is completely defined by the semi-major axis, which is the radius of the sphere.</documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element ref="gml:SecondDefiningParameter"/>
+			</sequence>
+		</complexType>
+	</element>
+	<element name="SecondDefiningParameter">
+		<complexType>
+			<choice>
+				<element name="inverseFlattening" type="gml:MeasureType"/>
+				<element name="semiMinorAxis" type="gml:LengthType"/>
+				<element name="isSphere">
+					<simpleType>
+						<restriction base="string">
+							<enumeration value="sphere"/>
+						</restriction>
+					</simpleType>
+				</element>
+			</choice>
+		</complexType>
+	</element>
+	<complexType name="EllipsoidPropertyType">
+		<annotation>
+			<documentation>gml:EllipsoidPropertyType is a property type for association roles to an ellipsoid, either referencing or containing the definition of that ellipsoid.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Ellipsoid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="ellipsoidRef" type="gml:EllipsoidPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="PrimeMeridian" type="gml:PrimeMeridianType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A gml:PrimeMeridian defines the origin from which longitude values are determined. The default value for the prime meridian gml:identifier value is "Greenwich".</documentation>
+		</annotation>
+	</element>
+	<complexType name="PrimeMeridianType">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:greenwichLongitude"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="greenwichLongitude" type="gml:AngleType">
+		<annotation>
+			<documentation>gml:greenwichLongitude is the longitude of the prime meridian measured from the Greenwich meridian, positive eastward. If the value of the prime meridian “name” is "Greenwich" then the value of greenwichLongitude shall be 0 degrees.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PrimeMeridianPropertyType">
+		<annotation>
+			<documentation>gml:PrimeMeridianPropertyType is a property type for association roles to a prime meridian, either referencing or containing the definition of that meridian.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PrimeMeridian"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="primeMeridianRef" type="gml:PrimeMeridianPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="EngineeringDatum" type="gml:EngineeringDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>gml:EngineeringDatum defines the origin of an engineering coordinate reference system, and is used in a region around that origin. This origin may be fixed with respect to the earth (such as a defined point at a construction site), or be a defined point on a moving vehicle (such as on a ship or satellite).</documentation>
+		</annotation>
+	</element>
+	<complexType name="EngineeringDatumType">
+		<complexContent>
+			<extension base="gml:AbstractDatumType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="EngineeringDatumPropertyType">
+		<annotation>
+			<documentation>gml:EngineeringDatumPropertyType is a property type for association roles to an engineering datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EngineeringDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="engineeringDatumRef" type="gml:EngineeringDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="ImageDatum" type="gml:ImageDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>gml:ImageDatum defines the origin of an image coordinate reference system, and is used in a local context only. For an image datum, the anchor definition is usually either the centre of the image or the corner of the image. For more information, see ISO 19111 B.3.5.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ImageDatumType">
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:pixelInCell"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="pixelInCell" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>gml:pixelInCell is a specification of the way an image grid is associated with the image data attributes. The required codeSpace attribute shall reference a source of information specifying the values and meanings of all the allowed string values for this property.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ImageDatumPropertyType">
+		<annotation>
+			<documentation>gml:ImageDatumPropertyType is a property type for association roles to an image datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ImageDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="imageDatumRef" type="gml:ImageDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="VerticalDatum" type="gml:VerticalDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>gml:VerticalDatum is a textual description and/or a set of parameters identifying a particular reference level surface used as a zero-height surface, including its position with respect to the Earth for any of the height types recognized by this International Standard.</documentation>
+		</annotation>
+	</element>
+	<complexType name="VerticalDatumType">
+		<complexContent>
+			<extension base="gml:AbstractDatumType"/>
+		</complexContent>
+	</complexType>
+	<complexType name="VerticalDatumPropertyType">
+		<annotation>
+			<documentation>gml:VerticalDatumPropertyType is property type for association roles to a vertical datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="verticalDatumRef" type="gml:VerticalDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="TemporalDatum" type="gml:TemporalDatumType" substitutionGroup="gml:AbstractDatum">
+		<annotation>
+			<documentation>A gml:TemporalDatum defines the origin of a Temporal Reference System. This type omits the "anchorDefinition" and "realizationEpoch" elements and adds the "origin" element with the dateTime type.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TemporalDatumType">
+		<complexContent>
+			<extension base="gml:TemporalDatumBaseType">
+				<sequence>
+					<element ref="gml:origin"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TemporalDatumBaseType" abstract="true">
+		<annotation>
+			<documentation>The TemporalDatumBaseType partially defines the origin of a temporal coordinate reference system. This type restricts the AbstractDatumType to remove the "anchorDefinition" and "realizationEpoch" elements.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:descriptionReference" minOccurs="0"/>
+					<element ref="gml:identifier"/>
+					<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:domainOfValidity" minOccurs="0"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="origin" type="dateTime">
+		<annotation>
+			<documentation>gml:origin is the date and time origin of this temporal datum.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TemporalDatumPropertyType">
+		<annotation>
+			<documentation>gml:TemporalDatumPropertyType is a property type for association roles to a temporal datum, either referencing or containing the definition of that datum.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="temporalDatumRef" type="gml:TemporalDatumPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/dictionary.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/dictionary.xsd
new file mode 100644
index 0000000..cbda7ef
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/dictionary.xsd
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:dictionary:v3.2.0">dictionary.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 16.
+Many applications require definitions of terms which are used within instance documents as the values of certain properties or as reference information to tie properties to standard information values in some way.  Units of measure and descriptions of measurable phenomena are two particular examples. 
+It will often be convenient to use definitions provided by external authorities. These may already be packaged for delivery in various ways, both online and offline. In order that they may be referred to from GML documents it is generally necessary that a URI be available for each definition. Where this is the case then it is usually preferable to refer to these directly. 
+Alternatively, it may be convenient or necessary to capture definitions in XML, either embedded within an instance document containing features or as a separate document. The definitions may be transcriptions from an external source, or may be new definitions for a local purpose. In order to support this case, some simple components are provided in GML in the form of 
+-	a generic gml:Definition, which may serve as the basis for more specialized definitions
+-	a generic gml:Dictionary, which allows a set of definitions or references to definitions to be collected 
+These components may be used directly, but also serve as the basis for more specialised definition elements in GML, in particular: coordinate operations, coordinate reference systems, datums, temporal reference systems, and units of measure.  
+Note that the GML definition and dictionary components implement a simple nested hierarchy of definitions with identifiers. The latter provide handles which may be used in the description of more complex relationships between terms. However, the GML dictionary components are not intended to provide direct support for complex taxonomies, ontologies or thesauri.  Specialised XML tools are available to satisfy the more sophisticated requirements. </documentation>
+	</annotation>
+	<include schemaLocation="gmlBase.xsd"/>
+	<element name="Definition" type="gml:DefinitionType" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>The basic gml:Definition element specifies a definition, which can be included in or referenced by a dictionary. 
+The content model for a generic definition is a derivation from gml:AbstractGMLType.  
+The gml:description property element shall hold the definition if this can be captured in a simple text string, or the gml:descriptionReference property element may carry a link to a description elsewhere.
+The gml:identifier element shall provide one identifier identifying this definition. The identifier shall be unique within the dictionaries using this definition. 
+The gml:name elements shall provide zero or more terms and synonyms for which this is the definition.
+The gml:remarks element shall be used to hold additional textual information that is not conceptually part of the definition but is useful in understanding the definition.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DefinitionBaseType">
+		<complexContent>
+			<restriction base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:descriptionReference" minOccurs="0"/>
+					<element ref="gml:identifier"/>
+					<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="DefinitionType">
+		<complexContent>
+			<extension base="gml:DefinitionBaseType">
+				<sequence>
+					<element ref="gml:remarks" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="remarks" type="string"/>
+	<element name="Dictionary" type="gml:DictionaryType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>Sets of definitions may be collected into dictionaries or collections.
+A gml:Dictionary is a non-abstract collection of definitions.
+The gml:Dictionary content model adds a list of gml:dictionaryEntry properties that contain or reference gml:Definition objects.  A database handle (gml:id attribute) is required, in order that this collection may be referred to. The standard gml:identifier, gml:description, gml:descriptionReference and gml:name properties are available to reference or contain more information about this dictionary. The gml:description and gml:descriptionReference property elements may be used for a desc [...]
+		</annotation>
+	</element>
+	<element name="DefinitionCollection" type="gml:DictionaryType" substitutionGroup="gml:Definition">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DictionaryType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<choice minOccurs="0" maxOccurs="unbounded">
+					<element ref="gml:dictionaryEntry"/>
+					<element ref="gml:indirectEntry"/>
+				</choice>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="dictionaryEntry" type="gml:DictionaryEntryType">
+		<annotation>
+			<documentation>This property element contains or refers to the definitions which are members of a dictionary. 
+The content model follows the standard GML property pattern, so a gml:dictionaryEntry may either contain or refer to a single gml:Definition. Since gml:Dictionary is substitutable for gml:Definition, the content of an entry may itself be a lower level dictionary. 
+Note that if the value is provided by reference, this definition does not carry a handle (gml:id) in this context, so does not allow external references to this specific definition in this context.  When used in this way the referenced definition will usually be in a dictionary in the same XML document.</documentation>
+		</annotation>
+	</element>
+	<element name="definitionMember" type="gml:DictionaryEntryType" substitutionGroup="gml:dictionaryEntry">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DictionaryEntryType">
+		<complexContent>
+			<extension base="gml:AbstractMemberType">
+				<sequence minOccurs="0">
+					<element ref="gml:Definition"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="indirectEntry" type="gml:IndirectEntryType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="IndirectEntryType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence>
+			<element ref="gml:DefinitionProxy"/>
+		</sequence>
+	</complexType>
+	<element name="DefinitionProxy" type="gml:DefinitionProxyType" substitutionGroup="gml:Definition">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DefinitionProxyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:definitionRef"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="definitionRef" type="gml:ReferenceType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/direction.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/direction.xsd
new file mode 100644
index 0000000..331aa3c
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/direction.xsd
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:direction:3.2.0">direction.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 18.
+The direction schema components provide the GML Application Schema developer with a standard property element to describe direction, and associated objects that may be used to express orientation, direction, heading, bearing or other directional aspects of geographic features. </documentation>
+	</annotation>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<element name="direction" type="gml:DirectionPropertyType">
+		<annotation>
+			<documentation>The property gml:direction is intended as a pre-defined property expressing a direction to be assigned to features defined in a GML application schema.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectionPropertyType">
+		<sequence minOccurs="0">
+			<choice>
+				<element name="DirectionVector" type="gml:DirectionVectorType"/>
+				<element name="DirectionDescription" type="gml:DirectionDescriptionType"/>
+				<element name="CompassPoint" type="gml:CompassPointEnumeration"/>
+				<element name="DirectionKeyword" type="gml:CodeType"/>
+				<element name="DirectionString" type="gml:StringOrRefType"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="DirectionVectorType">
+		<annotation>
+			<documentation>Direction vectors are specified by providing components of a vector.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:vector"/>
+			<sequence>
+				<annotation>
+					<appinfo>deprecated</appinfo>
+				</annotation>
+				<element name="horizontalAngle" type="gml:AngleType"/>
+				<element name="verticalAngle" type="gml:AngleType"/>
+			</sequence>
+		</choice>
+	</complexType>
+	<complexType name="DirectionDescriptionType">
+		<annotation>
+			<documentation>direction descriptions are specified by a compass point code, a keyword, a textual description or a reference to a description.
+A gml:compassPoint is specified by a simple enumeration.  	
+In addition, thre elements to contain text-based descriptions of direction are provided.  
+If the direction is specified using a term from a list, gml:keyword should be used, and the list indicated using the value of the codeSpace attribute. 
+if the direction is decribed in prose, gml:direction or gml:reference should be used, allowing the value to be included inline or by reference.</documentation>
+		</annotation>
+		<choice>
+			<element name="compassPoint" type="gml:CompassPointEnumeration"/>
+			<element name="keyword" type="gml:CodeType"/>
+			<element name="description" type="string"/>
+			<element name="reference" type="gml:ReferenceType"/>
+		</choice>
+	</complexType>
+	<simpleType name="CompassPointEnumeration">
+		<annotation>
+			<documentation>These directions are necessarily approximate, giving direction with a precision of 22.5°. It is thus generally unnecessary to specify the reference frame, though this may be detailed in the definition of a GML application language.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="N"/>
+			<enumeration value="NNE"/>
+			<enumeration value="NE"/>
+			<enumeration value="ENE"/>
+			<enumeration value="E"/>
+			<enumeration value="ESE"/>
+			<enumeration value="SE"/>
+			<enumeration value="SSE"/>
+			<enumeration value="S"/>
+			<enumeration value="SSW"/>
+			<enumeration value="SW"/>
+			<enumeration value="WSW"/>
+			<enumeration value="W"/>
+			<enumeration value="WNW"/>
+			<enumeration value="NW"/>
+			<enumeration value="NNW"/>
+		</restriction>
+	</simpleType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/dynamicFeature.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/dynamicFeature.xsd
new file mode 100644
index 0000000..dffa6f3
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/dynamicFeature.xsd
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:dynamicFeature:3.2.0">dynamicFeature.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 15.6.
+A number of types and relationships are defined to represent the time-varying properties of geographic features. 
+In a comprehensive treatment of spatiotemporal modeling, Langran (see Bibliography) distinguished three principal temporal entities: states, events, and evidence; the schema specified in the following Subclauses incorporates elements for each.</documentation>
+	</annotation>
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="direction.xsd"/>
+	<element name="dataSource" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Evidence is represented by a simple gml:dataSource or gml:dataSourceReference property that indicates the source of the temporal data. The remote link attributes of the gml:dataSource element have been deprecated along with its current type.</documentation>
+		</annotation>
+	</element>
+	<element name="dataSourceReference" type="gml:ReferenceType">
+		<annotation>
+			<documentation>Evidence is represented by a simple gml:dataSource or gml:dataSourceReference property that indicates the source of the temporal data.</documentation>
+		</annotation>
+	</element>
+	<group name="dynamicProperties">
+		<annotation>
+			<documentation>A convenience group. This allows an application schema developer to include dynamic properties in a content model in a standard fashion.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:validTime" minOccurs="0"/>
+			<element ref="gml:history" minOccurs="0"/>
+			<element ref="gml:dataSource" minOccurs="0"/>
+			<element ref="gml:dataSourceReference" minOccurs="0"/>
+		</sequence>
+	</group>
+	<element name="DynamicFeature" type="gml:DynamicFeatureType" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<documentation>States are captured by time-stamped instances of a feature. The content model extends the standard gml:AbstractFeatureType with the gml:dynamicProperties model group.
+Each time-stamped instance represents a ‘snapshot’ of a feature. The dynamic feature classes will normally be extended to suit particular applications.  A dynamic feature bears either a time stamp or a history.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DynamicFeatureType">
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<group ref="gml:dynamicProperties"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="DynamicFeatureCollection" type="gml:DynamicFeatureCollectionType" substitutionGroup="gml:DynamicFeature">
+		<annotation>
+			<documentation>A gml:DynamicFeatureCollection is a feature collection that has a gml:validTime property (i.e. is a snapshot of the feature collection) or which has a gml:history property that contains one or more gml:AbstractTimeSlices each of which contain values of the time varying properties of the feature collection.  Note that the gml:DynamicFeatureCollection may be one of the following:
+1.	A feature collection which consists of static feature members (members do not change in time) but which has properties of the collection object as a whole that do change in time .  
+2.	A feature collection which consists of dynamic feature members (the members are gml:DynamicFeatures) but which also has properties of the collection as a whole that vary in time.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DynamicFeatureCollectionType">
+		<complexContent>
+			<extension base="gml:DynamicFeatureType">
+				<sequence>
+					<element ref="gml:dynamicMembers"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="dynamicMembers" type="gml:DynamicFeatureMemberType"/>
+	<complexType name="DynamicFeatureMemberType">
+		<complexContent>
+			<extension base="gml:AbstractFeatureMemberType">
+				<sequence>
+					<element ref="gml:DynamicFeature" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTimeSlice" type="gml:AbstractTimeSliceType" abstract="true" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>To describe an event — an action that occurs at an instant or over an interval of time — GML provides the gml:AbtractTimeSlice element. A timeslice encapsulates the time-varying properties of a dynamic feature -- it shall be extended to represent a time stamped projection of a specific feature. The gml:dataSource property describes how the temporal data was acquired.
+A gml:AbstractTimeSlice instance is a GML object that encapsulates updates of the dynamic—or volatile—properties that reflect some change event; it thus includes only those feature properties that have actually changed due to some process.
+gml:AbstractTimeSlice basically provides a facility for attribute-level time stamping, in contrast to the object-level time stamping of dynamic feature instances. 
+The time slice can thus be viewed as event or process-oriented, whereas a snapshot is more state or structure-oriented. A timeslice has richer causality, whereas a snapshot merely portrays the status of the whole. 
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeSliceType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:validTime"/>
+					<element ref="gml:dataSource" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MovingObjectStatus" type="gml:MovingObjectStatusType" substitutionGroup="gml:AbstractTimeSlice">
+		<annotation>
+			<documentation>gml:MovingObjectStatus is one example of how gml:AbstractTimeSlice may be extended. This element provides a standard method to capture a record of the status of a moving object.
+A gml:MovingObjectStatus element allows the user to describe the present location, along with the speed, bearing, acceleration and elevation of an object in a particular time slice.  
+Additional information about the current status of the object may be recorded in the gml:status or gml:statusReference property elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MovingObjectStatusType">
+		<complexContent>
+			<extension base="gml:AbstractTimeSliceType">
+				<sequence>
+					<choice>
+						<element name="position" type="gml:GeometryPropertyType"/>
+						<element ref="gml:pos"/>
+						<element ref="gml:locationName"/>
+						<element ref="gml:locationReference"/>
+						<element ref="gml:location"/>
+					</choice>
+					<element name="speed" type="gml:MeasureType" minOccurs="0"/>
+					<element name="bearing" type="gml:DirectionPropertyType" minOccurs="0"/>
+					<element name="acceleration" type="gml:MeasureType" minOccurs="0"/>
+					<element name="elevation" type="gml:MeasureType" minOccurs="0"/>
+					<element ref="gml:status" minOccurs="0"/>
+					<element ref="gml:statusReference" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="status" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>The remote link attributes of the gml:status element have been deprecated along with its current type.</documentation>
+		</annotation>
+	</element>
+	<element name="statusReference" type="gml:ReferenceType"/>
+	<element name="history" type="gml:HistoryPropertyType">
+		<annotation>
+			<documentation>A generic sequence of events constitute a gml:history of an object.
+The gml:history element contains a set of elements in the substitution group headed by the abstract element gml:AbstractTimeSlice, representing the time-varying properties of interest. The history property of a dynamic feature associates a feature instance with a sequence of time slices (i.e. change events) that encapsulate the evolution of the feature.</documentation>
+		</annotation>
+	</element>
+	<complexType name="HistoryPropertyType">
+		<sequence>
+			<element ref="gml:AbstractTimeSlice" maxOccurs="unbounded"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="track" type="gml:HistoryPropertyType" substitutionGroup="gml:history">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/feature.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/feature.xsd
new file mode 100644
index 0000000..462265a
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/feature.xsd
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:feature:3.2.0">feature.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 9.
+A GML feature is a (representation of a) identifiable real-world object in a selected domain of discourse. The feature schema provides a framework for the creation of GML features and feature collections.</documentation>
+	</annotation>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<complexType name="AbstractFeatureType" abstract="true">
+		<annotation>
+			<documentation>The basic feature model is given by the gml:AbstractFeatureType.
+The content model for gml:AbstractFeatureType adds two specific properties suitable for geographic features to the content model defined in gml:AbstractGMLType. 
+The value of the gml:boundedBy property describes an envelope that encloses the entire feature instance, and is primarily useful for supporting rapid searching for features that occur in a particular location. 
+The value of the gml:location property describes the extent, position or relative location of the feature.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:location" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractFeature" type="gml:AbstractFeatureType" abstract="true" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>This abstract element serves as the head of a substitution group which may contain any elements whose content model is derived from gml:AbstractFeatureType.  This may be used as a variable in the construction of content models.  
+gml:AbstractFeature may be thought of as “anything that is a GML feature” and may be used to define variables or templates in which the value of a GML property is “any feature”. This occurs in particular in a GML feature collection where the feature member properties contain one or multiple copies of gml:AbstractFeature respectively.</documentation>
+		</annotation>
+	</element>
+	<element name="boundedBy" type="gml:BoundingShapeType" nillable="true">
+		<annotation>
+			<documentation>This property describes the minimum bounding box or rectangle that encloses the entire feature.</documentation>
+		</annotation>
+	</element>
+	<complexType name="BoundingShapeType">
+		<sequence>
+			<choice>
+				<element ref="gml:Envelope"/>
+				<element ref="gml:Null"/>
+			</choice>
+		</sequence>
+		<attribute name="nilReason" type="gml:NilReasonType"/>
+	</complexType>
+	<element name="EnvelopeWithTimePeriod" type="gml:EnvelopeWithTimePeriodType" substitutionGroup="gml:Envelope">
+		<annotation>
+			<documentation>gml:EnvelopeWithTimePeriod is provided for envelopes that include a temporal extent. It adds two time position properties, gml:beginPosition and gml:endPosition, which describe the extent of a time-envelope.  
+Since gml:EnvelopeWithTimePeriod is assigned to the substitution group headed by gml:Envelope, it may be used whenever gml:Envelope is valid.</documentation>
+		</annotation>
+	</element>
+	<complexType name="EnvelopeWithTimePeriodType">
+		<complexContent>
+			<extension base="gml:EnvelopeType">
+				<sequence>
+					<element name="beginPosition" type="gml:TimePositionType"/>
+					<element name="endPosition" type="gml:TimePositionType"/>
+				</sequence>
+				<attribute name="frame" type="anyURI" default="#ISO-8601"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="location" type="gml:LocationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="LocationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence>
+			<choice>
+				<element ref="gml:AbstractGeometry"/>
+				<element ref="gml:LocationKeyWord"/>
+				<element ref="gml:LocationString"/>
+				<element ref="gml:Null"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="LocationString" type="gml:StringOrRefType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="LocationKeyWord" type="gml:CodeType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="locationName" type="gml:CodeType">
+		<annotation>
+			<documentation>The gml:locationName property element is a convenience property where the text value describes the location of the feature. If the location names are selected from a controlled list, then the list shall be identified in the codeSpace attribute.</documentation>
+		</annotation>
+	</element>
+	<element name="locationReference" type="gml:ReferenceType">
+		<annotation>
+			<documentation>The gml:locationReference property element is a convenience property where the text value referenced by the xlink:href attribute describes the location of the feature.</documentation>
+		</annotation>
+	</element>
+	<element name="priorityLocation" type="gml:PriorityLocationPropertyType" substitutionGroup="gml:location">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="PriorityLocationPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:LocationPropertyType">
+				<attribute name="priority" type="string"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="FeaturePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractFeature"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="featureMember" type="gml:FeaturePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="featureProperty" type="gml:FeaturePropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="FeatureArrayPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractFeature"/>
+		</sequence>
+	</complexType>
+	<element name="featureMembers" type="gml:FeatureArrayPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="centerOf" type="gml:PointPropertyType"/>
+	<element name="position" type="gml:PointPropertyType"/>
+	<element name="extentOf" type="gml:SurfacePropertyType"/>
+	<element name="edgeOf" type="gml:CurvePropertyType"/>
+	<element name="centerLineOf" type="gml:CurvePropertyType"/>
+	<element name="multiLocation" type="gml:MultiPointPropertyType"/>
+	<element name="multiCenterOf" type="gml:MultiPointPropertyType"/>
+	<element name="multiPosition" type="gml:MultiPointPropertyType"/>
+	<element name="multiCenterLineOf" type="gml:MultiCurvePropertyType"/>
+	<element name="multiEdgeOf" type="gml:MultiCurvePropertyType"/>
+	<element name="multiCoverage" type="gml:MultiSurfacePropertyType"/>
+	<element name="multiExtentOf" type="gml:MultiSurfacePropertyType"/>
+	<complexType name="BoundedFeatureType" abstract="true">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractFeatureType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy"/>
+					<element ref="gml:location" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="AbstractFeatureMemberType" abstract="true">
+		<annotation>
+			<documentation>To create a collection of GML features, a property type shall be derived by extension from gml:AbstractFeatureMemberType.
+By default, this abstract property type does not imply any ownership of the features in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of a feature in the collection. A collection shall not own a feature already owned by another object.</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="AbstractFeatureCollectionType" abstract="true">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:featureMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:featureMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractFeatureCollection" type="gml:AbstractFeatureCollectionType" abstract="true" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="FeatureCollection" type="gml:FeatureCollectionType" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="FeatureCollectionType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureCollectionType"/>
+		</complexContent>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryAggregates.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryAggregates.xsd
new file mode 100644
index 0000000..edf9d96
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryAggregates.xsd
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:geometryAggregates:3.2.0">geometryAggregates.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 12.3.
+Geometric aggregates (i.e. instances of a subtype of gml:AbstractGeometricAggregateType) are arbitrary aggregations of geometry elements. They are not assumed to have any additional internal structure and are used to "collect" pieces of geometry of a specified type. Application schemas may use aggregates for features that use multiple geometric objects in their representations.</documentation>
+	</annotation>
+	<include schemaLocation="geometryPrimitives.xsd"/>
+	<complexType name="AbstractGeometricAggregateType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractGeometricAggregate" type="gml:AbstractGeometricAggregateType" abstract="true" substitutionGroup="gml:AbstractGeometry">
+		<annotation>
+			<documentation>gml:AbstractGeometricAggregate is the abstract head of the substitution group for all geometric aggregates.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiGeometryType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:geometryMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:geometryMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiGeometry" type="gml:MultiGeometryType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>gml:MultiGeometry is a collection of one or more GML geometry objects of arbitrary type. 
+The members of the geometric aggregate may be specified either using the "standard" property (gml:geometryMember) or the array property (gml:geometryMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="geometryMember" type="gml:GeometryPropertyType">
+		<annotation>
+			<documentation>This property element either references a geometry element via the XLink-attributes or contains the geometry element.</documentation>
+		</annotation>
+	</element>
+	<element name="geometryMembers" type="gml:GeometryArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of geometry elements. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiGeometryPropertyType">
+		<annotation>
+			<documentation>A property that has a geometric aggregate as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeometricAggregate"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="multiGeometryProperty" type="gml:MultiGeometryPropertyType">
+		<annotation>
+			<documentation>This property element either references a geometric aggregate via the XLink-attributes or contains the "multi geometry" element. multiGeometryProperty is the predefined property, which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractGeometricAggregate.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiPointType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:pointMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:pointMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiPoint" type="gml:MultiPointType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>A gml:MultiPoint consists of one or more gml:Points.
+The members of the geometric aggregate may be specified either using the "standard" property (gml:pointMember) or the array property (gml:pointMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="pointMember" type="gml:PointPropertyType">
+		<annotation>
+			<documentation>This property element either references a Point via the XLink-attributes or contains the Point element.</documentation>
+		</annotation>
+	</element>
+	<element name="pointMembers" type="gml:PointArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of points. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiPointPropertyType">
+		<annotation>
+			<documentation>A property that has a collection of points as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiPoint"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="multiPointProperty" type="gml:MultiPointPropertyType">
+		<annotation>
+			<documentation>This property element either references a point aggregate via the XLink-attributes or contains the "multi point" element. multiPointProperty is the predefined property, which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for MultiPoint.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiCurveType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:curveMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:curveMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiCurve" type="gml:MultiCurveType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>A gml:MultiCurve is defined by one or more gml:AbstractCurves.
+The members of the geometric aggregate may be specified either using the "standard" property (gml:curveMember) or the array property (gml:curveMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="curveMembers" type="gml:CurveArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of curves. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiCurvePropertyType">
+		<annotation>
+			<documentation>A property that has a collection of curves as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="multiCurveProperty" type="gml:MultiCurvePropertyType">
+		<annotation>
+			<documentation>This property element either references a curve aggregate via the XLink-attributes or contains the "multi curve" element. multiCurveProperty is the predefined property, which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for MultiCurve.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiSurfaceType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:surfaceMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:surfaceMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiSurface" type="gml:MultiSurfaceType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>A gml:MultiSurface is defined by one or more gml:AbstractSurfaces.
+The members of the geometric aggregate may be specified either using the "standard" property (gml:surfaceMember) or the array property (gml:surfaceMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="surfaceMembers" type="gml:SurfaceArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of surfaces. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiSurfacePropertyType">
+		<annotation>
+			<documentation>A property that has a collection of surfaces as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="multiSurfaceProperty" type="gml:MultiSurfacePropertyType">
+		<annotation>
+			<documentation>This property element either references a surface aggregate via the XLink-attributes or contains the "multi surface" element. multiSurfaceProperty is the predefined property, which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for MultiSurface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiSolidType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:solidMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:solidMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="MultiSolid" type="gml:MultiSolidType" substitutionGroup="gml:AbstractGeometricAggregate">
+		<annotation>
+			<documentation>A gml:MultiSolid is defined by one or more gml:AbstractSolids.
+The members of the geometric aggregate may be specified either using the "standard" property (gml:solidMember) or the array property (gml:solidMembers). It is also valid to use both the "standard" and the array properties in the same collection.</documentation>
+		</annotation>
+	</element>
+	<element name="solidMember" type="gml:SolidPropertyType">
+		<annotation>
+			<documentation>This property element either references a solid via the XLink-attributes or contains the solid element. A solid element is any element, which is substitutable for gml:AbstractSolid.</documentation>
+		</annotation>
+	</element>
+	<element name="solidMembers" type="gml:SolidArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of solids. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<complexType name="MultiSolidPropertyType">
+		<annotation>
+			<documentation>A property that has a collection of solids as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="multiSolidProperty" type="gml:MultiSolidPropertyType">
+		<annotation>
+			<documentation>This property element either references a solid aggregate via the XLink-attributes or contains the "multi solid" element. multiSolidProperty is the predefined property, which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for MultiSolid.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryBasic0d1d.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryBasic0d1d.xsd
new file mode 100644
index 0000000..cd941b8
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryBasic0d1d.xsd
@@ -0,0 +1,304 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:geometryBasic0d1d:3.2.0">geometryBasic0d1d.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 10.
+Any geometry element that inherits the semantics of AbstractGeometryType may be viewed as a set of direct positions. 
+All of the classes derived from AbstractGeometryType inherit an optional association to a coordinate reference system. All direct positions shall directly or indirectly be associated with a coordinate reference system. When geometry elements are aggregated in another geometry element (such as a MultiGeometry or GeometricComplex), which already has a coordinate reference system specified, then these elements are assumed to be in that same coordinate reference system unless otherwise specified.
+The geometry model distinguishes geometric primitives, aggregates and complexes. 
+Geometric primitives, i.e. instances of a subtype of AbstractGeometricPrimitiveType, will be open, that is, they will not contain their boundary points; curves will not contain their end points, surfaces will not contain their boundary curves, and solids will not contain their bounding surfaces.</documentation>
+	</annotation>
+	<include schemaLocation="measures.xsd"/>
+	<complexType name="AbstractGeometryType" abstract="true">
+		<annotation>
+			<documentation>All geometry elements are derived directly or indirectly from this abstract supertype. A geometry element may have an identifying attribute (gml:id), one or more names (elements identifier and name) and a description (elements description and descriptionReference) . It may be associated with a spatial reference system (attribute group gml:SRSReferenceGroup).
+The following rules shall be adhered to:
+-	Every geometry type shall derive from this abstract type.
+-	Every geometry element (i.e. an element of a geometry type) shall be directly or indirectly in the substitution group of AbstractGeometry.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<attributeGroup name="SRSReferenceGroup">
+		<annotation>
+			<documentation>The attribute group SRSReferenceGroup is an optional reference to the CRS used by this geometry, with optional additional information to simplify the processing of the coordinates when a more complete definition of the CRS is not needed.
+In general the attribute srsName points to a CRS instance of gml:AbstractCoordinateReferenceSystem. For well-known references it is not required that the CRS description exists at the location the URI points to. 
+If no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of.</documentation>
+		</annotation>
+		<attribute name="srsName" type="anyURI"/>
+		<attribute name="srsDimension" type="positiveInteger"/>
+		<attributeGroup ref="gml:SRSInformationGroup"/>
+	</attributeGroup>
+	<attributeGroup name="SRSInformationGroup">
+		<annotation>
+			<documentation>The attributes uomLabels and axisLabels, defined in the SRSInformationGroup attribute group, are optional additional and redundant information for a CRS to simplify the processing of the coordinate values when a more complete definition of the CRS is not needed. This information shall be the same as included in the complete definition of the CRS, referenced by the srsName attribute. When the srsName attribute is included, either both or neither of the axisLabels and uom [...]
+The attribute axisLabels is an ordered list of labels for all the axes of this CRS. The gml:axisAbbrev value should be used for these axis labels, after spaces and forbidden characters are removed. When the srsName attribute is included, this attribute is optional. When the srsName attribute is omitted, this attribute shall also be omitted.
+The attribute uomLabels is an ordered list of unit of measure (uom) labels for all the axes of this CRS. The value of the string in the gml:catalogSymbol should be used for this uom labels, after spaces and forbidden characters are removed. When the axisLabels attribute is included, this attribute shall also be included. When the axisLabels attribute is omitted, this attribute shall also be omitted.</documentation>
+		</annotation>
+		<attribute name="axisLabels" type="gml:NCNameList"/>
+		<attribute name="uomLabels" type="gml:NCNameList"/>
+	</attributeGroup>
+	<element name="AbstractGeometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>The AbstractGeometry element is the abstract head of the substitution group for all geometry elements of GML. This includes pre-defined and user-defined geometry elements. Any geometry element shall be a direct or indirect extension/restriction of AbstractGeometryType and shall be directly or indirectly in the substitution group of AbstractGeometry.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeometryPropertyType">
+		<annotation>
+			<documentation>A geometric property may either be any geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same or another document). Note that either the reference or the contained element shall be given, but not both or none.
+If a feature has a property that takes a geometry element as its value, this is called a geometry property. A generic type for such a geometry property is GeometryPropertyType.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeometry"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="GeometryArrayPropertyType">
+		<annotation>
+			<documentation>If a feature has a property which takes an array of geometry elements as its value, this is called a geometry array property. A generic type for such a geometry property is GeometryArrayPropertyType. 
+The elements are always contained inline in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractGeometry"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="DirectPositionType">
+		<annotation>
+			<documentation>Direct position instances hold the coordinates for a position within some coordinate reference system (CRS). Since direct positions, as data types, will often be included in larger objects (such as geometry elements) that have references to CRS, the srsName attribute will in general be missing, if this particular direct position is included in a larger element with such a reference to a CRS. In this case, the CRS is implicitly assumed to take on the value of the contain [...]
+if no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of, typically a geometric object like a point, curve, etc.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<element name="pos" type="gml:DirectPositionType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="CRS attributes constraints">
+					<sch:rule id="CRSLabelsPos">
+						<sch:report test="not(@srsDimension) or @srsName">The presence of a dimension attribute implies the presence of the srsName attribute.</sch:report>
+						<sch:report test="not(@axisLabels) or @srsName">The presence of an axisLabels attribute implies the presence of the srsName attribute.</sch:report>
+						<sch:report test="not(@uomLabels) or @srsName">The presence of an uomLabels attribute implies the presence of the srsName attribute.</sch:report>
+						<sch:report test="(not(@uomLabels) and not(@axisLabels)) or (@uomLabels and @axisLabels)">The presence of an uomLabels attribute implies the presence of the axisLabels attribute and vice versa.</sch:report>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DirectPositionListType">
+		<annotation>
+			<documentation>posList instances (and other instances with the content model specified by DirectPositionListType) hold the coordinates for a sequence of direct positions within the same coordinate reference system (CRS).
+if no srsName attribute is given, the CRS shall be specified as part of the larger context this geometry element is part of, typically a geometric object like a point, curve, etc. 
+The optional attribute count specifies the number of direct positions in the list. If the attribute count is present then the attribute srsDimension shall be present, too.
+The number of entries in the list is equal to the product of the dimensionality of the coordinate reference system (i.e. it is a derived value of the coordinate reference system definition) and the number of direct positions.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+				<attribute name="count" type="positiveInteger"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<element name="posList" type="gml:DirectPositionListType"/>
+	<group name="geometricPositionGroup">
+		<annotation>
+			<documentation>GML supports two different ways to specify a geometric position: either by a direct position (a data type) or a point (a geometric object).
+pos elements are positions that are “owned” by the geometric primitive encapsulating this geometric position.
+pointProperty elements contain a point that may be referenced from other geometry elements or reference another point defined elsewhere (reuse of existing points).</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:pos"/>
+			<element ref="gml:pointProperty"/>
+		</choice>
+	</group>
+	<group name="geometricPositionListGroup">
+		<annotation>
+			<documentation>GML supports two different ways to specify a list of geometric positions: either by a sequence of geometric positions (by reusing the group definition) or a sequence of direct positions (element posList). 
+The posList element allows for a compact way to specify the coordinates of the positions, if all positions are represented in the same coordinate reference system.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:posList"/>
+			<group ref="gml:geometricPositionGroup" maxOccurs="unbounded"/>
+		</choice>
+	</group>
+	<element name="coordinates" type="gml:CoordinatesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="VectorType">
+		<annotation>
+			<documentation>For some applications the components of the position may be adjusted to yield a unit vector.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:DirectPositionType"/>
+		</simpleContent>
+	</complexType>
+	<element name="vector" type="gml:VectorType"/>
+	<complexType name="EnvelopeType">
+		<choice>
+			<sequence>
+				<element name="lowerCorner" type="gml:DirectPositionType"/>
+				<element name="upperCorner" type="gml:DirectPositionType"/>
+			</sequence>
+			<element ref="gml:pos" minOccurs="2" maxOccurs="2">
+				<annotation>
+					<appinfo>deprecated</appinfo>
+				</annotation>
+			</element>
+			<element ref="gml:coordinates"/>
+		</choice>
+		<attributeGroup ref="gml:SRSReferenceGroup"/>
+	</complexType>
+	<element name="Envelope" type="gml:EnvelopeType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>Envelope defines an extent using a pair of positions defining opposite corners in arbitrary dimensions. The first direct position is the "lower corner" (a coordinate position consisting of all the minimal ordinates for each dimension for all points within the envelope), the second one the "upper corner" (a coordinate position consisting of all the maximal ordinates for each dimension for all points within the envelope).
+The use of the properties “coordinates” and “pos” has been deprecated. The explicitly named properties “lowerCorner” and “upperCorner” shall be used instead.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGeometricPrimitiveType" abstract="true">
+		<annotation>
+			<documentation>gml:AbstractGeometricPrimitiveType is the abstract root type of the geometric primitives. A geometric primitive is a geometric object that is not decomposed further into other primitives in the system. All primitives are oriented in the direction implied by the sequence of their coordinate tuples.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractGeometricPrimitive" type="gml:AbstractGeometricPrimitiveType" abstract="true" substitutionGroup="gml:AbstractGeometry">
+		<annotation>
+			<documentation>The AbstractGeometricPrimitive element is the abstract head of the substitution group for all (pre- and user-defined) geometric primitives.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeometricPrimitivePropertyType">
+		<annotation>
+			<documentation>A property that has a geometric primitive as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractGeometricPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="PointType">
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType">
+				<sequence>
+					<choice>
+						<element ref="gml:pos"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Point" type="gml:PointType" substitutionGroup="gml:AbstractGeometricPrimitive">
+		<annotation>
+			<documentation>A Point is defined by a single coordinate tuple. The direct position of a point is specified by the pos element which is of type DirectPositionType.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PointPropertyType">
+		<annotation>
+			<documentation>A property that has a point as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Point"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="pointProperty" type="gml:PointPropertyType">
+		<annotation>
+			<documentation>This property element either references a point via the XLink-attributes or contains the point element. pointProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for Point.</documentation>
+		</annotation>
+	</element>
+	<element name="pointRep" type="gml:PointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="PointArrayPropertyType">
+		<annotation>
+			<documentation>gml:PointArrayPropertyType is a container for an array of points. The elements are always contained inline in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:Point"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="pointArrayProperty" type="gml:PointArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of point elements. pointArrayProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for a list of points.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractCurveType" abstract="true">
+		<annotation>
+			<documentation>gml:AbstractCurveType is an abstraction of a curve to support the different levels of complexity. The curve may always be viewed as a geometric primitive, i.e. is continuous.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractCurve" type="gml:AbstractCurveType" abstract="true" substitutionGroup="gml:AbstractGeometricPrimitive">
+		<annotation>
+			<documentation>The AbstractCurve element is the abstract head of the substitution group for all (continuous) curve elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CurvePropertyType">
+		<annotation>
+			<documentation>A property that has a curve as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="curveProperty" type="gml:CurvePropertyType">
+		<annotation>
+			<documentation>This property element either references a curve via the XLink-attributes or contains the curve element. curveProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractCurve.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CurveArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of curves. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="curveArrayProperty" type="gml:CurveArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of curve elements. curveArrayProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for a list of curves.</documentation>
+		</annotation>
+	</element>
+	<complexType name="LineStringType">
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="LineString" type="gml:LineStringType" substitutionGroup="gml:AbstractCurve">
+		<annotation>
+			<documentation>A LineString is a special curve that consists of a single segment with linear interpolation. It is defined by two or more coordinate tuples, with linear interpolation between them. The number of direct positions in the list shall be at least two.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryBasic2d.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryBasic2d.xsd
new file mode 100644
index 0000000..58d12c5
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryBasic2d.xsd
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:geometryBasic2d:3.2.0">geometryBasic2d.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 10.</documentation>
+	</annotation>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<complexType name="AbstractSurfaceType" abstract="true">
+		<annotation>
+			<documentation>gml:AbstractSurfaceType is an abstraction of a surface to support the different levels of complexity. A surface is always a continuous region of a plane.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractSurface" type="gml:AbstractSurfaceType" abstract="true" substitutionGroup="gml:AbstractGeometricPrimitive">
+		<annotation>
+			<documentation>The AbstractSurface element is the abstract head of the substitution group for all (continuous) surface elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SurfacePropertyType">
+		<annotation>
+			<documentation>A property that has a surface as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="surfaceProperty" type="gml:SurfacePropertyType">
+		<annotation>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. surfaceProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractSurface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SurfaceArrayPropertyType">
+		<annotation>
+			<documentation>gml:SurfaceArrayPropertyType is a container for an array of surfaces. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements via XLinks is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="surfaceArrayProperty" type="gml:SurfaceArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of surface elements. surfaceArrayProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for a list of AbstractSurfaces.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PolygonType">
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:exterior" minOccurs="0"/>
+					<element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:AbstractSurface">
+		<annotation>
+			<documentation>A Polygon is a special surface that is defined by a single surface patch (see D.3.6). The boundary of this patch is coplanar and the polygon uses planar interpolation in its interior. 
+The elements exterior and interior describe the surface boundary of the polygon.</documentation>
+		</annotation>
+	</element>
+	<element name="exterior" type="gml:AbstractRingPropertyType">
+		<annotation>
+			<documentation>A boundary of a surface consists of a number of rings. In the normal 2D case, one of these rings is distinguished as being the exterior boundary. In a general manifold this is not always possible, in which case all boundaries shall be listed as interior boundaries, and the exterior will be empty.</documentation>
+		</annotation>
+	</element>
+	<element name="interior" type="gml:AbstractRingPropertyType">
+		<annotation>
+			<documentation>A boundary of a surface consists of a number of rings. The "interior" rings separate the surface / surface patch from the area enclosed by the rings.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractRingType" abstract="true">
+		<sequence/>
+	</complexType>
+	<element name="AbstractRing" type="gml:AbstractRingType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>An abstraction of a ring to support surface boundaries of different complexity.
+The AbstractRing element is the abstract head of the substituition group for all closed boundaries of a surface patch.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractRingPropertyType">
+		<annotation>
+			<documentation>A property with the content model of gml:AbstractRingPropertyType encapsulates a ring to represent the surface boundary property of a surface.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:AbstractRing"/>
+		</sequence>
+	</complexType>
+	<complexType name="LinearRingType">
+		<complexContent>
+			<extension base="gml:AbstractRingType">
+				<sequence>
+					<choice>
+						<choice minOccurs="4" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="LinearRing" type="gml:LinearRingType" substitutionGroup="gml:AbstractRing">
+		<annotation>
+			<documentation>A LinearRing is defined by four or more coordinate tuples, with linear interpolation between them; the first and last coordinates shall be coincident. The number of direct positions in the list shall be at least four.</documentation>
+		</annotation>
+	</element>
+	<complexType name="LinearRingPropertyType">
+		<annotation>
+			<documentation>A property with the content model of gml:LinearRingPropertyType encapsulates a linear ring to represent a component of a surface boundary.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:LinearRing"/>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryComplexes.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryComplexes.xsd
new file mode 100644
index 0000000..639a18d
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryComplexes.xsd
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:geometryComplexes:3.2.0">geometryComplexes.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 12.2.
+Geometric complexes (i.e. instances of gml:GeometricComplexType) are closed collections of geometric primitives, i.e. they will contain their boundaries. 
+A geometric complex (gml:GeometricComplex) is defined by ISO 19107:2003, 6.6.1 as “a set of primitive geometric objects (in a common coordinate system) whose interiors are disjoint. Further, if a primitive is in a geometric complex, then there exists a set of primitives in that complex whose point-wise union is the boundary of this first primitive.”
+A geometric composite (gml:CompositeCurve, gml:CompositeSurface and gml:CompositeSolid) represents a geometric complex with an underlying core geometry that is isomorphic to a primitive, i.e. it can be viewed as a primitive and as a complex. See ISO 19107:2003, 6.1 and 6.6.3 for more details on the nature of composite geometries.
+Geometric complexes and composites are intended to be used in application schemas where the sharing of geometry is important.</documentation>
+	</annotation>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<complexType name="GeometricComplexType">
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<sequence>
+					<element name="element" type="gml:GeometricPrimitivePropertyType" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="GeometricComplex" type="gml:GeometricComplexType" substitutionGroup="gml:AbstractGeometry"/>
+	<complexType name="GeometricComplexPropertyType">
+		<annotation>
+			<documentation>A property that has a geometric complex as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:GeometricComplex"/>
+				<element ref="gml:CompositeCurve"/>
+				<element ref="gml:CompositeSurface"/>
+				<element ref="gml:CompositeSolid"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="CompositeCurveType">
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:curveMember" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="CompositeCurve" type="gml:CompositeCurveType" substitutionGroup="gml:AbstractCurve">
+		<annotation>
+			<documentation>A gml:CompositeCurve is represented by a sequence of (orientable) curves such that each curve in the sequence terminates at the start point of the subsequent curve in the list. 
+curveMember references or contains inline one curve in the composite curve. 
+The curves are contiguous, the collection of curves is ordered. Therefore, if provided, the aggregationType attribute shall have the value “sequence”.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CompositeSurfaceType">
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:surfaceMember" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="CompositeSurface" type="gml:CompositeSurfaceType" substitutionGroup="gml:AbstractSurface">
+		<annotation>
+			<documentation>A gml:CompositeSurface is represented by a set of orientable surfaces. It is geometry type with all the geometric properties of a (primitive) surface. Essentially, a composite surface is a collection of surfaces that join in pairs on common boundary curves and which, when considered as a whole, form a single surface.
+surfaceMember references or contains inline one surface in the composite surface. 
+The surfaces are contiguous.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CompositeSolidType">
+		<complexContent>
+			<extension base="gml:AbstractSolidType">
+				<sequence>
+					<element ref="gml:solidMember" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="CompositeSolid" type="gml:CompositeSolidType" substitutionGroup="gml:AbstractSolid">
+		<annotation>
+			<documentation>gml:CompositeSolid implements ISO 19107 GM_CompositeSolid (see ISO 19107:2003, 6.6.7) as specified in D.2.3.6. 
+A gml:CompositeSolid is represented by a set of orientable surfaces. It is a geometry type with all the geometric properties of a (primitive) solid. Essentially, a composite solid is a collection of solids that join in pairs on common boundary surfaces and which, when considered as a whole, form a single solid. 
+solidMember references or contains one solid in the composite solid. The solids are contiguous.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryPrimitives.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryPrimitives.xsd
new file mode 100644
index 0000000..6fdeb10
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/geometryPrimitives.xsd
@@ -0,0 +1,892 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:geometryPrimitives:3.2.0">geometryPrimitives.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 11.
+Beside the “simple” geometric primitives specified in the previous Clause, this Clause specifies additional primitives to describe real world situations which require a more expressive geometry model.
+</documentation>
+	</annotation>
+	<include schemaLocation="geometryBasic2d.xsd"/>
+	<complexType name="CurveType">
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:segments"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Curve" type="gml:CurveType" substitutionGroup="gml:AbstractCurve">
+		<annotation>
+			<documentation>A curve is a 1-dimensional primitive. Curves are continuous, connected, and have a measurable length in terms of the coordinate system. 
+A curve is composed of one or more curve segments. Each curve segment within a curve may be defined using a different interpolation method. The curve segments are connected to one another, with the end point of each segment except the last being the start point of the next segment in the segment list.
+The orientation of the curve is positive.
+The element segments encapsulates the segments of the curve.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OrientableCurveType">
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:baseCurve"/>
+				</sequence>
+				<attribute name="orientation" type="gml:SignType" default="+"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="baseCurve" type="gml:CurvePropertyType">
+		<annotation>
+			<documentation>The property baseCurve references or contains the base curve, i.e. it either references the base curve via the XLink-attributes or contains the curve element. A curve element is any element which is substitutable for AbstractCurve. The base curve has positive orientation.</documentation>
+		</annotation>
+	</element>
+	<element name="OrientableCurve" type="gml:OrientableCurveType" substitutionGroup="gml:AbstractCurve">
+		<annotation>
+			<documentation>OrientableCurve consists of a curve and an orientation. If the orientation is "+", then the OrientableCurve is identical to the baseCurve. If the orientation is "-", then the OrientableCurve is related to another AbstractCurve with a parameterization that reverses the sense of the curve traversal.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractCurveSegmentType" abstract="true">
+		<attribute name="numDerivativesAtStart" type="integer" default="0"/>
+		<attribute name="numDerivativesAtEnd" type="integer" default="0"/>
+		<attribute name="numDerivativeInterior" type="integer" default="0"/>
+	</complexType>
+	<element name="AbstractCurveSegment" type="gml:AbstractCurveSegmentType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>A curve segment defines a homogeneous segment of a curve.
+The attributes numDerivativesAtStart, numDerivativesAtEnd and numDerivativesInterior specify the type of continuity as specified in ISO 19107:2003, 6.4.9.3.
+The AbstractCurveSegment element is the abstract head of the substituition group for all curve segment elements, i.e. continuous segments of the same interpolation mechanism.
+All curve segments shall have an attribute interpolation with type gml:CurveInterpolationType specifying the curve interpolation mechanism used for this segment. This mechanism uses the control points and control parameters to determine the position of this curve segment.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CurveSegmentArrayPropertyType">
+		<annotation>
+			<documentation>gml:CurveSegmentArrayPropertyType is a container for an array of curve segments.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractCurveSegment"/>
+		</sequence>
+	</complexType>
+	<element name="segments" type="gml:CurveSegmentArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of curve segments. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<simpleType name="CurveInterpolationType">
+		<annotation>
+			<documentation>gml:CurveInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an application schema.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="linear"/>
+			<enumeration value="geodesic"/>
+			<enumeration value="circularArc3Points"/>
+			<enumeration value="circularArc2PointWithBulge"/>
+			<enumeration value="circularArcCenterPointWithRadius"/>
+			<enumeration value="elliptical"/>
+			<enumeration value="clothoid"/>
+			<enumeration value="conic"/>
+			<enumeration value="polynomialSpline"/>
+			<enumeration value="cubicSpline"/>
+			<enumeration value="rationalSpline"/>
+		</restriction>
+	</simpleType>
+	<complexType name="LineStringSegmentType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="LineStringSegment" type="gml:LineStringSegmentType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>A LineStringSegment is a curve segment that is defined by two or more control points including the start and end point, with linear interpolation between them.
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcStringType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="3" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="numArc" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ArcString" type="gml:ArcStringType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>An ArcString is a curve segment that uses three-point circular arc interpolation (“circularArc3Points”). The number of arcs in the arc string may be explicitly stated in the attribute numArc. The number of control points in the arc string shall be 2 * numArc + 1.
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcType">
+		<complexContent>
+			<restriction base="gml:ArcStringType">
+				<sequence>
+					<choice>
+						<choice minOccurs="3" maxOccurs="3">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+				</sequence>
+				<attribute name="numArc" type="integer" fixed="1"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="Arc" type="gml:ArcType" substitutionGroup="gml:ArcString">
+		<annotation>
+			<documentation>An Arc is an arc string with only one arc unit, i.e. three control points including the start and end point. As arc is an arc string consisting of a single arc, the attribute “numArc” is fixed to "1".</documentation>
+		</annotation>
+	</element>
+	<complexType name="CircleType">
+		<complexContent>
+			<extension base="gml:ArcType"/>
+		</complexContent>
+	</complexType>
+	<element name="Circle" type="gml:CircleType" substitutionGroup="gml:Arc">
+		<annotation>
+			<documentation>A Circle is an arc whose ends coincide to form a simple closed loop. The three control points shall be distinct non-co-linear points for the circle to be unambiguously defined. The arc is simply extended past the third control point until the first control point is encountered.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcStringByBulgeType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="bulge" type="double" maxOccurs="unbounded"/>
+					<element name="normal" type="gml:VectorType" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc2PointWithBulge"/>
+				<attribute name="numArc" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ArcStringByBulge" type="gml:ArcStringByBulgeType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>This variant of the arc computes the mid points of the arcs instead of storing the coordinates directly. The control point sequence consists of the start and end points of each arc plus the bulge (see ISO 19107:2003, 6.4.17.2). The normal is a vector normal (perpendicular) to the chord of the arc (see ISO 19107:2003, 6.4.17.4).
+The interpolation is fixed as "circularArc2PointWithBulge".
+The number of arcs in the arc string may be explicitly stated in the attribute numArc. The number of control points in the arc string shall be numArc + 1.
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcByBulgeType">
+		<complexContent>
+			<restriction base="gml:ArcStringByBulgeType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="2">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="bulge" type="double"/>
+					<element name="normal" type="gml:VectorType"/>
+				</sequence>
+				<attribute name="numArc" type="integer" fixed="1"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="ArcByBulge" type="gml:ArcByBulgeType" substitutionGroup="gml:ArcStringByBulge">
+		<annotation>
+			<documentation>An ArcByBulge is an arc string with only one arc unit, i.e. two control points, one bulge and one normal vector.
+As arc is an arc string consisting of a single arc, the attribute “numArc” is fixed to "1".</documentation>
+		</annotation>
+	</element>
+	<complexType name="ArcByCenterPointType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice>
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="radius" type="gml:LengthType"/>
+					<element name="startAngle" type="gml:AngleType" minOccurs="0"/>
+					<element name="endAngle" type="gml:AngleType" minOccurs="0"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArcCenterPointWithRadius"/>
+				<attribute name="numArc" type="integer" use="required" fixed="1"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ArcByCenterPoint" type="gml:ArcByCenterPointType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>This variant of the arc requires that the points on the arc shall be computed instead of storing the coordinates directly. The single control point is the center point of the arc plus the radius and the bearing at start and end. This representation can be used only in 2D.
+The element radius specifies the radius of the arc.
+The element startAngle specifies the bearing of the arc at the start.
+The element endAngle specifies the bearing of the arc at the end.
+The interpolation is fixed as "circularArcCenterPointWithRadius".
+Since this type describes always a single arc, the attribute “numArc” is fixed to "1".
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CircleByCenterPointType">
+		<complexContent>
+			<restriction base="gml:ArcByCenterPointType">
+				<sequence>
+					<choice>
+						<choice>
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="radius" type="gml:LengthType"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="CircleByCenterPoint" type="gml:CircleByCenterPointType" substitutionGroup="gml:ArcByCenterPoint">
+		<annotation>
+			<documentation>A gml:CircleByCenterPoint is an gml:ArcByCenterPoint with identical start and end angle to form a full circle. Again, this representation can be used only in 2D.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CubicSplineType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="vectorAtStart" type="gml:VectorType"/>
+					<element name="vectorAtEnd" type="gml:VectorType"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="cubicSpline"/>
+				<attribute name="degree" type="integer" fixed="3"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="CubicSpline" type="gml:CubicSplineType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>The number of control points shall be at least three.
+vectorAtStart is the unit tangent vector at the start point of the spline. vectorAtEnd is the unit tangent vector at the end point of the spline. Only the direction of the vectors shall be used to determine the shape of the cubic spline, not their length.
+interpolation is fixed as "cubicSpline".
+degree shall be the degree of the polynomial used for the interpolation in this spline. Therefore the degree for a cubic spline is fixed to "3".
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="BSplineType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<choice minOccurs="0" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="degree" type="nonNegativeInteger"/>
+					<element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" default="polynomialSpline"/>
+				<attribute name="isPolynomial" type="boolean"/>
+				<attribute name="knotType" type="gml:KnotTypesType"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="BSpline" type="gml:BSplineType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>A B-Spline is a piecewise parametric polynomial or rational curve described in terms of control points and basis functions as specified in ISO 19107:2003, 6.4.30. Therefore, interpolation may be either "polynomialSpline" or "rationalSpline" depending on the interpolation type; default is "polynomialSpline".
+degree shall be the degree of the polynomial used for interpolation in this spline.
+knot shall be the sequence of distinct knots used to define the spline basis functions (see ISO 19107:2003, 6.4.26.2).
+The attribute isPolynomial shall be set to “true” if this is a polynomial spline (see ISO 19107:2003, 6.4.30.5).
+The attribute knotType shall provide the type of knot distribution used in defining this spline (see ISO 19107:2003, 6.4.30.4).
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="KnotType">
+		<sequence>
+			<element name="value" type="double"/>
+			<element name="multiplicity" type="nonNegativeInteger"/>
+			<element name="weight" type="double"/>
+		</sequence>
+	</complexType>
+	<complexType name="KnotPropertyType">
+		<annotation>
+			<documentation>gml:KnotPropertyType encapsulates a knot to use it in a geometric type.</documentation>
+		</annotation>
+		<sequence>
+			<element name="Knot" type="gml:KnotType">
+				<annotation>
+					<documentation>A knot is a breakpoint on a piecewise spline curve.
+value is the value of the parameter at the knot of the spline (see ISO 19107:2003, 6.4.24.2).
+multiplicity is the multiplicity of this knot used in the definition of the spline (with the same weight).
+weight is the value of the averaging weight used for this knot of the spline.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<simpleType name="KnotTypesType">
+		<annotation>
+			<documentation>This enumeration type specifies values for the knots’ type (see ISO 19107:2003, 6.4.25).</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="uniform"/>
+			<enumeration value="quasiUniform"/>
+			<enumeration value="piecewiseBezier"/>
+		</restriction>
+	</simpleType>
+	<complexType name="BezierType">
+		<complexContent>
+			<restriction base="gml:BSplineType">
+				<sequence>
+					<choice>
+						<choice minOccurs="0" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep"/>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates"/>
+					</choice>
+					<element name="degree" type="nonNegativeInteger"/>
+					<element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="2"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="polynomialSpline"/>
+				<attribute name="isPolynomial" type="boolean" fixed="true"/>
+				<attribute name="knotType" type="gml:KnotTypesType" use="prohibited"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="Bezier" type="gml:BezierType" substitutionGroup="gml:BSpline">
+		<annotation>
+			<documentation>Bezier curves are polynomial splines that use Bezier or Bernstein polynomials for interpolation purposes. It is a special case of the B-Spline curve with two knots.
+degree shall be the degree of the polynomial used for interpolation in this spline.
+knot shall be the sequence of distinct knots used to define the spline basis functions.
+interpolation is fixed as "polynomialSpline".
+isPolynomial is fixed as “true”.
+knotType is not relevant for Bezier curve segments.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="OffsetCurveType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<element name="offsetBase" type="gml:CurvePropertyType"/>
+					<element name="distance" type="gml:LengthType"/>
+					<element name="refDirection" type="gml:VectorType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="OffsetCurve" type="gml:OffsetCurveType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>An offset curve is a curve at a constant distance from the basis curve. offsetBase is the base curve from which this curve is defined as an offset. distance and refDirection have the same meaning as specified in ISO 19107:2003, 6.4.23.
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AffinePlacementType">
+		<sequence>
+			<element name="location" type="gml:DirectPositionType"/>
+			<element name="refDirection" type="gml:VectorType" maxOccurs="unbounded"/>
+			<element name="inDimension" type="positiveInteger"/>
+			<element name="outDimension" type="positiveInteger"/>
+		</sequence>
+	</complexType>
+	<element name="AffinePlacement" type="gml:AffinePlacementType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>location, refDirection, inDimension and outDimension have the same meaning as specified in ISO 19107:2003, 6.4.21.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ClothoidType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<element name="refLocation">
+						<complexType>
+							<sequence>
+								<element ref="gml:AffinePlacement"/>
+							</sequence>
+						</complexType>
+					</element>
+					<element name="scaleFactor" type="decimal"/>
+					<element name="startParameter" type="double"/>
+					<element name="endParameter" type="double"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="clothoid"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Clothoid" type="gml:ClothoidType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>A clothoid, or Cornu's spiral, is plane curve whose curvature is a fixed function of its length.
+refLocation, startParameter, endParameter and scaleFactor have the same meaning as specified in ISO 19107:2003, 6.4.22.
+interpolation is fixed as "clothoid".
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeodesicStringType">
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<choice>
+					<element ref="gml:posList"/>
+					<group ref="gml:geometricPositionGroup" minOccurs="2" maxOccurs="unbounded"/>
+				</choice>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="geodesic"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="GeodesicString" type="gml:GeodesicStringType" substitutionGroup="gml:AbstractCurveSegment">
+		<annotation>
+			<documentation>A sequence of geodesic segments. 
+The number of control points shall be at least two.
+interpolation is fixed as "geodesic".
+The content model follows the general pattern for the encoding of curve segments.</documentation>
+		</annotation>
+	</element>
+	<complexType name="GeodesicType">
+		<complexContent>
+			<extension base="gml:GeodesicStringType"/>
+		</complexContent>
+	</complexType>
+	<element name="Geodesic" type="gml:GeodesicType" substitutionGroup="gml:GeodesicString"/>
+	<complexType name="SurfaceType">
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:patches"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Surface" type="gml:SurfaceType" substitutionGroup="gml:AbstractSurface">
+		<annotation>
+			<documentation>A Surface is a 2-dimensional primitive and is composed of one or more surface patches as specified in ISO 19107:2003, 6.3.17.1. The surface patches are connected to one another.
+patches encapsulates the patches of the surface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="OrientableSurfaceType">
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:baseSurface"/>
+				</sequence>
+				<attribute name="orientation" type="gml:SignType" default="+"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="baseSurface" type="gml:SurfacePropertyType">
+		<annotation>
+			<documentation>The property baseSurface references or contains the base surface. The property baseSurface either references the base surface via the XLink-attributes or contains the surface element. A surface element is any element which is substitutable for gml:AbstractSurface. The base surface has positive orientation.</documentation>
+		</annotation>
+	</element>
+	<element name="OrientableSurface" type="gml:OrientableSurfaceType" substitutionGroup="gml:AbstractSurface">
+		<annotation>
+			<documentation>OrientableSurface consists of a surface and an orientation. If the orientation is "+", then the OrientableSurface is identical to the baseSurface. If the orientation is "-", then the OrientableSurface is a reference to a gml:AbstractSurface with an up-normal that reverses the direction for this OrientableSurface, the sense of "the top of the surface".</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractSurfacePatchType" abstract="true"/>
+	<element name="AbstractSurfacePatch" type="gml:AbstractSurfacePatchType" abstract="true">
+		<annotation>
+			<documentation>A surface patch defines a homogenuous portion of a surface. 
+The AbstractSurfacePatch element is the abstract head of the substituition group for all surface patch elements describing a continuous portion of a surface.
+All surface patches shall have an attribute interpolation (declared in the types derived from gml:AbstractSurfacePatchType) specifying the interpolation mechanism used for the patch using gml:SurfaceInterpolationType.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SurfacePatchArrayPropertyType">
+		<annotation>
+			<documentation>gml:SurfacePatchArrayPropertyType is a container for a sequence of surface patches.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractSurfacePatch"/>
+		</sequence>
+	</complexType>
+	<element name="patches" type="gml:SurfacePatchArrayPropertyType">
+		<annotation>
+			<documentation>The patches property element contains the sequence of surface patches. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<simpleType name="SurfaceInterpolationType">
+		<annotation>
+			<documentation>gml:SurfaceInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an application schema.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="none"/>
+			<enumeration value="planar"/>
+			<enumeration value="spherical"/>
+			<enumeration value="elliptical"/>
+			<enumeration value="conic"/>
+			<enumeration value="tin"/>
+			<enumeration value="parametricCurve"/>
+			<enumeration value="polynomialSpline"/>
+			<enumeration value="rationalSpline"/>
+			<enumeration value="triangulatedSpline"/>
+		</restriction>
+	</simpleType>
+	<complexType name="PolygonPatchType">
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior" minOccurs="0"/>
+					<element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="PolygonPatch" type="gml:PolygonPatchType" substitutionGroup="gml:AbstractSurfacePatch">
+		<annotation>
+			<documentation>A gml:PolygonPatch is a surface patch that is defined by a set of boundary curves and an underlying surface to which these curves adhere. The curves shall be coplanar and the polygon uses planar interpolation in its interior. 
+interpolation is fixed to "planar", i.e. an interpolation shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TriangleType">
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Triangle" type="gml:TriangleType" substitutionGroup="gml:AbstractSurfacePatch">
+		<annotation>
+			<documentation>gml:Triangle represents a triangle as a surface patch with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring shall be four.
+The ring (element exterior) shall be a gml:LinearRing and shall form a triangle, the first and the last position shall be coincident.
+interpolation is fixed to "planar", i.e. an interpolation shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RectangleType">
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Rectangle" type="gml:RectangleType" substitutionGroup="gml:AbstractSurfacePatch">
+		<annotation>
+			<documentation>gml:Rectangle represents a rectangle as a surface patch with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring shall be five.
+The ring (element exterior) shall be a gml:LinearRing and shall form a rectangle; the first and the last position shall be coincident.
+interpolation is fixed to "planar", i.e. an interpolation shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RingType">
+		<complexContent>
+			<extension base="gml:AbstractRingType">
+				<sequence>
+					<element ref="gml:curveMember" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Ring" type="gml:RingType" substitutionGroup="gml:AbstractRing">
+		<annotation>
+			<documentation>A ring is used to represent a single connected component of a surface boundary as specified in ISO 19107:2003, 6.3.6.
+Every gml:curveMember references or contains one curve, i.e. any element which is substitutable for gml:AbstractCurve. In the context of a ring, the curves describe the boundary of the surface. The sequence of curves shall be contiguous and connected in a cycle.
+If provided, the aggregationType attribute shall have the value “sequence”.</documentation>
+		</annotation>
+	</element>
+	<element name="curveMember" type="gml:CurvePropertyType"/>
+	<complexType name="RingPropertyType">
+		<annotation>
+			<documentation>A property with the content model of gml:RingPropertyType encapsulates a ring to represent a component of a surface boundary.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:Ring"/>
+		</sequence>
+	</complexType>
+	<group name="PointGrid">
+		<annotation>
+			<documentation>A gml:PointGrid group contains or references points or positions which are organised into sequences or grids. All rows shall have the same number of positions (columns).</documentation>
+		</annotation>
+		<sequence>
+			<element name="rows">
+				<complexType>
+					<sequence>
+						<element name="Row" maxOccurs="unbounded">
+							<complexType>
+								<group ref="gml:geometricPositionListGroup"/>
+							</complexType>
+						</element>
+					</sequence>
+				</complexType>
+			</element>
+		</sequence>
+	</group>
+	<complexType name="AbstractParametricCurveSurfaceType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractParametricCurveSurface" type="gml:AbstractParametricCurveSurfaceType" abstract="true" substitutionGroup="gml:AbstractSurfacePatch">
+		<annotation>
+			<documentation>The element provides a substitution group head for the surface patches based on parametric curves. All properties are specified in the derived subtypes. All derived subtypes shall conform to the constraints specified in ISO 19107:2003, 6.4.40.
+If provided, the aggregationType attribute shall have the value “set”.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGriddedSurfaceType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractParametricCurveSurfaceType">
+				<sequence>
+					<group ref="gml:PointGrid"/>
+				</sequence>
+				<attribute name="rows" type="integer"/>
+				<attribute name="columns" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractGriddedSurface" type="gml:AbstractGriddedSurfaceType" abstract="true" substitutionGroup="gml:AbstractParametricCurveSurface">
+		<annotation>
+			<documentation>if provided, rows gives the number of rows, columns the number of columns in the parameter grid. The parameter grid is represented by an instance of the gml:PointGrid group.
+The element provides a substitution group head for the surface patches based on a grid. All derived subtypes shall conform to the constraints specified in ISO 19107:2003, 6.4.41.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ConeType">
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Cone" type="gml:ConeType" substitutionGroup="gml:AbstractGriddedSurface"/>
+	<complexType name="CylinderType">
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Cylinder" type="gml:CylinderType" substitutionGroup="gml:AbstractGriddedSurface"/>
+	<complexType name="SphereType">
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Sphere" type="gml:SphereType" substitutionGroup="gml:AbstractGriddedSurface"/>
+	<complexType name="PolyhedralSurfaceType">
+		<complexContent>
+			<restriction base="gml:SurfaceType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:polygonPatches"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="polygonPatches" type="gml:PolygonPatchArrayPropertyType" substitutionGroup="gml:patches"/>
+	<element name="PolyhedralSurface" type="gml:PolyhedralSurfaceType" substitutionGroup="gml:Surface">
+		<annotation>
+			<documentation>A polyhedral surface is a surface composed of polygon patches connected along their common boundary curves. This differs from the surface type only in the restriction on the types of surface patches acceptable.
+polygonPatches encapsulates the polygon patches of the polyhedral surface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="PolygonPatchArrayPropertyType">
+		<annotation>
+			<documentation>gml:PolygonPatchArrayPropertyType provides a container for an array of polygon patches.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfacePatchArrayPropertyType">
+				<sequence minOccurs="0" maxOccurs="unbounded">
+					<element ref="gml:PolygonPatch"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="TriangulatedSurfaceType">
+		<complexContent>
+			<restriction base="gml:SurfaceType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:trianglePatches"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<element name="trianglePatches" type="gml:TrianglePatchArrayPropertyType" substitutionGroup="gml:patches"/>
+	<element name="TriangulatedSurface" type="gml:TriangulatedSurfaceType" substitutionGroup="gml:Surface">
+		<annotation>
+			<documentation>A triangulated surface is a polyhedral surface that is composed only of triangles. There is no restriction on how the triangulation is derived.
+trianglePatches encapsulates the triangles of the triangulated surface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TrianglePatchArrayPropertyType">
+		<annotation>
+			<documentation>gml:TrianglePatchArrayPropertyType provides a container for an array of triangle patches.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfacePatchArrayPropertyType">
+				<sequence minOccurs="0" maxOccurs="unbounded">
+					<element ref="gml:Triangle"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="TinType">
+		<complexContent>
+			<extension base="gml:TriangulatedSurfaceType">
+				<sequence>
+					<element name="stopLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="breakLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="maxLength" type="gml:LengthType"/>
+					<element name="controlPoint">
+						<complexType>
+							<choice>
+								<element ref="gml:posList"/>
+								<group ref="gml:geometricPositionGroup" minOccurs="3" maxOccurs="unbounded"/>
+							</choice>
+						</complexType>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Tin" type="gml:TinType" substitutionGroup="gml:TriangulatedSurface">
+		<annotation>
+			<documentation>A tin is a triangulated surface that uses the Delauny algorithm or a similar algorithm complemented with consideration of stoplines (stopLines), breaklines (breakLines), and maximum length of triangle sides (maxLength). controlPoint shall contain a set of the positions (three or more) used as posts for this TIN (corners of the triangles in the TIN). See ISO 19107:2003, 6.4.39 for details.</documentation>
+		</annotation>
+	</element>
+	<complexType name="LineStringSegmentArrayPropertyType">
+		<annotation>
+			<documentation>gml:LineStringSegmentArrayPropertyType provides a container for line strings.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:LineStringSegment"/>
+		</sequence>
+	</complexType>
+	<complexType name="AbstractSolidType">
+		<annotation>
+			<documentation>gml:AbstractSolidType is an abstraction of a solid to support the different levels of complexity. The solid may always be viewed as a geometric primitive, i.e. is contiguous.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractSolid" type="gml:AbstractSolidType" abstract="true" substitutionGroup="gml:AbstractGeometricPrimitive">
+		<annotation>
+			<documentation>The AbstractSolid element is the abstract head of the substituition group for all (continuous) solid elements.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SolidPropertyType">
+		<annotation>
+			<documentation>A property that has a solid as its value domain may either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element shall be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="solidProperty" type="gml:SolidPropertyType">
+		<annotation>
+			<documentation>This property element either references a solid via the XLink-attributes or contains the solid element. solidProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for AbstractSolid.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SolidArrayPropertyType">
+		<annotation>
+			<documentation>gml:SolidArrayPropertyType is a container for an array of solids. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="solidArrayProperty" type="gml:SolidArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of solid elements. solidArrayProperty is the predefined property which may be used by GML Application Schemas whenever a GML feature has a property with a value that is substitutable for a list of AbstractSolid.</documentation>
+		</annotation>
+	</element>
+	<complexType name="SolidType">
+		<complexContent>
+			<extension base="gml:AbstractSolidType">
+				<sequence>
+					<element name="exterior" type="gml:ShellPropertyType" minOccurs="0"/>
+					<element name="interior" type="gml:ShellPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Solid" type="gml:SolidType" substitutionGroup="gml:AbstractSolid">
+		<annotation>
+			<documentation>A solid is the basis for 3-dimensional geometry. The extent of a solid is defined by the boundary surfaces as specified in ISO 19107:2003, 6.3.18. exterior specifies the outer boundary, interior the inner boundary of the solid.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ShellType">
+		<sequence>
+			<element ref="gml:surfaceMember" maxOccurs="unbounded"/>
+		</sequence>
+		<attributeGroup ref="gml:AggregationAttributeGroup"/>
+	</complexType>
+	<element name="Shell" type="gml:ShellType" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>A shell is used to represent a single connected component of a solid boundary as specified in ISO 19107:2003, 6.3.8.
+Every gml:surfaceMember references or contains one surface, i.e. any element which is substitutable for gml:AbstractSurface. In the context of a shell, the surfaces describe the boundary of the solid. 
+If provided, the aggregationType attribute shall have the value “set”.
+</documentation>
+		</annotation>
+	</element>
+	<element name="surfaceMember" type="gml:SurfacePropertyType">
+		<annotation>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. A surface element is any element, which is substitutable for gml:AbstractSurface.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ShellPropertyType">
+		<annotation>
+			<documentation>A property with the content model of gml:ShellPropertyType encapsulates a shell to represent a component of a solid boundary.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:Shell"/>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/gml.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/gml.xsd
new file mode 100644
index 0000000..64a8d3e
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/gml.xsd
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:gml:3.2.0">gml.xsd</appinfo>
+	</annotation>
+	<!-- ====================================================================== -->
+	<include schemaLocation="dynamicFeature.xsd"/>
+	<include schemaLocation="topology.xsd"/>
+	<include schemaLocation="coverage.xsd"/>
+	<include schemaLocation="coordinateReferenceSystems.xsd"/>
+	<include schemaLocation="observation.xsd"/>
+	<include schemaLocation="temporalReferenceSystems.xsd"/>
+	<!-- ====================================================================== -->
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/gmlBase.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/gmlBase.xsd
new file mode 100644
index 0000000..ddb0b1c
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/gmlBase.xsd
@@ -0,0 +1,305 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:gmlBase:3.2.0">gmlBase.xsd</appinfo>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:gmlBase:3.2.0">
+			<sch:title>Schematron validation</sch:title>
+			<sch:ns prefix="gml" uri="http://www.opengis.net/gml"/>
+			<sch:ns prefix="xlink" uri="http://www.w3.org/1999/xlink"/>
+			<sch:pattern name="Check either href or content not both">
+				<sch:rule abstract="true" id="hrefOrContent">
+					<sch:report test="@xlink:href and (*|text())">Property element may not carry both a reference to an object and contain an object.</sch:report>
+					<sch:assert test="@xlink:href | (*|text())">Property element must either carry a reference to an object or contain an object.</sch:assert>
+				</sch:rule>
+			</sch:pattern>
+		</appinfo>
+		<documentation>See ISO/DIS 19136 7.2.
+The gmlBase schema components establish the GML model and syntax, in particular
+-	a root XML type from which XML types for all GML objects should be derived,
+-	a pattern and components for GML properties,
+-	patterns for collections and arrays, and components for generic collections and arrays,
+-	components for associating metadata with GML objects,
+-	components for constructing definitions and dictionaries.</documentation>
+	</annotation>
+	<include schemaLocation="basicTypes.xsd"/>
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="../../../../../../../../../../pycsw/schemas/w3c/1999/xlink.xsd"/>
+	<element name="AbstractObject" abstract="true">
+		<annotation>
+			<documentation>This element has no type defined, and is therefore implicitly (according to the rules of W3C XML Schema) an XML Schema anyType. It is used as the head of an XML Schema substitution group which unifies complex content and certain simple content elements used for datatypes in GML, including the gml:AbstractGML substitution group.</documentation>
+		</annotation>
+	</element>
+	<element name="AbstractGML" type="gml:AbstractGMLType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>The abstract element gml:AbstractGML is “any GML object having identity”.   It acts as the head of an XML Schema substitution group, which may include any element which is a GML feature, or other object, with identity.  This is used as a variable in content models in GML core and application schemas.  It is effectively an abstract superclass for all GML objects.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractGMLType" abstract="true">
+		<sequence>
+			<group ref="gml:StandardObjectProperties"/>
+		</sequence>
+		<attribute ref="gml:id" use="required"/>
+	</complexType>
+	<group name="StandardObjectProperties">
+		<sequence>
+			<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+			<element ref="gml:description" minOccurs="0"/>
+			<element ref="gml:descriptionReference" minOccurs="0"/>
+			<element ref="gml:identifier" minOccurs="0"/>
+			<element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</group>
+	<attributeGroup name="AssociationAttributeGroup">
+		<annotation>
+			<documentation>XLink components are the standard method to support hypertext referencing in XML. An XML Schema attribute group, gml:AssociationAttributeGroup, is provided to support the use of Xlinks as the method for indicating the value of a property by reference in a uniform manner in GML.</documentation>
+		</annotation>
+		<attributeGroup ref="xlink:simpleAttrs"/>
+		<attribute name="nilReason" type="gml:NilReasonType"/>
+		<attribute ref="gml:remoteSchema"/>
+	</attributeGroup>
+	<attribute name="remoteSchema" type="anyURI">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</attribute>
+	<element name="abstractAssociationRole" type="gml:AssociationRoleType" abstract="true">
+		<annotation>
+			<documentation>Applying this pattern shall restrict the multiplicity of objects in a property element using this content model to exactly one. An instance of this type shall contain an element representing an object, or serve as a pointer to a remote object.
+Applying the pattern to define an application schema specific property type allows to restrict
+-	the inline object to specified object types, 
+-	the encoding to „by-reference only“ (see 7.2.3.7),
+-	the encoding to „inline only“ (see 7.2.3.8).</documentation>
+		</annotation>
+	</element>
+	<complexType name="AssociationRoleType">
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractObject"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<attributeGroup name="OwnershipAttributeGroup">
+		<annotation>
+			<documentation>Encoding a GML property inline vs. by-reference shall not imply anything about the “ownership” of the contained or referenced GML Object, i.e. the encoding style shall not imply any “deep-copy” or “deep-delete” semantics. To express ownership over the contained or referenced GML Object, the gml:OwnershipAttributeGroup attribute group may be added to object-valued property elements. If the attribute group is not part of the content model of such a property element, then  [...]
+When the value of the owns attribute is "true", the existence of inline or referenced object(s) depends upon the existence of the parent object.</documentation>
+		</annotation>
+		<attribute name="owns" type="boolean" default="false"/>
+	</attributeGroup>
+	<element name="abstractStrictAssociationRole" type="gml:AssociationRoleType" abstract="true">
+		<annotation>
+			<documentation>This element shows how an element 
+	declaration may include a Schematron constraint to limit the property to act 
+	in either inline or by-reference mode, but not both.</documentation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:abstractStrictAssociationRole">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<element name="abstractReference" type="gml:ReferenceType" abstract="true">
+		<annotation>
+			<documentation>gml:abstractReference may be used as the head of a subtitution group of more specific elements providing a value by-reference.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ReferenceType">
+		<annotation>
+			<documentation>gml:ReferenceType is intended to be used in application schemas directly, if a property element shall use a “by-reference only” encoding.</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="abstractInlineProperty" type="gml:InlinePropertyType" abstract="true">
+		<annotation>
+			<documentation>gml:abstractInlineProperty may be used as the head of a subtitution group of more specific elements providing a value inline.</documentation>
+		</annotation>
+	</element>
+	<complexType name="InlinePropertyType">
+		<sequence>
+			<element ref="gml:AbstractObject"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="reversePropertyName" type="string">
+		<annotation>
+			<documentation>If the value of an object property is another object and that object contains also a property for the association between the two objects, then this name of the reverse property may be encoded in a gml:reversePropertyName element in an appinfo annotation of the property element to document the constraint between the two properties. The value of the element shall contain the qualified name of the property element.</documentation>
+		</annotation>
+	</element>
+	<element name="member" type="gml:AssociationRoleType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ArrayAssociationType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence>
+			<element ref="gml:AbstractObject" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="members" type="gml:ArrayAssociationType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="StringOrRefType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<element name="metaDataProperty" type="gml:MetaDataPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<element name="description" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>The value of this property is a text description of the object. gml:description uses gml:StringOrRefType as its content model, so it may contain a simple text string content, or carry a reference to an external description. The use of gml:description to reference an external description has been deprecated and replaced by the gml:descriptionReference property.</documentation>
+		</annotation>
+	</element>
+	<element name="descriptionReference" type="gml:ReferenceType">
+		<annotation>
+			<documentation>The value of this property is a remote text description of the object. The xlink:href attribute of the gml:descriptionReference property references the external description.</documentation>
+		</annotation>
+	</element>
+	<element name="name" type="gml:CodeType">
+		<annotation>
+			<documentation>The gml:name property provides a label or identifier for the object, commonly a descriptive name. An object may have several names, typically assigned by different authorities. gml:name uses the gml:CodeType content model.  The authority for a name is indicated by the value of its (optional) codeSpace attribute.  The name may or may not be unique, as determined by the rules of the organization responsible for the codeSpace.  In common usage there will be one name per au [...]
+		</annotation>
+	</element>
+	<element name="identifier" type="gml:CodeWithAuthorityType">
+		<annotation>
+			<documentation>Often, a special identifier is assigned to an object by the maintaining authority with the intention that it is used in references to the object For such cases, the codeSpace shall be provided. That identifier is usually unique either globally or within an application domain. gml:identifier is a pre-defined property for such identifiers.</documentation>
+		</annotation>
+	</element>
+	<attribute name="id" type="ID">
+		<annotation>
+			<documentation>The attribute gml:id supports provision of a handle for the XML element representing a GML Object. Its use is mandatory for all GML objects. It is of XML type ID, so is constrained to be unique in the XML document within which it occurs.</documentation>
+		</annotation>
+	</attribute>
+	<complexType name="AbstractMemberType" abstract="true">
+		<annotation>
+			<documentation>To create a collection of GML Objects that are not all features, a property type shall be derived by extension from gml:AbstractMemberType.
+This abstract property type is intended to be used only in object types where software shall be able to identify that an instance of such an object type is to be interpreted as a collection of objects.
+By default, this abstract property type does not imply any ownership of the objects in the collection. The owns attribute of gml:OwnershipAttributeGroup may be used on a property element instance to assert ownership of an object in the collection. A collection shall not own an object already owned by another object.
+</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<attributeGroup name="AggregationAttributeGroup">
+		<annotation>
+			<documentation>A GML Object Collection is any GML Object with a property element in its content model whose content model is derived by extension from gml:AbstractMemberType.
+In addition, the complex type describing the content model of the GML Object Collection may also include a reference to the attribute group gml:AggregationAttributeGroup to provide additional information about the semantics of the object collection.  This information may be used by applications to group GML objects, and optionally to order and index them.
+The allowed values for the aggregationType attribute are defined by gml:AggregationType. See 8.4 of ISO/IEC 11404:1996 for the meaning of the values in the enumeration.</documentation>
+		</annotation>
+		<attribute name="aggregationType" type="gml:AggregationType"/>
+	</attributeGroup>
+	<simpleType name="AggregationType" final="#all">
+		<restriction base="string">
+			<enumeration value="set"/>
+			<enumeration value="bag"/>
+			<enumeration value="sequence"/>
+			<enumeration value="array"/>
+			<enumeration value="record"/>
+			<enumeration value="table"/>
+		</restriction>
+	</simpleType>
+	<element name="Bag" type="gml:BagType" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="BagType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:member" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:members" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Array" type="gml:ArrayType" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ArrayType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:members" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="AbstractMetadataPropertyType" abstract="true">
+		<annotation>
+			<documentation>To associate metadata described by any XML Schema with a GML object, a property element shall be defined whose content model is derived by extension from gml:AbstractMetadataPropertyType. 
+The value of such a property shall be metadata. The content model of such a property type, i.e. the metadata application schema shall be specified by the GML Application Schema.
+By default, this abstract property type does not imply any ownership of the metadata. The owns attribute of gml:OwnershipAttributeGroup may be used on a metadata property element instance to assert ownership of the metadata. 
+If metadata following the conceptual model of ISO 19115 is to be encoded in a GML document, the corresponding Implementation Specification specified in ISO/TS 19139 shall be used to encode the metadata information.
+</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="MetaDataPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractMetaData"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attribute name="about" type="anyURI"/>
+	</complexType>
+	<element name="AbstractMetaData" type="gml:AbstractMetaDataType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="AbstractMetaDataType" abstract="true" mixed="true">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence/>
+		<attribute ref="gml:id"/>
+	</complexType>
+	<element name="GenericMetaData" type="gml:GenericMetaDataType" substitutionGroup="gml:AbstractMetaData">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="GenericMetaDataType" mixed="true">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<complexContent mixed="true">
+			<extension base="gml:AbstractMetaDataType">
+				<sequence>
+					<any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="targetElement" type="string"/>
+	<element name="associationName" type="string"/>
+	<element name="defaultCodeSpace" type="anyURI"/>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/grids.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/grids.xsd
new file mode 100644
index 0000000..e1198ea
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/grids.xsd
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:grids:3.2.0">grids.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 20.2.
+An implicit description of geometry is one in which the items of the geometry do not explicitly appear in the encoding.  Instead, a compact notation records a set of parameters, and a set of objects may be generated using a rule with these parameters.  This Clause provides grid geometries that are used in the description of gridded coverages and other applications.
+In GML two grid structures are defined, namely gml:Grid and gml:RectifiedGrid.</documentation>
+	</annotation>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<element name="Grid" type="gml:GridType" substitutionGroup="gml:AbstractImplicitGeometry">
+		<annotation>
+			<documentation>The gml:Grid implicitly defines an unrectified grid, which is a network composed of two or more sets of curves in which the members of each set intersect the members of the other sets in an algorithmic way.  The region of interest within the grid is given in terms of its gml:limits, being the grid coordinates of  diagonally opposed corners of a rectangular region.  gml:axisLabels is provided with a list of labels of the axes of the grid (gml:axisName has been deprecated [...]
+The gml:limits element contains a single gml:GridEnvelope. The gml:low and gml:high property elements of the envelope are each integerLists, which are coordinate tuples, the coordinates being measured as offsets from the origin of the grid along each axis, of the diagonally opposing corners of a “rectangular” region of interest.</documentation>
+		</annotation>
+	</element>
+	<element name="AbstractImplicitGeometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:AbstractGeometry"/>
+	<complexType name="GridType">
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<sequence>
+					<element name="limits" type="gml:GridLimitsType"/>
+					<choice>
+						<element name="axisLabels" type="gml:NCNameList"/>
+						<element name="axisName" type="string" maxOccurs="unbounded"/>
+					</choice>
+				</sequence>
+				<attribute name="dimension" type="positiveInteger" use="required"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="GridLimitsType">
+		<sequence>
+			<element name="GridEnvelope" type="gml:GridEnvelopeType"/>
+		</sequence>
+	</complexType>
+	<complexType name="GridEnvelopeType">
+		<sequence>
+			<element name="low" type="gml:integerList"/>
+			<element name="high" type="gml:integerList"/>
+		</sequence>
+	</complexType>
+	<element name="RectifiedGrid" type="gml:RectifiedGridType" substitutionGroup="gml:Grid">
+		<annotation>
+			<documentation>A rectified grid is a grid for which there is an affine transformation between the grid coordinates and the coordinates of an external coordinate reference system. It is defined by specifying the position (in some geometric space) of the grid “origin” and of the vectors that specify the post locations.
+Note that the grid limits (post indexes) and axis name properties are inherited from gml:GridType and that gml:RectifiedGrid adds a gml:origin property (contains or references a gml:Point) and a set of gml:offsetVector properties.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RectifiedGridType">
+		<complexContent>
+			<extension base="gml:GridType">
+				<sequence>
+					<element name="origin" type="gml:PointPropertyType"/>
+					<element name="offsetVector" type="gml:VectorType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/measures.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/measures.xsd
new file mode 100644
index 0000000..ff158de
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/measures.xsd
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.2.0" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:measures:3.2.0">measures.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 17.3.
+gml:MeasureType is defined in the basicTypes schema.  The measure types defined here correspond with a set of convenience measure types described in ISO/TS 19103.  The XML implementation is based on the XML Schema simple type “double” which supports both decimal and scientific notation, and includes an XML attribute “uom” which refers to the units of measure for the value.  Note that, there is no requirement to store values using any particular format, and applications receiving elements [...]
+</documentation>
+	</annotation>
+	<include schemaLocation="units.xsd"/>
+	<element name="measure" type="gml:MeasureType">
+		<annotation>
+			<documentation>The value of a physical quantity, together with its unit.</documentation>
+		</annotation>
+	</element>
+	<complexType name="LengthType">
+		<annotation>
+			<documentation>This is a prototypical definition for a specific measure type defined as a vacuous extension (i.e. aliases) of gml:MeasureType. In this case, the content model supports the description of a length (or distance) quantity, with its units. The unit of measure referenced by uom shall be suitable for a length, such as metres or feet.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="ScaleType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="TimeType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="GridLengthType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="AreaType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="VolumeType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="SpeedType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<complexType name="AngleType">
+		<simpleContent>
+			<extension base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<element name="angle" type="gml:AngleType">
+		<annotation>
+			<documentation>The gml:angle property element is used to record the value of an angle quantity as a single number, with its units.</documentation>
+		</annotation>
+	</element>
+	<element name="dmsAngle" type="gml:DMSAngleType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DMSAngleType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<sequence>
+			<element ref="gml:degrees"/>
+			<choice minOccurs="0">
+				<element ref="gml:decimalMinutes"/>
+				<sequence>
+					<element ref="gml:minutes"/>
+					<element ref="gml:seconds" minOccurs="0"/>
+				</sequence>
+			</choice>
+		</sequence>
+	</complexType>
+	<element name="degrees" type="gml:DegreesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<complexType name="DegreesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:DegreeValueType">
+				<attribute name="direction">
+					<simpleType>
+						<restriction base="string">
+							<enumeration value="N"/>
+							<enumeration value="E"/>
+							<enumeration value="S"/>
+							<enumeration value="W"/>
+							<enumeration value="+"/>
+							<enumeration value="-"/>
+						</restriction>
+					</simpleType>
+				</attribute>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="DegreeValueType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="nonNegativeInteger">
+			<maxInclusive value="359"/>
+		</restriction>
+	</simpleType>
+	<element name="decimalMinutes" type="gml:DecimalMinutesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<simpleType name="DecimalMinutesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="decimal">
+			<minInclusive value="0.00"/>
+			<maxExclusive value="60.00"/>
+		</restriction>
+	</simpleType>
+	<element name="minutes" type="gml:ArcMinutesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<simpleType name="ArcMinutesType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="nonNegativeInteger">
+			<maxInclusive value="59"/>
+		</restriction>
+	</simpleType>
+	<element name="seconds" type="gml:ArcSecondsType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+	</element>
+	<simpleType name="ArcSecondsType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="decimal">
+			<minInclusive value="0.00"/>
+			<maxExclusive value="60.00"/>
+		</restriction>
+	</simpleType>
+	<complexType name="AngleChoiceType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<choice>
+			<element ref="gml:angle"/>
+			<element ref="gml:dmsAngle"/>
+		</choice>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/observation.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/observation.xsd
new file mode 100644
index 0000000..e723885
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/observation.xsd
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:observation:3.2.0">observation.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 19.
+A GML observation models the act of observing, often with a camera, a person or some form of instrument.  An observation feature describes the “metadata” associated with an information capture event, together with a value for the result of the observation.  This covers a broad range of cases, from a tourist photo (not the photo but the act of taking the photo), to images acquired by space borne sensors or the measurement of a temperature 5 meters below the surfaces of a lake.
+The basic structures introduced in this schema are intended to serve as the foundation for more comprehensive schemas for scientific, technical and engineering measurement schemas.
+</documentation>
+	</annotation>
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="direction.xsd"/>
+	<include schemaLocation="valueObjects.xsd"/>
+	<element name="Observation" type="gml:ObservationType" substitutionGroup="gml:AbstractFeature">
+		<annotation>
+			<documentation>The content model is a straightforward extension of gml:AbstractFeatureType; it automatically has the gml:identifier, gml:description, gml:descriptionReference, gml:name, and gml:boundedBy properties. 
+The gml:validTime element describes the time of the observation. Note that this may be a time instant or a time period.
+The gml:using property contains or references a description of a sensor, instrument or procedure used for the observation.
+The gml:target property contains or references the specimen, region or station which is the object of the observation. This property is particularly useful for remote observations, such as photographs, where a generic location property might apply to the location of the camera or the location of the field of view, and thus may be ambiguous.  
+The gml:subject element is provided as a convenient synonym for gml:target. This is the term commonly used in phtotography.  
+The gml:resultOf property indicates the result of the observation.  The value may be inline, or a reference to a value elsewhere. If the value is inline, it shall be a member of the gml:AbstractObject substitution group.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="ObservationType">
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:validTime"/>
+					<element ref="gml:using" minOccurs="0"/>
+					<element ref="gml:target" minOccurs="0"/>
+					<element ref="gml:resultOf"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="using" type="gml:ProcedurePropertyType"/>
+	<complexType name="ProcedurePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractFeature"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="target" type="gml:TargetPropertyType"/>
+	<element name="subject" type="gml:TargetPropertyType" substitutionGroup="gml:target"/>
+	<complexType name="TargetPropertyType">
+		<choice minOccurs="0">
+			<element ref="gml:AbstractFeature"/>
+			<element ref="gml:AbstractGeometry"/>
+		</choice>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="resultOf" type="gml:ResultType"/>
+	<complexType name="ResultType">
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractObject"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="DirectedObservation" type="gml:DirectedObservationType" substitutionGroup="gml:Observation">
+		<annotation>
+			<documentation>A gml:DirectedObservation is the same as an observation except that it adds an additional gml:direction property. This is the direction in which the observation was acquired. Clearly this applies only to certain types of observations such as visual observations by people, or observations obtained from terrestrial cameras.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectedObservationType">
+		<complexContent>
+			<extension base="gml:ObservationType">
+				<sequence>
+					<element ref="gml:direction"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="DirectedObservationAtDistance" type="gml:DirectedObservationAtDistanceType" substitutionGroup="gml:DirectedObservation">
+		<annotation>
+			<documentation>gml:DirectedObservationAtDistance adds an additional distance property. This is the distance from the observer to the subject of the observation. Clearly this applies only to certain types of observations such as visual observations by people, or observations obtained from terrestrial cameras.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectedObservationAtDistanceType">
+		<complexContent>
+			<extension base="gml:DirectedObservationType">
+				<sequence>
+					<element name="distance" type="gml:MeasureType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/referenceSystems.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/referenceSystems.xsd
new file mode 100644
index 0000000..0ded933
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/referenceSystems.xsd
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0" xml:lang="en" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:referenceSystems:3.2.0">referenceSystems.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 13.2.
+The reference systems schema components have two logical parts, which define elements and types for XML encoding of the definitions of:
+-	Identified Object, inherited by the ten types of GML objects used for coordinate reference systems and coordinate operations
+-	High-level part of the definitions of coordinate reference systems
+This schema encodes the Identified Object and Reference System packages of the UML Model for ISO 19111.</documentation>
+	</annotation>
+	<include schemaLocation="dictionary.xsd"/>
+	<import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/gmd.xsd"/>
+	<complexType name="IdentifiedObjectType" abstract="true">
+		<annotation>
+			<documentation>gml:IdentifiedObjectType provides identification properties of a CRS-related object. In gml:DefinitionType, the gml:identifier element shall be the primary name by which this object is identified, encoding the "name" attribute in the UML model.
+Zero or more of the gml:name elements can be an unordered set of "identifiers", encoding the "identifier" attribute in the UML model. Each of these gml:name elements can reference elsewhere the object's defining information or be an identifier by which this object can be referenced.
+Zero or more other gml:name elements can be an unordered set of "alias" alternative names by which this CRS related object is identified, encoding the "alias" attributes in the UML model. An object may have several aliases, typically used in different contexts. The context for an alias is indicated by the value of its (optional) codeSpace attribute.
+Any needed version information shall be included in the codeSpace attribute of a gml:identifier and gml:name elements. In this use, the gml:remarks element in the gml:DefinitionType shall contain comments on or information about this object, including data source information.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractCRS" type="gml:AbstractCRSType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>gml:AbstractCRS specifies a coordinate reference system which is usually single but may be compound. This abstract complex type shall not be used, extended, or restricted, in a GML Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractCRSType" abstract="true">
+		<complexContent>
+			<extension base="gml:IdentifiedObjectType">
+				<sequence>
+					<element ref="gml:domainOfValidity" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:scope" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="domainOfValidity">
+		<annotation>
+			<documentation>The gml:domainOfValidity property implements an association role to an EX_Extent object as encoded in ISO/TS 19139, either referencing or containing the definition of that extent.</documentation>
+		</annotation>
+		<complexType>
+			<sequence minOccurs="0">
+				<element ref="gmd:EX_Extent"/>
+			</sequence>
+			<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		</complexType>
+	</element>
+	<element name="scope" type="string">
+		<annotation>
+			<documentation>The gml:scope property provides a description of the usage, or limitations of usage, for which this CRS-related object is valid. If unknown, enter "not known".</documentation>
+		</annotation>
+	</element>
+	<complexType name="CRSPropertyType">
+		<annotation>
+			<documentation>gml:CRSPropertyType is a property type for association roles to a CRS abstract coordinate reference system, either referencing or containing the definition of that CRS.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="crsRef" type="gml:CRSPropertyType">
+		<annotation>
+			<documentation>gml:crsRef is an association role either referencing or containing the definition of a CRS. This property element has been deprecated.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/temporal.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/temporal.xsd
new file mode 100644
index 0000000..b38bd5a
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/temporal.xsd
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:temporal:3.2.0">temporal.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 15.2.
+The GML temporal schemas include components for describing temporal geometry and topology, temporal reference systems, and the temporal characteristics of geographic data. The model underlying the representation constitutes a profile of the conceptual schema described in ISO 19108. The underlying spatiotemporal model strives to accommodate both feature-level and attribute-level time stamping; basic support for tracking moving objects is also included. 
+Time is measured on two types of scales: interval and ordinal.  An interval scale offers a basis for measuring duration, an ordinal scale provides information only about relative position in time.
+Two other ISO standards are relevant to describing temporal objects:  ISO 8601 describes encodings for time instants and time periods, as text strings with particular structure and punctuation; ISO 11404 provides a detailed description of time intervals as part of a general discussion of language independent datatypes.  
+The temporal schemas cover two interrelated topics and provide basic schema components for representing temporal instants and periods, temporal topology, and reference systems; more specialized schema components defines components used for dynamic features. Instances of temporal geometric types are used as values for the temporal properties of geographic features. </documentation>
+	</annotation>
+	<include schemaLocation="gmlBase.xsd"/>
+	<element name="AbstractTimeObject" type="gml:AbstractTimeObjectType" abstract="true" substitutionGroup="gml:AbstractGML">
+		<annotation>
+			<documentation>gml:AbstractTimeObject acts as the head of a substitution group for all temporal primitives and complexes.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeObjectType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractGMLType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTimePrimitive" type="gml:AbstractTimePrimitiveType" abstract="true" substitutionGroup="gml:AbstractTimeObject">
+		<annotation>
+			<documentation>gml:AbstractTimePrimitive acts as the head of a substitution group for geometric and topological temporal primitives.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimePrimitiveType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimeObjectType">
+				<sequence>
+					<element name="relatedTime" type="gml:RelatedTimeType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimePrimitivePropertyType">
+		<annotation>
+			<documentation>gml:TimePrimitivePropertyType provides a standard content model for associations between an arbitrary member of the substitution group whose head is gml:AbstractTimePrimitive and another object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractTimePrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="validTime" type="gml:TimePrimitivePropertyType">
+		<annotation>
+			<documentation>gml:validTime is a convenience property element.</documentation>
+		</annotation>
+	</element>
+	<complexType name="RelatedTimeType">
+		<annotation>
+			<documentation>gml:RelatedTimeType provides a content model for indicating the relative position of an arbitrary member of the substitution group whose head is gml:AbstractTimePrimitive. It extends the generic gml:TimePrimitivePropertyType with an XML attribute relativePosition, whose value is selected from the set of 13 temporal relationships identified by Allen (1983)</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:TimePrimitivePropertyType">
+				<attribute name="relativePosition">
+					<simpleType>
+						<restriction base="string">
+							<enumeration value="Before"/>
+							<enumeration value="After"/>
+							<enumeration value="Begins"/>
+							<enumeration value="Ends"/>
+							<enumeration value="During"/>
+							<enumeration value="Equals"/>
+							<enumeration value="Contains"/>
+							<enumeration value="Overlaps"/>
+							<enumeration value="Meets"/>
+							<enumeration value="OverlappedBy"/>
+							<enumeration value="MetBy"/>
+							<enumeration value="BegunBy"/>
+							<enumeration value="EndedBy"/>
+						</restriction>
+					</simpleType>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTimeComplex" type="gml:AbstractTimeComplexType" abstract="true" substitutionGroup="gml:AbstractTimeObject">
+		<annotation>
+			<documentation>gml:AbstractTimeComplex is an aggregation of temporal primitives and acts as the head of a substitution group for temporal complexes.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeComplexType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimeObjectType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTimeGeometricPrimitive" type="gml:AbstractTimeGeometricPrimitiveType" abstract="true" substitutionGroup="gml:AbstractTimePrimitive">
+		<annotation>
+			<documentation>gml:TimeGeometricPrimitive acts as the head of a substitution group for geometric temporal primitives.
+A temporal geometry shall be associated with a temporal reference system through the frame attribute that provides a URI reference that identifies a description of the reference system. Following ISO 19108, the Gregorian calendar with UTC is the default reference system, but others may also be used. The GPS calendar is an alternative reference systems in common use.
+The two geometric primitives in the temporal dimension are the instant and the period. GML components are defined to support these as follows.</documentation>
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeGeometricPrimitiveType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimePrimitiveType">
+				<attribute name="frame" type="anyURI" default="#ISO-8601"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeInstant" type="gml:TimeInstantType" substitutionGroup="gml:AbstractTimeGeometricPrimitive">
+		<annotation>
+			<documentation>gml:TimeInstant acts as a zero-dimensional geometric primitive that represents an identifiable position in time.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeInstantType" final="#all">
+		<complexContent>
+			<extension base="gml:AbstractTimeGeometricPrimitiveType">
+				<sequence>
+					<element ref="gml:timePosition"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeInstantPropertyType">
+		<annotation>
+			<documentation>gml:TimeInstantPropertyType provides for associating a gml:TimeInstant with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeInstant"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="TimePeriod" type="gml:TimePeriodType" substitutionGroup="gml:AbstractTimeGeometricPrimitive">
+		<annotation>
+			<documentation>gml:TimePeriod acts as a one-dimensional geometric primitive that represents an identifiable extent in time.
+The location in of a gml:TimePeriod is described by the temporal positions of the instants at which it begins and ends. The length of the period is equal to the temporal distance between the two bounding temporal positions. 
+Both beginning and end may be described in terms of their direct position using gml:TimePositionType which is an XML Schema simple content type, or by reference to an indentifiable time instant using gml:TimeInstantPropertyType.
+Alternatively a limit of a gml:TimePeriod may use the conventional GML property model to make a reference to a time instant described elsewhere, or a limit may be indicated as a direct position.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimePeriodType">
+		<complexContent>
+			<extension base="gml:AbstractTimeGeometricPrimitiveType">
+				<sequence>
+					<choice>
+						<element name="beginPosition" type="gml:TimePositionType"/>
+						<element name="begin" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<choice>
+						<element name="endPosition" type="gml:TimePositionType"/>
+						<element name="end" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<group ref="gml:timeLength" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimePeriodPropertyType">
+		<annotation>
+			<documentation>gml:TimePeriodPropertyType provides for associating a gml:TimePeriod with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimePeriod"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="TimePositionType" final="#all">
+		<annotation>
+			<documentation>The method for identifying a temporal position is specific to each temporal reference system.  gml:TimePositionType supports the description of temporal position according to the subtypes described in ISO 19108.
+Values based on calendars and clocks use lexical formats that are based on ISO 8601, as described in XML Schema Part 2:2001. A decimal value may be used with coordinate systems such as GPS time or UNIX time. A URI may be used to provide a reference to some era in an ordinal reference system . 
+In common with many of the components modelled as data types in the ISO 19100 series of International Standards, the corresponding GML component has simple content. However, the content model gml:TimePositionType is defined in several steps.
+Three XML attributes appear on gml:TimePositionType:
+A time value shall be associated with a temporal reference system through the frame attribute that provides a URI reference that identifies a description of the reference system. Following ISO 19108, the Gregorian calendar with UTC is the default reference system, but others may also be used. Components for describing temporal reference systems are described in 14.4, but it is not required that the reference system be described in this, as the reference may refer to anything that may be  [...]
+For time values using a calendar containing more than one era, the (optional) calendarEraName attribute provides the name of the calendar era.  
+Inexact temporal positions may be expressed using the optional indeterminatePosition attribute.  This takes a value from an enumeration.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:TimePositionUnion">
+				<attribute name="frame" type="anyURI" default="#ISO-8601"/>
+				<attribute name="calendarEraName" type="string"/>
+				<attribute name="indeterminatePosition" type="gml:TimeIndeterminateValueType"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="TimeIndeterminateValueType">
+		<annotation>
+			<documentation>These values are interpreted as follows: 
+-	“unknown” indicates that no specific value for temporal position is provided.
+-	“now” indicates that the specified value shall be replaced with the current temporal position whenever the value is accessed.
+-	“before” indicates that the actual temporal position is unknown, but it is known to be before the specified value.
+-	“after” indicates that the actual temporal position is unknown, but it is known to be after the specified value.
+A value for indeterminatePosition may 
+-	be used either alone, or 
+-	qualify a specific value for temporal position.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="after"/>
+			<enumeration value="before"/>
+			<enumeration value="now"/>
+			<enumeration value="unknown"/>
+		</restriction>
+	</simpleType>
+	<simpleType name="TimePositionUnion">
+		<annotation>
+			<documentation>The simple type gml:TimePositionUnion is a union of XML Schema simple types which instantiate the subtypes for temporal position described in ISO 19108.
+ An ordinal era may be referenced via URI.  A decimal value may be used to indicate the distance from the scale origin .  time is used for a position that recurs daily (see ISO 19108:2002 5.4.4.2).
+ Finally, calendar and clock forms that support the representation of time in systems based on years, months, days, hours, minutes and seconds, in a notation following ISO 8601, are assembled by gml:CalDate</documentation>
+		</annotation>
+		<union memberTypes="gml:CalDate time dateTime anyURI decimal"/>
+	</simpleType>
+	<simpleType name="CalDate">
+		<union memberTypes="date gYearMonth gYear"/>
+	</simpleType>
+	<element name="timePosition" type="gml:TimePositionType">
+		<annotation>
+			<documentation>This element is used directly as a property of gml:TimeInstant (see 15.2.2.3), and may also be used in application schemas.</documentation>
+		</annotation>
+	</element>
+	<group name="timeLength">
+		<annotation>
+			<documentation>The length of a time period.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:duration"/>
+			<element ref="gml:timeInterval"/>
+		</choice>
+	</group>
+	<element name="duration" type="duration">
+		<annotation>
+			<documentation>gml:duration conforms to the ISO 8601 syntax for temporal length as implemented by the XML Schema duration type.</documentation>
+		</annotation>
+	</element>
+	<element name="timeInterval" type="gml:TimeIntervalLengthType">
+		<annotation>
+			<documentation> gml:timeInterval conforms to ISO 11404 which is based on floating point values for temporal length.
+ISO 11404 syntax specifies the use of a positiveInteger together with appropriate values for radix and factor. The resolution of the time interval is to one radix ^(-factor) of the specified time unit.
+The value of the unit is either selected from the units for time intervals from ISO 31-1:1992, or is another suitable unit.  The encoding is defined for GML in gml:TimeUnitType. The second component of this union type provides a method for indicating time units other than the six standard units given in the enumeration.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeIntervalLengthType" final="#all">
+		<simpleContent>
+			<extension base="decimal">
+				<attribute name="unit" type="gml:TimeUnitType" use="required"/>
+				<attribute name="radix" type="positiveInteger"/>
+				<attribute name="factor" type="integer"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<simpleType name="TimeUnitType">
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="year"/>
+					<enumeration value="month"/>
+					<enumeration value="day"/>
+					<enumeration value="hour"/>
+					<enumeration value="minute"/>
+					<enumeration value="second"/>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/temporalReferenceSystems.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/temporalReferenceSystems.xsd
new file mode 100644
index 0000000..de663e2
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/temporalReferenceSystems.xsd
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:temporalReferenceSystems:3.2.0">temporalReferenceSystems.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 15.5.
+A value in the time domain is measured relative to a temporal reference system. Common types of reference systems include calendars, ordinal temporal reference systems, and temporal coordinate systems (time elapsed since some epoch).  The primary temporal reference system for use with geographic information is the Gregorian Calendar and 24 hour local or Coordinated Universal Time (UTC), but special applications may entail the use of alternative reference systems.  The Julian day numberin [...]
+In GML seven concrete elements are used to describe temporal reference systems: gml:TimeReferenceSystem, gml:TimeCoordinateSystem, gml:TimeCalendar, gml:TimeCalendarEra, gml:TimeClock, gml:TimeOrdinalReferenceSystem, and gml:TimeOrdinalEra.</documentation>
+	</annotation>
+	<include schemaLocation="temporalTopology.xsd"/>
+	<include schemaLocation="dictionary.xsd"/>
+	<element name="TimeReferenceSystem" type="gml:TimeReferenceSystemType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A reference system is characterized in terms of its domain of validity: the spatial and temporal extent over which it is applicable. The basic GML element for temporal reference systems is gml:TimeReferenceSystem.  Its content model extends gml:DefinitionType with one additional property, gml:domainOfValidity.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeReferenceSystemType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="domainOfValidity" type="string"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeCoordinateSystem" type="gml:TimeCoordinateSystemType" substitutionGroup="gml:TimeReferenceSystem">
+		<annotation>
+			<documentation>A temporal coordinate system shall be based on a continuous interval scale defined in terms of a single time interval.
+The differences to ISO 19108 TM_CoordinateSystem are:
+-	the origin is specified either using the property gml:originPosition whose value is a direct time position, or using the property gml:origin whose model is gml:TimeInstantPropertyType; this permits more flexibility in representation and also supports referring to a value fixed elsewhere;
+-	the interval uses gml:TimeIntervalLengthType.
+</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeCoordinateSystemType">
+		<complexContent>
+			<extension base="gml:TimeReferenceSystemType">
+				<sequence>
+					<choice>
+						<element name="originPosition" type="gml:TimePositionType"/>
+						<element name="origin" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<element name="interval" type="gml:TimeIntervalLengthType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeCalendar" type="gml:TimeCalendarType" substitutionGroup="gml:TimeReferenceSystem">
+		<annotation>
+			<documentation>A calendar is a discrete temporal reference system that provides a basis for defining temporal position to a resolution of one day.
+gml:TimeCalendar adds one property to those inherited from gml:TimeReferenceSystem. A gml:referenceFrame provides a link to a gml:TimeCalendarEra that it uses. A  gml:TimeCalendar may reference more than one calendar era. 
+The referenceFrame element follows the standard GML property model, allowing the association to be instantiated either using an inline description using the gml:TimeCalendarEra element, or a link to a gml:TimeCalendarEra which is explicit elsewhere.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeCalendarType">
+		<complexContent>
+			<extension base="gml:TimeReferenceSystemType">
+				<sequence>
+					<element name="referenceFrame" type="gml:TimeCalendarEraPropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeCalendarEra" type="gml:TimeCalendarEraType">
+		<annotation>
+			<documentation>gml:TimeCalendarEra inherits basic properties from gml:DefinitionType and has the following additional properties:
+-	gml:referenceEvent is the name or description of a mythical or historic event which fixes the position of the base scale of the calendar era.  This is given as text or using a link to description held elsewhere.
+-	gml:referenceDate specifies the date of the referenceEvent expressed as a date in the given calendar.  In most calendars, this date is the origin (i.e., the first day) of the scale, but this is not always true.
+-	gml:julianReference specifies the Julian date that corresponds to the reference date.  The Julian day number is an integer value; the Julian date is a decimal value that allows greater resolution.  Transforming calendar dates to and from Julian dates provides a relatively simple basis for transforming dates from one calendar to another.
+-	gml:epochOfUse is the period for which the calendar era was used as a basis for dating.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeCalendarEraType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="referenceEvent" type="gml:StringOrRefType"/>
+					<element name="referenceDate" type="gml:CalDate"/>
+					<element name="julianReference" type="decimal"/>
+					<element name="epochOfUse" type="gml:TimePeriodPropertyType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeCalendarPropertyType">
+		<annotation>
+			<documentation>gml:TimeCalendarPropertyType provides for associating a gml:TimeCalendar with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCalendar"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="TimeCalendarEraPropertyType">
+		<annotation>
+			<documentation>gml:TimeCalendarEraPropertyType provides for associating a gml:TimeCalendarEra with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCalendarEra"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="TimeClock" type="gml:TimeClockType" substitutionGroup="gml:TimeReferenceSystem">
+		<annotation>
+			<documentation>A clock provides a basis for defining temporal position within a day. A clock shall be used with a calendar in order to provide a complete description of a temporal position within a specific day.
+gml:TimeClock adds the following properties to those inherited from gml:TimeReferenceSystemType:
+-	gml:referenceEvent is the name or description of an event, such as solar noon or sunrise, which fixes the position of the base scale of the clock.
+-	gml:referenceTime specifies the time of day associated with the reference event expressed as a time of day in the given clock. The reference time is usually the origin of the clock scale. 
+-	gml:utcReference specifies the 24 hour local or UTC time that corresponds to the reference time.
+-	gml:dateBasis contains or references the calendars that use this clock.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeClockType" final="#all">
+		<complexContent>
+			<extension base="gml:TimeReferenceSystemType">
+				<sequence>
+					<element name="referenceEvent" type="gml:StringOrRefType"/>
+					<element name="referenceTime" type="time"/>
+					<element name="utcReference" type="time"/>
+					<element name="dateBasis" type="gml:TimeCalendarPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeClockPropertyType">
+		<annotation>
+			<documentation>gml:TimeClockPropertyType provides for associating a gml:TimeClock with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeClock"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="TimeOrdinalReferenceSystem" type="gml:TimeOrdinalReferenceSystemType" substitutionGroup="gml:TimeReferenceSystem">
+		<annotation>
+			<documentation>In some applications of geographic information — such as geology and archaeology — relative position in time is known more precisely than absolute time or duration. The order of events in time can be well established, but the magnitude of the intervals between them cannot be accurately determined; in such cases, the use of an ordinal temporal reference system is appropriate. An ordinal temporal reference system is composed of a sequence of named coterminous eras, which  [...]
+An ordinal temporal reference system whose component eras are not further subdivided is effectively a temporal topological complex constrained to be a linear graph. An ordinal temporal reference system some or all of whose component eras are subdivided is effectively a temporal topological complex with the constraint that parallel branches may only be constructed in pairs where one is a single temporal ordinal era and the other is a sequence of temporal ordinal eras that are called "memb [...]
+The positions of the beginning and end of a given era may calibrate the relative time scale.
+gml:TimeOrdinalReferenceSystem adds one or more gml:component properties to the generic temporal reference system model.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeOrdinalReferenceSystemType">
+		<complexContent>
+			<extension base="gml:TimeReferenceSystemType">
+				<sequence>
+					<element name="component" type="gml:TimeOrdinalEraPropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TimeOrdinalEra" type="gml:TimeOrdinalEraType">
+		<annotation>
+			<documentation>Its content model follows the pattern of gml:TimeEdge, inheriting standard properties from gml:DefinitionType, and adding gml:start, gml:end and gml:extent properties, a set of gml:member properties which indicate ordered gml:TimeOrdinalEra elements, and a gml:group property which points to the parent era.
+The recursive inclusion of gml:TimeOrdinalEra elements allow the construction of an arbitrary depth hierarchical ordinal reference schema, such that an ordinal era at a given level of the hierarchy includes a sequence of shorter, coterminous ordinal eras.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeOrdinalEraType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="relatedTime" type="gml:RelatedTimeType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="start" type="gml:TimeNodePropertyType"/>
+					<element name="end" type="gml:TimeNodePropertyType"/>
+					<element name="extent" type="gml:TimePeriodPropertyType" minOccurs="0"/>
+					<element name="member" type="gml:TimeOrdinalEraPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="group" type="gml:ReferenceType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeOrdinalEraPropertyType">
+		<annotation>
+			<documentation>gml:TimeOrdinalEraPropertyType provides for associating a gml:TimeOrdinalEra with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeOrdinalEra"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/temporalTopology.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/temporalTopology.xsd
new file mode 100644
index 0000000..f192b83
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/temporalTopology.xsd
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:temporalTopology:3.2.0">temporalTopology.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 15.3.
+Temporal topology is described in terms of time complexes, nodes, and edges, and the connectivity between these. Temporal topology does not directly provide information about temporal position. It is used in the case of describing a lineage or a history (e.g. a family tree expressing evolution of species, an ecological cycle, a lineage of lands or buildings, or a history of separation and merger of administrative boundaries). The following Subclauses specifies the temporal topology as te [...]
+	</annotation>
+	<include schemaLocation="temporal.xsd"/>
+	<element name="AbstractTimeTopologyPrimitive" type="gml:AbstractTimeTopologyPrimitiveType" abstract="true" substitutionGroup="gml:AbstractTimePrimitive">
+		<annotation>
+			<documentation>gml:TimeTopologyPrimitive acts as the head of a substitution group for topological temporal primitives.
+Temporal topology primitives shall imply the ordering information between features or feature properties. The temporal connection of features can be examined if they have temporal topology primitives as values of their properties. Usually, an instantaneous feature associates with a time node, and a static feature associates with a time edge.  A feature with both modes associates with the temporal topology primitive: a supertype of time nodes and time edges.
+A topological primitive is always connected to one or more other topological primitives, and is, therefore, always a member of a topological complex. In a GML instance, this will often be indicated by the primitives being described by elements that are descendents of an element describing a complex. However, in order to support the case where a temporal topological primitive is described in another context, the optional complex property is provided, which carries a reference to the paren [...]
+		</annotation>
+	</element>
+	<complexType name="AbstractTimeTopologyPrimitiveType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimePrimitiveType">
+				<sequence>
+					<element name="complex" type="gml:ReferenceType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeTopologyPrimitivePropertyType">
+		<annotation>
+			<documentation>gml:TimeTopologyPrimitivePropertyType provides for associating a gml:AbstractTimeTopologyPrimitive with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractTimeTopologyPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="TimeTopologyComplex" type="gml:TimeTopologyComplexType" substitutionGroup="gml:AbstractTimeComplex">
+		<annotation>
+			<documentation>A temporal topology complex shall be the connected acyclic directed graph composed of temporal topological primitives, i.e. time nodes and time edges. Because a time edge may not exist without two time nodes on its boundaries, static features have time edges from a temporal topology complex as the values of their temporal properties, regardless of explicit declarations.
+A temporal topology complex expresses a linear or a non-linear graph. A temporal linear graph, composed of a sequence of time edges, provides a lineage described only by “substitution” of feature instances or feature element values. A time node as the start or the end of the graph connects with at least one time edge. A time node other than the start and the end shall connect to at least two time edges: one of starting from the node, and another ending at the node.
+A temporal topological complex is a set of connected temporal topological primitives. The member primtives are indicated, either by reference or by value, using the primitive property.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeTopologyComplexType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTimeComplexType">
+				<sequence>
+					<element name="primitive" type="gml:TimeTopologyPrimitivePropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeTopologyComplexPropertyType">
+		<annotation>
+			<documentation>gml:TimeTopologyComplexPropertyType provides for associating a gml:TimeTopologyComplex with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeTopologyComplex"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="TimeNode" type="gml:TimeNodeType" substitutionGroup="gml:AbstractTimeTopologyPrimitive">
+		<annotation>
+			<documentation>A time node is a zero-dimensional topological primitive that represents an identifiable node in time (it is equivalent to a point in space). A node may act as the termination or initiation of any number of time edges. A time node may be realised as a geometry, its position, whose value is a time instant.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeNodeType">
+		<complexContent>
+			<extension base="gml:AbstractTimeTopologyPrimitiveType">
+				<sequence>
+					<element name="previousEdge" type="gml:TimeEdgePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="nextEdge" type="gml:TimeEdgePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="position" type="gml:TimeInstantPropertyType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeNodePropertyType">
+		<annotation>
+			<documentation>gml:TimeNodePropertyType provides for associating a gml:TimeNode with an object</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeNode"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="TimeEdge" type="gml:TimeEdgeType" substitutionGroup="gml:AbstractTimeTopologyPrimitive">
+		<annotation>
+			<documentation>A time edge is a one-dimensional topological primitive. It is an open interval that starts and ends at a node. The edge may be realised as a geometry whose value is a time period.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TimeEdgeType">
+		<complexContent>
+			<extension base="gml:AbstractTimeTopologyPrimitiveType">
+				<sequence>
+					<element name="start" type="gml:TimeNodePropertyType"/>
+					<element name="end" type="gml:TimeNodePropertyType"/>
+					<element name="extent" type="gml:TimePeriodPropertyType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="TimeEdgePropertyType">
+		<annotation>
+			<documentation>gml:TimeEdgePropertyType provides for associating a gml:TimeEdge with an object.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeEdge"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<simpleType name="SuccessionType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="substitution"/>
+			<enumeration value="division"/>
+			<enumeration value="fusion"/>
+			<enumeration value="initiation"/>
+		</restriction>
+	</simpleType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/topology.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/topology.xsd
new file mode 100644
index 0000000..b38185a
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/topology.xsd
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:topology:3.2.0">topology.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 Clause 14.
+Topology is the branch of mathematics describing the properties of objects which are invariant under continuous deformation. For example, a circle is topologically equivalent to an ellipse because one can be transformed into the other by stretching. In geographic modelling, the foremost use of topology is in accelerating computational geometry. The constructs of topology allow characterisation of the spatial relationships between objects using simple combinatorial or algebraic algorithms [...]
+There are four instantiable classes of primitive topology objects, one for each dimension up to 3D. In addition, topological complexes are supported, too. 
+There is strong symmetry in the (topological boundary and coboundary) relationships between topology primitives of adjacent dimensions. Topology primitives are bounded by directed primitives of one lower dimension. The coboundary of each topology primitive is formed from directed topology primitives of one higher dimension.</documentation>
+	</annotation>
+	<include schemaLocation="geometryComplexes.xsd"/>
+	<complexType name="AbstractTopologyType" abstract="true">
+		<annotation>
+			<documentation>This abstract type supplies the root or base type for all topological elements including primitives and complexes. It inherits AbstractGMLType and hence can be identified using the gml:id attribute.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType"/>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTopology" type="gml:AbstractTopologyType" abstract="true" substitutionGroup="gml:AbstractGML"/>
+	<complexType name="AbstractTopoPrimitiveType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:isolated" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:container" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="AbstractTopoPrimitive" type="gml:AbstractTopoPrimitiveType" abstract="true" substitutionGroup="gml:AbstractTopology">
+		<annotation>
+			<documentation>gml:AbstractTopoPrimitive acts as the base type for all topological primitives. Topology primitives are the atomic (smallest possible) units of a topology complex. 
+Each topology primitive may contain references to other topology primitives of codimension 2 or more (gml:isolated). Conversely, nodes may have faces as containers and nodes and edges may have solids as containers (gml:container).</documentation>
+		</annotation>
+	</element>
+	<element name="isolated" type="gml:IsolatedPropertyType">
+		<annotation>
+			<documentation>The gml:isolated property element implements the role of the same name of the ISO 19107 “Isolated In” association (see ISO 19107:2003, 7.3.10.4).</documentation>
+		</annotation>
+	</element>
+	<complexType name="IsolatedPropertyType">
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:Node"/>
+				<element ref="gml:Edge"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="container" type="gml:ContainerPropertyType">
+		<annotation>
+			<documentation>The gml:container property element implements the role of the same name of the ISO 19107 “Isolated In” association (see ISO 19107:2003, 7.3.10.4).</documentation>
+		</annotation>
+	</element>
+	<complexType name="ContainerPropertyType">
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:Face"/>
+				<element ref="gml:TopoSolid"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="NodeType">
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedEdge" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:pointProperty" minOccurs="0"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Node" type="gml:NodeType" substitutionGroup="gml:AbstractTopoPrimitive">
+		<annotation>
+			<documentation>gml:Node represents the 0-dimensional primitive.
+The optional coboundary of a node (gml:directedEdge) is a sequence of directed edges which are incident on this node. Edges emanating from this node appear in the node coboundary with a negative orientation. 
+If provided, the aggregationType attribute shall have the value “sequence”.
+A node may optionally be realised by a 0-dimensional geometric primitive (gml:pointProperty).</documentation>
+		</annotation>
+	</element>
+	<element name="directedNode" type="gml:DirectedNodePropertyType">
+		<annotation>
+			<documentation>A gml:directedNode property element describes the boundary of topology edges and is used in the support of topological point features via the gml:TopoPoint expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included node is used: start (“-“) or end (“+”) node.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectedNodePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Node"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="EdgeType">
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedNode" minOccurs="2" maxOccurs="2"/>
+					<element ref="gml:directedFace" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:curveProperty" minOccurs="0"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Edge" type="gml:EdgeType" substitutionGroup="gml:AbstractTopoPrimitive">
+		<annotation>
+			<documentation>gml:Edge represents the 1-dimensional primitive.
+The topological boundary of an Edge (gml:directedNode) consists of a negatively directed start Node and a positively directed end Node.   
+The optional coboundary of an edge (gml:directedFace) is a circular sequence of directed faces which are incident on this edge in document order. In the 2D case, the orientation of the face on the left of the edge is "+"; the orientation of the face on the right on its right is "-". 
+If provided, the aggregationType attribute shall have the value “sequence”.
+An edge may optionally be realised by a 1-dimensional geometric primitive (gml:curveProperty).</documentation>
+		</annotation>
+	</element>
+	<element name="directedEdge" type="gml:DirectedEdgePropertyType">
+		<annotation>
+			<documentation>A gml:directedEdge property element describes the boundary of topology faces, the coBoundary of topology nodes and is used in the support of topological line features via the gml:TopoCurve expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included edge is used, i.e. forward or reverse.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectedEdgePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Edge"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="FaceType">
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedEdge" maxOccurs="unbounded"/>
+					<element ref="gml:directedTopoSolid" minOccurs="0" maxOccurs="2"/>
+					<element ref="gml:surfaceProperty" minOccurs="0"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="Face" type="gml:FaceType" substitutionGroup="gml:AbstractTopoPrimitive">
+		<annotation>
+			<documentation>gml:Face represents the 2-dimensional topology primitive.
+The topological boundary of a face (gml:directedEdge) consists of a sequence of directed edges. If provided, the aggregationType attribute shall have the value “sequence”.
+The optional coboundary of a face (gml:directedTopoSolid) is a pair of directed solids which are bounded by this face. A positively directed solid corresponds to a solid which lies in the direction of the negatively directed normal to the face in any geometric realisation. 
+A face may optionally be realised by a 2-dimensional geometric primitive (gml:surfaceProperty).</documentation>
+		</annotation>
+	</element>
+	<element name="directedFace" type="gml:DirectedFacePropertyType">
+		<annotation>
+			<documentation>The gml:directedFace property element describes the boundary of topology solids, in the coBoundary of topology edges and is used in the support of surface features via the gml:TopoSurface expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included face is used i.e. inward or outward with respect to the surface normal in any geometric realisation.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectedFacePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Face"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="TopoSolidType">
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedFace" maxOccurs="unbounded"/>
+					<element ref="gml:solidProperty" minOccurs="0"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TopoSolid" type="gml:TopoSolidType" substitutionGroup="gml:AbstractTopoPrimitive">
+		<annotation>
+			<documentation>gml:TopoSolid represents the 3-dimensional topology primitive. 
+The topological boundary of a solid (gml:directedFace) consists of a set of directed faces.
+A solid may optionally be realised by a 3-dimensional geometric primitive (gml:solidProperty).</documentation>
+		</annotation>
+	</element>
+	<element name="directedTopoSolid" type="gml:DirectedTopoSolidPropertyType">
+		<annotation>
+			<documentation>The gml:directedSolid property element describes the coBoundary of topology faces and is used in the support of volume features via the gml:TopoVolume expression, see below. The orientation attribute of type gml:SignType expresses the sense in which the included solid appears in the face coboundary. In the context of a gml:TopoVolume the orientation attribute has no meaning.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DirectedTopoSolidPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TopoSolid"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="TopoPointType">
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedNode"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TopoPoint" type="gml:TopoPointType">
+		<annotation>
+			<documentation>The intended use of gml:TopoPoint is to appear within a point feature to express the structural and possibly geometric relationships of this feature to other features via shared node definitions.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoPointPropertyType">
+		<sequence>
+			<element ref="gml:TopoPoint"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="topoPointProperty" type="gml:TopoPointPropertyType">
+		<annotation>
+			<documentation>The gml:topoPointProperty property element may be used in features to express their relationship to the referenced topology node.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoCurveType">
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedEdge" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TopoCurve" type="gml:TopoCurveType">
+		<annotation>
+			<documentation>gml:TopoCurve represents a homogeneous topological expression, a sequence of directed edges, which if realised are isomorphic to a geometric curve primitive. The intended use of gml:TopoCurve is to appear within a line feature to express the structural and geometric relationships of this feature to other features via the shared edge definitions.
+If provided, the aggregationType attribute shall have the value “sequence”.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoCurvePropertyType">
+		<sequence>
+			<element ref="gml:TopoCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="topoCurveProperty" type="gml:TopoCurvePropertyType">
+		<annotation>
+			<documentation>The gml:topoCurveProperty property element may be used in features to express their relationship to the referenced topology edges.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoSurfaceType">
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedFace" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TopoSurface" type="gml:TopoSurfaceType">
+		<annotation>
+			<documentation>gml:TopoSurface represents a homogeneous topological expression, a set of directed faces, which if realised are isomorphic to a geometric surface primitive. The intended use of gml:TopoSurface is to appear within a surface feature to express the structural and possibly geometric relationships of this surface feature to other features via the shared face definitions.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoSurfacePropertyType">
+		<sequence>
+			<element ref="gml:TopoSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="topoSurfaceProperty" type="gml:TopoSurfacePropertyType">
+		<annotation>
+			<documentation>The gml:topoSurfaceProperty property element may be used in features to express their relationship to the referenced topology faces.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoVolumeType">
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedTopoSolid" maxOccurs="unbounded"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TopoVolume" type="gml:TopoVolumeType">
+		<annotation>
+			<documentation>gml:TopoVolume represents a homogeneous topological expression, a set of directed topologic solids, which if realised are isomorphic to a geometric solid primitive. The intended use of gml:TopoVolume is to appear within a solid feature to express the structural and geometric relationships of this solid feature to other features via the shared solid definitions.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoVolumePropertyType">
+		<sequence>
+			<element ref="gml:TopoVolume"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="topoVolumeProperty" type="gml:TopoVolumePropertyType">
+		<annotation>
+			<documentation>The gml:topoVolumeProperty element may be used in features to express their relationship to the referenced topology volume.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoComplexType">
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:maximalComplex"/>
+					<element ref="gml:superComplex" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:subComplex" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:topoPrimitiveMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:topoPrimitiveMembers" minOccurs="0"/>
+				</sequence>
+				<attribute name="isMaximal" type="boolean" default="false"/>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="TopoComplex" type="gml:TopoComplexType" substitutionGroup="gml:AbstractTopology">
+		<annotation>
+			<documentation>gml:TopoComplex is a collection of topological primitives.
+Each complex holds a reference to its maximal complex (gml:maximalComplex) and optionally to sub- or super-complexes (gml:subComplex, gml:superComplex). 
+A topology complex contains its primitive and sub-complex members.
+</documentation>
+		</annotation>
+	</element>
+	<element name="subComplex" type="gml:TopoComplexMemberType">
+		<annotation>
+			<documentation>The property elements gml:subComplex, gml:superComplex and gml:maximalComplex provide an encoding for relationships between topology complexes as described for gml:TopoComplex above.</documentation>
+		</annotation>
+	</element>
+	<element name="superComplex" type="gml:TopoComplexMemberType">
+		<annotation>
+			<documentation>The property elements gml:subComplex, gml:superComplex and gml:maximalComplex provide an encoding for relationships between topology complexes as described for gml:TopoComplex above.</documentation>
+		</annotation>
+	</element>
+	<element name="maximalComplex" type="gml:TopoComplexMemberType">
+		<annotation>
+			<documentation>The property elements gml:subComplex, gml:superComplex and gml:maximalComplex provide an encoding for relationships between topology complexes as described for gml:TopoComplex above.</documentation>
+		</annotation>
+	</element>
+	<element name="topoPrimitiveMember" type="gml:TopoPrimitiveMemberType">
+		<annotation>
+			<documentation>The gml:topoPrimitiveMember property element encodes for the relationship between a topology complex and a single topology primitive.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoPrimitiveMemberType">
+		<sequence minOccurs="0">
+			<element ref="gml:AbstractTopoPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="topoPrimitiveMembers" type="gml:TopoPrimitiveArrayAssociationType">
+		<annotation>
+			<documentation>The gml:topoPrimitiveMembers property element encodes the relationship between a topology complex and an arbitrary number of topology primitives.</documentation>
+		</annotation>
+	</element>
+	<complexType name="TopoPrimitiveArrayAssociationType">
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:AbstractTopoPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<complexType name="TopoComplexMemberType">
+		<sequence minOccurs="0">
+			<element ref="gml:TopoComplex"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<element name="topoComplexProperty" type="gml:TopoComplexMemberType">
+		<annotation>
+			<documentation>The gml:topoComplexProperty property element encodes the relationship between a GML object and a topological complex.</documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/units.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/units.xsd
new file mode 100644
index 0000000..40a68a3
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/units.xsd
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.2.0" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:units:3.2.0">units.xsd</appinfo>
+		<documentation>See ISO/DIS 17.2.
+Several GML Schema components concern or require a reference scale or units of measure.  Units are required for quantities that may occur as values of properties of feature types, as the results of observations, in the range parameters of a coverage, and for measures used in Coordinate Reference System definitions. 
+The basic unit definition is an extension of the general gml:Definition element defined in 16.2.1.  Three specialized elements for unit definition are further derived from this. 
+This model is based on the SI system of units [ISO 1000], which distinguishes between Base Units and Derived Units.  
+-	Base Units are the preferred units for a set of orthogonal fundamental quantities which define the particular system of units, which may not be derived by combination of other base units.  
+-	Derived Units are the preferred units for other quantities in the system, which may be defined by algebraic combination of the base units.  
+In some application areas Conventional units are used, which may be converted to the preferred units using a scaling factor or a formula which defines a re-scaling and offset.  The set of preferred units for all physical quantity types in a particular system of units is composed of the union of its base units and derived units.  
+Unit definitions are substitutable for the gml:Definition element declared as part of the dictionary model.  A dictionary that contains only unit definitions and references to unit definitions is a units dictionary.  </documentation>
+	</annotation>
+	<include schemaLocation="dictionary.xsd"/>
+	<element name="unitOfMeasure" type="gml:UnitOfMeasureType">
+		<annotation>
+			<documentation>The element gml:unitOfMeasure is a property element to refer to a unit of measure. This is an empty element which carries a reference to a unit of measure definition.</documentation>
+		</annotation>
+	</element>
+	<complexType name="UnitOfMeasureType">
+		<sequence/>
+		<attribute name="uom" type="gml:UomIdentifier" use="required"/>
+	</complexType>
+	<element name="UnitDefinition" type="gml:UnitDefinitionType" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>A gml:UnitDefinition is a general definition of a unit of measure. This generic element is used only for units for which no relationship with other units or units systems is known.
+The content model of gml:UnitDefinition adds three additional properties to gml:Definition, gml:quantityType, gml:quantityTypeReference and gml:catalogSymbol.  
+The gml:catalogSymbol property optionally gives the short symbol used for this unit. This element is usually used when the relationship of this unit to other units or units systems is unknown.</documentation>
+		</annotation>
+	</element>
+	<complexType name="UnitDefinitionType">
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:quantityType" minOccurs="0"/>
+					<element ref="gml:quantityTypeReference" minOccurs="0"/>
+					<element ref="gml:catalogSymbol" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="quantityType" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>The gml:quantityType property indicates the phenomenon to which the units apply. This element contains an informal description of the phenomenon or type of physical quantity that is measured or observed. When the physical quantity is the result of an observation or measurement, this term is known as observable type or measurand.
+The use of gml:quantityType for references to remote values is deprecated.</documentation>
+		</annotation>
+	</element>
+	<element name="quantityTypeReference" type="gml:ReferenceType">
+		<annotation>
+			<documentation>The gml:quantityTypeReference property indicates the phenomenon to which the units apply. The content is a reference to a remote value.</documentation>
+		</annotation>
+	</element>
+	<element name="catalogSymbol" type="gml:CodeType">
+		<annotation>
+			<documentation>The catalogSymbol is the preferred lexical symbol used for this unit of measure.
+The codeSpace attribute in gml:CodeType identifies a namespace for the catalog symbol value, and might reference the external catalog. The string value in gml:CodeType contains the value of a symbol that should be unique within this catalog namespace. This symbol often appears explicitly in the catalog, but it could be a combination of symbols using a specified algebra of units.</documentation>
+		</annotation>
+	</element>
+	<element name="BaseUnit" type="gml:BaseUnitType" substitutionGroup="gml:UnitDefinition">
+		<annotation>
+			<documentation>A base unit is a unit of measure that cannot be derived by combination of other base units within a particular system of units.  For example, in the SI system of units, the base units are metre, kilogram, second, Ampere, Kelvin, mole, and candela, for the physical quantity types length, mass, time interval, electric current, thermodynamic temperature, amount of substance and luminous intensity, respectively.
+gml:BaseUnit extends generic gml:UnitDefinition with the property gml:unitsSystem, which carries a reference to the units system to which this base unit is asserted to belong.  </documentation>
+		</annotation>
+	</element>
+	<complexType name="BaseUnitType">
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<element name="unitsSystem" type="gml:ReferenceType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="DerivedUnit" type="gml:DerivedUnitType" substitutionGroup="gml:UnitDefinition">
+		<annotation>
+			<documentation>Derived units are defined by combination of other units.  Derived units are used for quantities other than those corresponding to the base units, such as hertz (s-1) for frequency, Newton (kg.m/s2) for force.  Derived units based directly on base units are usually preferred for quantities other than the fundamental quantities within a system. If a derived unit is not the preferred unit, the gml:ConventionalUnit element should be used instead.
+The gml:DerivedUnit extends gml:UnitDefinition with the property gml:derivationUnitTerms.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DerivedUnitType">
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<element ref="gml:derivationUnitTerm" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="derivationUnitTerm" type="gml:DerivationUnitTermType">
+		<annotation>
+			<documentation>A set of gml:derivationUnitTerm elements describes a derived unit of measure.  Each element carries an integer exponent.  The terms are combined by raising each referenced unit to the power of its exponent and forming the product.
+This unit term references another unit of measure (uom) and provides an integer exponent applied to that unit in defining the compound unit. The exponent may be positive or negative, but not zero.</documentation>
+		</annotation>
+	</element>
+	<complexType name="DerivationUnitTermType">
+		<complexContent>
+			<extension base="gml:UnitOfMeasureType">
+				<attribute name="exponent" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ConventionalUnit" type="gml:ConventionalUnitType" substitutionGroup="gml:UnitDefinition">
+		<annotation>
+			<documentation>Conventional units that are neither base units nor defined by direct combination of base units are used in many application domains.  For example electronVolt for energy, feet and nautical miles for length.  In most cases there is a known, usually linear, conversion to a preferred unit which is either a base unit or derived by direct combination of base units.
+The gml:ConventionalUnit extends gml:UnitDefinition with a property that describes a conversion to a preferred unit for this physical quantity.  When the conversion is exact, the element gml:conversionToPreferredUnit should be used, or when the conversion is not exact the element gml:roughConversionToPreferredUnit is available. Both of these elements have the same content model.  The gml:derivationUnitTerm property defined above is included to allow a user to optionally record how this u [...]
+		</annotation>
+	</element>
+	<complexType name="ConventionalUnitType">
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<choice>
+						<element ref="gml:conversionToPreferredUnit"/>
+						<element ref="gml:roughConversionToPreferredUnit"/>
+					</choice>
+					<element ref="gml:derivationUnitTerm" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="conversionToPreferredUnit" type="gml:ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>The elements gml:conversionToPreferredUnit and gml:roughConversionToPreferredUnit represent parameters used to convert conventional units to preferred units for this physical quantity type.  A preferred unit is either a Base Unit or a Derived Unit that is selected for all values of one physical quantity type.</documentation>
+		</annotation>
+	</element>
+	<element name="roughConversionToPreferredUnit" type="gml:ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>The elements gml:conversionToPreferredUnit and gml:roughConversionToPreferredUnit represent parameters used to convert conventional units to preferred units for this physical quantity type.  A preferred unit is either a Base Unit or a Derived Unit that is selected for all values of one physical quantity type.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>The inherited attribute uom references the preferred unit that this conversion applies to. The conversion of a unit to the preferred unit for this physical quantity type is specified by an arithmetic conversion (scaling and/or offset). The content model extends gml:UnitOfMeasureType, which has a mandatory attribute uom which identifies the preferred unit for the physical quantity type that this conversion applies to. The conversion is specified by a choice of 
+-	gml:factor, which defines the scale factor, or
+-	gml:formula, which defines a formula 
+by which a value using the conventional unit of measure can be converted to obtain the corresponding value using the preferred unit of measure.  
+The formula defines the parameters of a simple formula by which a value using the conventional unit of measure can be converted to the corresponding value using the preferred unit of measure. The formula element contains elements a, b, c and d, whose values use the XML Schema type double. These values are used in the formula y = (a + bx) / (c + dx), where x is a value using this unit, and y is the corresponding value using the base unit. The elements a and d are optional, and if values a [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitOfMeasureType">
+				<choice>
+					<element name="factor" type="double"/>
+					<element name="formula" type="gml:FormulaType"/>
+				</choice>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="FormulaType">
+		<sequence>
+			<element name="a" type="double" minOccurs="0"/>
+			<element name="b" type="double"/>
+			<element name="c" type="double"/>
+			<element name="d" type="double" minOccurs="0"/>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/valueObjects.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/valueObjects.xsd
new file mode 100644
index 0000000..3cca309
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gml/valueObjects.xsd
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.2.0">
+	<annotation>
+		<appinfo source="urn:ogc:specification:gml:schema-xsd:valueObjects:3.2.0">valueObjects.xsd</appinfo>
+		<documentation>See ISO/DIS 19136 17.5.
+The elements declared in this Clause build on other GML schema components, in particular gml:AbstractTimeObject, gml:AbstractGeometry, and the following types:  gml:MeasureType, gml:MeasureListType, gml:CodeType, gml:CodeOrNilReasonListType, gml:BooleanOrNilReasonListType, gml:IntegerOrNilReasonList.  
+Of particular interest are elements that are the heads of substitution groups, and one named choice group. These are the primary reasons for the value objects schema, since they may act as variables in the definition of content models, such as Observations, when it is desired to permit alternative value types to occur some of which may have complex content such as arrays, geometry and time objects, and where it is useful not to prescribe the actual value type in advance. The members of t [...]
+The value objects are defined in a hierarchy. The following relationships are defined:
+-	Concrete elements gml:Quantity, gml:Category, gml:Count and gml:Boolean are substitutable for the abstract element gml:AbstractScalarValue.  
+-	Concrete elements gml:QuantityList, gml:CategoryList, gml:CountList and gml:BooleanList are substitutable for the abstract element gml:AbstractScalarValueList.  
+-	Concrete element gml:ValueArray is substitutable for the concrete element gml:CompositeValue.  
+-	Abstract elements gml:AbstractScalarValue and gml:AbstractScalarValueList, and concrete elements gml:CompositeValue, gml:ValueExtent, gml:CategoryExtent, gml:CountExtent and gml:QuantityExtent are substitutable for abstract element gml:AbstractValue.  
+-	Abstract elements gml:AbstractValue, gml:AbstractTimeObject and gml:AbstractGeometry are all in a choice group named gml:Value, which is used for compositing in gml:CompositeValue and gml:ValueExtent.  
+-	Schemas which need values may use the abstract element gml:AbstractValue in a content model in order to permit any of the gml:AbstractScalarValues, gml:AbstractScalarValueLists, gml:CompositeValue or gml:ValueExtent to occur in an instance, or the named group gml:Value to also permit gml:AbstractTimeObjects, gml:AbstractGeometrys.  </documentation>
+	</annotation>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<element name="Boolean" substitutionGroup="gml:AbstractScalarValue" nillable="true">
+		<complexType>
+			<simpleContent>
+				<extension base="boolean">
+					<attribute name="nilReason" type="gml:NilReasonType"/>
+				</extension>
+			</simpleContent>
+		</complexType>
+	</element>
+	<element name="BooleanList" type="gml:booleanOrNilReasonList" substitutionGroup="gml:AbstractScalarValueList"/>
+	<element name="Category" substitutionGroup="gml:AbstractScalarValue" nillable="true">
+		<annotation>
+			<documentation>A gml:Category has an optional XML attribute codeSpace, whose value is a URI which identifies a dictionary, codelist or authority for the term.</documentation>
+		</annotation>
+		<complexType>
+			<simpleContent>
+				<extension base="gml:CodeType">
+					<attribute name="nilReason" type="gml:NilReasonType"/>
+				</extension>
+			</simpleContent>
+		</complexType>
+	</element>
+	<element name="CategoryList" type="gml:CodeOrNilReasonListType" substitutionGroup="gml:AbstractScalarValueList"/>
+	<element name="Count" substitutionGroup="gml:AbstractScalarValue" nillable="true">
+		<complexType>
+			<simpleContent>
+				<extension base="integer">
+					<attribute name="nilReason" type="gml:NilReasonType"/>
+				</extension>
+			</simpleContent>
+		</complexType>
+	</element>
+	<element name="CountList" type="gml:integerOrNilReasonList" substitutionGroup="gml:AbstractScalarValueList"/>
+	<element name="Quantity" substitutionGroup="gml:AbstractScalarValue" nillable="true">
+		<annotation>
+			<documentation>An XML attribute uom (“unit of measure”) is required, whose value is a URI which identifies the definition of a ratio scale or units by which the numeric value shall be multiplied, or an interval or position scale on which the value occurs.</documentation>
+		</annotation>
+		<complexType>
+			<simpleContent>
+				<extension base="gml:MeasureType">
+					<attribute name="nilReason" type="gml:NilReasonType"/>
+				</extension>
+			</simpleContent>
+		</complexType>
+	</element>
+	<element name="QuantityList" type="gml:MeasureOrNilReasonListType" substitutionGroup="gml:AbstractScalarValueList"/>
+	<element name="AbstractValue" type="anyType" abstract="true" substitutionGroup="gml:AbstractObject">
+		<annotation>
+			<documentation>gml:AbstractValue is an abstract element which acts as the head of a substitution group which contains gml:AbstractScalarValue, gml:AbstractScalarValueList, gml:CompositeValue and gml:ValueExtent, and (transitively) the elements in their substitution groups.
+These elements may be used in an application schema as variables, so that in an XML instance document any member of its substitution group may occur.</documentation>
+		</annotation>
+	</element>
+	<element name="AbstractScalarValue" type="anyType" abstract="true" substitutionGroup="gml:AbstractValue">
+		<annotation>
+			<documentation>gml:AbstractScalarValue is an abstract element which acts as the head of a substitution group which contains gml:Boolean, gml:Category, gml:Count and gml:Quantity, and (transitively) the elements in their substitution groups.</documentation>
+		</annotation>
+	</element>
+	<element name="AbstractScalarValueList" type="anyType" abstract="true" substitutionGroup="gml:AbstractValue">
+		<annotation>
+			<documentation>gml:AbstractScalarValueList is an abstract element which acts as the head of a substitution group which contains gml:BooleanList, gml:CategoryList, gml:CountList and gml:QuantityList, and (transitively) the elements in their substitution groups.</documentation>
+		</annotation>
+	</element>
+	<group name="Value">
+		<annotation>
+			<documentation>This is a convenience choice group which unifies generic values defined in this Clause with spatial and temporal objects and the measures described above, so that any of these may be used within aggregate values.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:AbstractValue"/>
+			<element ref="gml:AbstractGeometry"/>
+			<element ref="gml:AbstractTimeObject"/>
+			<element ref="gml:Null"/>
+		</choice>
+	</group>
+	<element name="valueProperty" type="gml:ValuePropertyType">
+		<annotation>
+			<documentation>Property that refers to, or contains, a Value. Convenience element for general use.</documentation>
+		</annotation>
+	</element>
+	<element name="valueComponent" type="gml:ValuePropertyType">
+		<annotation>
+			<documentation>Property that refers to, or contains, a Value.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ValuePropertyType">
+		<sequence minOccurs="0">
+			<group ref="gml:Value"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="valueComponents" type="gml:ValueArrayPropertyType">
+		<annotation>
+			<documentation>Property that contains Values.</documentation>
+		</annotation>
+	</element>
+	<complexType name="ValueArrayPropertyType">
+		<sequence maxOccurs="unbounded">
+			<group ref="gml:Value"/>
+		</sequence>
+		<attributeGroup ref="gml:OwnershipAttributeGroup"/>
+	</complexType>
+	<element name="CompositeValue" type="gml:CompositeValueType" substitutionGroup="gml:AbstractValue">
+		<annotation>
+			<documentation>gml:CompositeValue is an aggregate value built from other values . It contains zero or an arbitrary number of gml:valueComponent elements, and zero or one gml:valueComponents property elements.  It may be used for strongly coupled aggregates (vectors, tensors) or for arbitrary collections of values.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CompositeValueType">
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:valueComponent" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:valueComponents" minOccurs="0"/>
+				</sequence>
+				<attributeGroup ref="gml:AggregationAttributeGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<element name="ValueArray" type="gml:ValueArrayType" substitutionGroup="gml:CompositeValue">
+		<annotation>
+			<documentation>A Value Array is used for homogeneous arrays of primitive and aggregate values.  
+The member values may be scalars, composites, arrays or lists.
+ValueArray has the same content model as CompositeValue, but the member values shall be homogeneous.  The element declaration contains a Schematron constraint which expresses this restriction precisely.  Since the members are homogeneous, the gml:referenceSystem (uom, codeSpace) may be specified on the gml:ValueArray itself and inherited by all the members if desired.</documentation>
+			<appinfo>
+				<sch:pattern name="Check either codeSpace or uom not both">
+					<sch:rule context="gml:ValueArray">
+						<sch:report test="@codeSpace and @uom">ValueArray may not carry both a reference to a codeSpace and a uom</sch:report>
+					</sch:rule>
+				</sch:pattern>
+				<sch:pattern name="Check components are homogeneous">
+					<sch:rule context="gml:ValueArray">
+						<sch:assert test="count(gml:valueComponent/*) = count(gml:valueComponent/*[name() = name(../../gml:valueComponent[1]/*[1])])">All components of <sch:name/> shall be of the same type</sch:assert>
+						<sch:assert test="count(gml:valueComponents/*) = count(gml:valueComponents/*[name() = name(../*[1])])">All components of <sch:name/> shall be of the same type</sch:assert>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<complexType name="ValueArrayType">
+		<complexContent>
+			<extension base="gml:CompositeValueType">
+				<attributeGroup ref="gml:referenceSystem"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<attributeGroup name="referenceSystem">
+		<attribute name="codeSpace" type="anyURI"/>
+		<attribute name="uom" type="gml:UomIdentifier"/>
+	</attributeGroup>
+	<element name="CategoryExtent" type="gml:CategoryExtentType" substitutionGroup="gml:AbstractValue"/>
+	<complexType name="CategoryExtentType">
+		<simpleContent>
+			<restriction base="gml:CodeOrNilReasonListType">
+				<length value="2"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<element name="CountExtent" type="gml:CountExtentType" substitutionGroup="gml:AbstractValue"/>
+	<simpleType name="CountExtentType">
+		<restriction base="gml:integerOrNilReasonList">
+			<length value="2"/>
+		</restriction>
+	</simpleType>
+	<element name="QuantityExtent" type="gml:QuantityExtentType" substitutionGroup="gml:AbstractValue"/>
+	<complexType name="QuantityExtentType">
+		<simpleContent>
+			<restriction base="gml:MeasureOrNilReasonListType">
+				<length value="2"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<complexType name="BooleanPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Boolean"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="CategoryPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Category"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="QuantityPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Quantity"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<complexType name="CountPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Count"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+</schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/catalogues.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/catalogues.xsd
new file mode 100644
index 0000000..6746f22
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/catalogues.xsd
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmx" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gmx="http://www.isotc211.org/2005/gmx">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 04-27-2005 17:16:11 ====== Handcrafted</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/gmd.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmx/uomItem.xsd"/>
+	<xs:include schemaLocation="../gmx/codelistItem.xsd"/>
+	<xs:include schemaLocation="../gmx/crsItem.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="AbstractCT_Catalogue_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="scope" type="gco:CharacterString_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="fieldOfApplication" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="versionNumber" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="versionDate" type="gco:Date_PropertyType"/>
+					<xs:element name="language" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="characterSet" type="gmd:MD_CharacterSetCode_PropertyType" minOccurs="0"/>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="subCatalogue" type="gmx:CT_Catalogue_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractCT_Catalogue" type="gmx:AbstractCT_Catalogue_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_Catalogue_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:AbstractCT_Catalogue"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CT_CodelistCatalogue_Type">
+		<xs:complexContent>
+			<xs:extension base="gmx:AbstractCT_Catalogue_Type">
+				<xs:sequence>
+					<xs:element name="codelistItem" type="gmx:CT_Codelist_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CT_CodelistCatalogue" type="gmx:CT_CodelistCatalogue_Type" substitutionGroup="gmx:AbstractCT_Catalogue"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_CodelistCatalogue_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CT_CodelistCatalogue"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CT_CrsCatalogue_Type">
+		<xs:complexContent>
+			<xs:extension base="gmx:AbstractCT_Catalogue_Type">
+				<xs:sequence>
+					<xs:element name="crs" type="gmx:CT_CRS_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="coordinateSystem" type="gmx:CT_CoordinateSystem_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="axis" type="gmx:CT_CoordinateSystemAxis_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="datum" type="gmx:CT_Datum_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="ellipsoid" type="gmx:CT_Ellipsoid_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="primeMeridian" type="gmx:CT_PrimeMeridian_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="operation" type="gmx:CT_Operation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="operationMethod" type="gmx:CT_OperationMethod_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="parameters" type="gmx:CT_OperationParameters_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CT_CrsCatalogue" type="gmx:CT_CrsCatalogue_Type" substitutionGroup="gmx:AbstractCT_Catalogue"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_CrsCatalogue_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CT_CrsCatalogue"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CT_UomCatalogue_Type">
+		<xs:complexContent>
+			<xs:extension base="gmx:AbstractCT_Catalogue_Type">
+				<xs:sequence>
+					<xs:element name="uomItem" type="gmx:UnitDefinition_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CT_UomCatalogue" type="gmx:CT_UomCatalogue_Type" substitutionGroup="gmx:AbstractCT_Catalogue"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_UomCatalogue_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CT_UomCatalogue"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/codelistItem.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/codelistItem.xsd
new file mode 100644
index 0000000..d6bbd47
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/codelistItem.xsd
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmx" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gml="http://www.opengis.net/gml" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmx="http://www.isotc211.org/2005/gmx">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 03-15-2005 09:14:50 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="../gml/gml.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/gmd.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_CodelistValue_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CodeDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_Codelist_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CodeListDictionary"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CodeDefinition_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:DefinitionType"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CodeDefinition" type="gmx:CodeDefinition_Type" substitutionGroup="gml:Definition"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CodeDefinition_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CodeDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CodeListDictionary_Type">
+		<xs:annotation>
+			<xs:documentation>Constraints: - 1) metadataProperty.card = 0 - 2) dictionaryEntry.card = 0</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:DictionaryType">
+				<xs:sequence>
+					<xs:element name="codeEntry" type="gmx:CodeDefinition_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CodeListDictionary" type="gmx:CodeListDictionary_Type" substitutionGroup="gml:Dictionary"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CodeListDictionary_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CodeListDictionary"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_CodeDefinition_Type">
+		<xs:complexContent>
+			<xs:extension base="gmx:CodeDefinition_Type">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CodeAlternativeExpression_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_CodeDefinition" type="gmx:ML_CodeDefinition_Type" substitutionGroup="gmx:CodeDefinition"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_CodeDefinition_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_CodeDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_CodeListDictionary_Type">
+		<xs:annotation>
+			<xs:documentation>Constraint: codeEntry.type = ML_CodeListDefinition</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmx:CodeListDictionary_Type">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:ClAlternativeExpression_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_CodeListDictionary" type="gmx:ML_CodeListDictionary_Type" substitutionGroup="gmx:CodeListDictionary"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_CodeListDictionary_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_CodeListDictionary"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<!--===================== Alternative Expresssion type ===============================-->
+	<xs:complexType name="ClAlternativeExpression_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:DefinitionType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ClAlternativeExpression" type="gmx:ClAlternativeExpression_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ClAlternativeExpression_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ClAlternativeExpression"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<xs:complexType name="CodeAlternativeExpression_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:DefinitionType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CodeAlternativeExpression" type="gmx:CodeAlternativeExpression_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CodeAlternativeExpression_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CodeAlternativeExpression"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--===End Of File===-->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/crsItem.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/crsItem.xsd
new file mode 100644
index 0000000..7de18e2
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/crsItem.xsd
@@ -0,0 +1,1030 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmx" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:gmx="http://www.isotc211.org/2005/gmx">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 03-15-2005 09:15:11 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="../gml/gml.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/gmd.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_CRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_CoordinateSystem_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractCoordinateSystem"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_CoordinateSystemAxis_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:CoordinateSystemAxis"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_Datum_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractDatum"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_Ellipsoid_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:Ellipsoid"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_PrimeMeridian_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:PrimeMeridian"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_Operation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractCoordinateOperation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_OperationMethod_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:OperationMethod"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="CT_OperationParameters_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractGeneralOperationParameter"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!--============================= Multilingual types ===============================-->
+	<!--============================== GML extensions ===============================-->
+	<!--================ GML XSchema: coordinateReferenceSystems.xsd ==================-->
+	<xs:complexType name="ML_CompoundCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:CompoundCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_CompoundCRS" type="gmx:ML_CompoundCRS_Type" substitutionGroup="gml:CompoundCRS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_CompoundCRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_CompoundCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--### gml:GeocentricCRS and gml:GeographicCRS were deprecated in 19136 DIS and replaced with gml:GeodeticCRS ###-->
+	<!--<xs:complexType name="ML_GeocentricCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:GeocentricCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>-->
+	<!-- ........................................................................ -->
+	<!--<xs:element name="ML_GeocentricCRS" type="gmx:ML_GeocentricCRS_Type" substitutionGroup="gml:GeocentricCRS"/>-->
+	<!-- ........................................................................ -->
+	<!--<xs:complexType name="ML_GeocentricCRS_PropertyType">
+		<xs:sequence>
+			<xs:element ref="gmx:ML_GeocentricCRS" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>-->
+	<!-- =========================================================================== -->
+	<!--### gml:GeocentricCRS and gml:GeographicCRS were deprecated in 19136 DIS and replaced with gml:GeodeticCRS ###-->
+	<!--<xs:complexType name="ML_GeographicCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:GeographicCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>-->
+	<!-- ........................................................................ -->
+	<!--<xs:element name="ML_GeographicCRS" type="gmx:ML_GeographicCRS_Type" substitutionGroup="gml:GeographicCRS"/>-->
+	<!-- ........................................................................ -->
+	<!--<xs:complexType name="ML_GeographicCRS_PropertyType">
+		<xs:sequence>
+			<xs:element ref="gmx:ML_GeographicCRS" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>-->
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_GeodeticCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:GeodeticCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_GeodeticCRS" type="gmx:ML_GeodeticCRS_Type" substitutionGroup="gml:GeodeticCRS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_GeodeticCRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_GeodeticCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_EngineeringCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:EngineeringCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_EngineeringCRS" type="gmx:ML_EngineeringCRS_Type" substitutionGroup="gml:EngineeringCRS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_EngineeringCRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_EngineeringCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_VerticalCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:VerticalCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_VerticalCRS" type="gmx:ML_VerticalCRS_Type" substitutionGroup="gml:VerticalCRS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_VerticalCRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_VerticalCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_TemporalCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:TemporalCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_TemporalCRS" type="gmx:ML_TemporalCRS_Type" substitutionGroup="gml:TemporalCRS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_TemporalCRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_TemporalCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_ImageCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:ImageCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_ImageCRS" type="gmx:ML_ImageCRS_Type" substitutionGroup="gml:ImageCRS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_ImageCRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_ImageCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_ProjectedCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:ProjectedCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_ProjectedCRS" type="gmx:ML_ProjectedCRS_Type" substitutionGroup="gml:ProjectedCRS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_ProjectedCRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_ProjectedCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_DerivedCRS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:DerivedCRSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CrsAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_DerivedCRS" type="gmx:ML_DerivedCRS_Type" substitutionGroup="gml:DerivedCRS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_DerivedCRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_DerivedCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--====================== GML XSchema: coordinateSystems.xsd =====================-->
+	<xs:complexType name="ML_CoordinateSystemAxis_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:CoordinateSystemAxisType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAxisAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_CoordinateSystemAxis" type="gmx:ML_CoordinateSystemAxis_Type" substitutionGroup="gml:CoordinateSystemAxis"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_CoordinateSystemAxis_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_CoordinateSystemAxis"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_EllipsoidalCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:EllipsoidalCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_EllipsoidalCS" type="gmx:ML_EllipsoidalCS_Type" substitutionGroup="gml:EllipsoidalCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_EllipsoidalCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_EllipsoidalCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_CartesianCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:CartesianCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_CartesianCS" type="gmx:ML_CartesianCS_Type" substitutionGroup="gml:CartesianCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_CartesianCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_CartesianCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_AffineCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:AffineCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_AffineCS" type="gmx:ML_AffineCS_Type" substitutionGroup="gml:AffineCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_AffineCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_AffineCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_UserDefinedCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:UserDefinedCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_UserDefinedCS" type="gmx:ML_UserDefinedCS_Type" substitutionGroup="gml:UserDefinedCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_UserDefinedCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_UserDefinedCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_VerticalCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:VerticalCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_VerticalCS" type="gmx:ML_VerticalCS_Type" substitutionGroup="gml:VerticalCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_VerticalCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_VerticalCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_TimeCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:TimeCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_TimeCS" type="gmx:ML_TimeCS_Type" substitutionGroup="gml:TimeCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_TimeCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_TimeCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_CylindricalCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:CylindricalCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_CylindricalCS" type="gmx:ML_CylindricalCS_Type" substitutionGroup="gml:CylindricalCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_CylindricalCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_CylindricalCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_SphericalCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:SphericalCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_SphericalCS" type="gmx:ML_SphericalCS_Type" substitutionGroup="gml:SphericalCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_SphericalCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_SphericalCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_PolarCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:PolarCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_PolarCS" type="gmx:ML_PolarCS_Type" substitutionGroup="gml:PolarCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_PolarCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_PolarCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_LinearCS_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:LinearCSType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:CoordinateSystemAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_LinearCS" type="gmx:ML_LinearCS_Type" substitutionGroup="gml:LinearCS"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_LinearCS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_LinearCS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--========================== GML XSchema: datums.xsd ===========================-->
+	<xs:complexType name="ML_Ellipsoid_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:EllipsoidType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:EllipsoidAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_Ellipsoid" type="gmx:ML_Ellipsoid_Type" substitutionGroup="gml:Ellipsoid"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_Ellipsoid_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_Ellipsoid"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_PrimeMeridian_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:PrimeMeridianType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:PrimeMeridianAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_PrimeMeridian" type="gmx:ML_PrimeMeridian_Type" substitutionGroup="gml:PrimeMeridian"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_PrimeMeridian_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_PrimeMeridian"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_TemporalDatum_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:TemporalDatumType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:DatumAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_TemporalDatum" type="gmx:ML_TemporalDatum_Type" substitutionGroup="gml:TemporalDatum"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_TemporalDatum_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_TemporalDatum"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_VerticalDatum_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:VerticalDatumType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:DatumAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_VerticalDatum" type="gmx:ML_VerticalDatum_Type" substitutionGroup="gml:VerticalDatum"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_VerticalDatum_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_VerticalDatum"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_ImageDatum_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:ImageDatumType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:DatumAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_ImageDatum" type="gmx:ML_ImageDatum_Type" substitutionGroup="gml:ImageDatum"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_ImageDatum_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_ImageDatum"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_EngineeringDatum_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:EngineeringDatumType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:DatumAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_EngineeringDatum" type="gmx:ML_EngineeringDatum_Type" substitutionGroup="gml:EngineeringDatum"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_EngineeringDatum_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_EngineeringDatum"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_GeodeticDatum_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:GeodeticDatumType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:DatumAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_GeodeticDatum" type="gmx:ML_GeodeticDatum_Type" substitutionGroup="gml:GeodeticDatum"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_GeodeticDatum_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_GeodeticDatum"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--==================== GML XSchema: coordinateOperations.xsd ======================-->
+	<xs:complexType name="ML_ConcatenatedOperation_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:ConcatenatedOperationType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:OperationAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_ConcatenatedOperation" type="gmx:ML_ConcatenatedOperation_Type" substitutionGroup="gml:ConcatenatedOperation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_ConcatenatedOperation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_ConcatenatedOperation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_PassThroughOperation_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:PassThroughOperationType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:OperationAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_PassThroughOperation" type="gmx:ML_PassThroughOperation_Type" substitutionGroup="gml:PassThroughOperation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_PassThroughOperation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_PassThroughOperation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_Transformation_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:TransformationType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:OperationAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_Transformation" type="gmx:ML_Transformation_Type" substitutionGroup="gml:Transformation"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_Transformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_Transformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_Conversion_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:ConversionType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:OperationAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_Conversion" type="gmx:ML_Conversion_Type" substitutionGroup="gml:Conversion"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_Conversion_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_Conversion"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_OperationMethod_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:OperationMethodType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:OperationMethodAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_OperationMethod" type="gmx:ML_OperationMethod_Type" substitutionGroup="gml:OperationMethod"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_OperationMethod_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_OperationMethod"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_OperationParameterGroup_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:OperationParameterGroupType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:OperationParameterAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_OperationParameterGroup" type="gmx:ML_OperationParameterGroup_Type" substitutionGroup="gml:OperationParameterGroup"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_OperationParameterGroup_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_OperationParameterGroup"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_OperationParameter_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:OperationParameterType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:OperationParameterAlt_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_OperationParameter" type="gmx:ML_OperationParameter_Type" substitutionGroup="gml:OperationParameter"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_OperationParameter_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_OperationParameter"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!--===================== Alternative Expresssion types ==============================-->
+	<xs:complexType name="CrsAlt_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:AbstractCRSType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CrsAlt" type="gmx:CrsAlt_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CrsAlt_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CrsAlt"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CoordinateSystemAlt_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:IdentifiedObjectType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attributeGroup ref="gml:AggregationAttributeGroup"/>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CoordinateSystemAlt" type="gmx:CoordinateSystemAlt_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CoordinateSystemAlt_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CoordinateSystemAlt"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="CoordinateSystemAxisAlt_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:CoordinateSystemAxisType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="CoordinateSystemAxisAlt" type="gmx:CoordinateSystemAxisAlt_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="CoordinateSystemAxisAlt_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:CoordinateSystemAxisAlt"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DatumAlt_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:AbstractDatumType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DatumAlt" type="gmx:DatumAlt_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DatumAlt_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:DatumAlt"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="EllipsoidAlt_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:IdentifiedObjectType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="EllipsoidAlt" type="gmx:EllipsoidAlt_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="EllipsoidAlt_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:EllipsoidAlt"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="PrimeMeridianAlt_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:IdentifiedObjectType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="PrimeMeridianAlt" type="gmx:PrimeMeridianAlt_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="PrimeMeridianAlt_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:PrimeMeridianAlt"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="OperationAlt_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:AbstractCoordinateOperationType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="OperationAlt" type="gmx:OperationAlt_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="OperationAlt_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:OperationAlt"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="OperationMethodAlt_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:IdentifiedObjectType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="OperationMethodAlt" type="gmx:OperationMethodAlt_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="OperationMethodAlt_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:OperationMethodAlt"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="OperationParameterAlt_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:OperationParameterType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="OperationParameterAlt" type="gmx:OperationParameterAlt_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="OperationParameterAlt_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:OperationParameterAlt"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- === End of file === -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/extendedTypes.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/extendedTypes.xsd
new file mode 100644
index 0000000..19553f2
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/extendedTypes.xsd
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmx" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmx="http://www.isotc211.org/2005/gmx">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 03-14-2005 12:00:20 ====== Handcrafted</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="../../../../../../../../../../pycsw/schemas/w3c/1999/xlink.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ======================== Handcrafted types =================================== -->
+	<!-- ========================================================================== -->
+	<!-- ====================== The FileName prototype ================================ -->
+	<!--It is used to point to a source file and is substitutable for CharacterString-->
+	<!--================= Type ==================-->
+	<xs:complexType name="FileName_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="src" type="xs:anyURI"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="FileName" type="gmx:FileName_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="FileName_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:FileName"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ====================== The MimeFileType prototype ============================= -->
+	<!--It is used to provide information on file types and is substitutable for CharacterString-->
+	<!--================= Type ==================-->
+	<xs:complexType name="MimeFileType_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="type" type="xs:string" use="required"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MimeFileType" type="gmx:MimeFileType_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MimeFileType_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:MimeFileType"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- ========================================================================== -->
+	<!-- ======================= The Anchor prototype ================================ -->
+	<!--It is used to point to a registred definition-->
+	<!--================= Type ==================-->
+	<xs:complexType name="Anchor_Type">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attributeGroup ref="xlink:simpleAttrs"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="Anchor" type="gmx:Anchor_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="Anchor_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:Anchor"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!--======= End of Schema ======-->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/gmx.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/gmx.xsd
new file mode 100644
index 0000000..aa0ab27
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/gmx.xsd
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema elementFormDefault="qualified" targetNamespace="http://www.isotc211.org/2005/gmx" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gmx="http://www.isotc211.org/2005/gmx"><!-- ================================= Annotation ================================ --><xs:annotation><xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 03-18-2005 11:12:17 ====== </xs:documentation></xs:annotation><!-- ===== [...]
\ No newline at end of file
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/gmxUsage.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/gmxUsage.xsd
new file mode 100644
index 0000000..e9b4b7f
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/gmxUsage.xsd
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmx" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gmx="http://www.isotc211.org/2005/gmx">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 04-27-2005 17:15:30 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/gmd.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmx/catalogues.xsd"/>
+	<xs:include schemaLocation="../gmx/extendedTypes.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="MX_Aggregate_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractDS_Aggregate_Type">
+				<xs:sequence>
+					<xs:element name="aggregateCatalogue" type="gmx:CT_Catalogue_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="aggregateFile" type="gmx:MX_SupportFile_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MX_Aggregate" type="gmx:MX_Aggregate_Type" substitutionGroup="gmd:AbstractDS_Aggregate"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MX_Aggregate_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:MX_Aggregate"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MX_DataSet_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:DS_DataSet_Type">
+				<xs:sequence>
+					<xs:element name="dataFile" type="gmx:MX_DataFile_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="datasetCatalogue" type="gmx:CT_Catalogue_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="supportFile" type="gmx:MX_SupportFile_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MX_DataSet" type="gmx:MX_DataSet_Type" substitutionGroup="gmd:DS_DataSet"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MX_DataSet_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:MX_DataSet"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MX_DataFile_Type">
+		<xs:complexContent>
+			<xs:extension base="gmx:AbstractMX_File_Type">
+				<xs:sequence>
+					<xs:element name="featureTypes" type="gco:GenericName_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="fileFormat" type="gmd:MD_Format_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MX_DataFile" type="gmx:MX_DataFile_Type" substitutionGroup="gmx:AbstractMX_File"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MX_DataFile_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:MX_DataFile"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MX_SupportFile_Type">
+		<xs:complexContent>
+			<xs:extension base="gmx:AbstractMX_File_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MX_SupportFile" type="gmx:MX_SupportFile_Type" substitutionGroup="gmx:AbstractMX_File"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MX_SupportFile_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:MX_SupportFile"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="AbstractMX_File_Type" abstract="true">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="fileName" type="gmx:FileName_PropertyType"/>
+					<xs:element name="fileDescription" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="fileType" type="gmx:MimeFileType_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractMX_File" type="gmx:AbstractMX_File_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MX_File_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:AbstractMX_File"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MX_ScopeCode" type="gco:CodeListValue_Type" substitutionGroup="gmd:MD_ScopeCode"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MX_ScopeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:MX_ScopeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/uomItem.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/uomItem.xsd
new file mode 100644
index 0000000..8421eb8
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gmx/uomItem.xsd
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gmx" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gml="http://www.opengis.net/gml" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmx="http://www.isotc211.org/2005/gmx">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 03-15-2005 09:15:02 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="../gml/gml.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/gmd.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="UnitDefinition_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="BaseUnit_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:BaseUnit"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="DerivedUnit_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:DerivedUnit"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!-- ........................................................................ -->
+	<xs:complexType name="ConventionalUnit_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:ConventionalUnit"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_BaseUnit_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:BaseUnitType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:UomAlternativeExpression_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_BaseUnit" type="gmx:ML_BaseUnit_Type" substitutionGroup="gml:BaseUnit"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_BaseUnit_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_BaseUnit"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_DerivedUnit_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:DerivedUnitType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:UomAlternativeExpression_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_DerivedUnit" type="gmx:ML_DerivedUnit_Type" substitutionGroup="gml:DerivedUnit"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_DerivedUnit_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_DerivedUnit"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_ConventionalUnit_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:ConventionalUnitType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:UomAlternativeExpression_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_ConventionalUnit" type="gmx:ML_ConventionalUnit_Type" substitutionGroup="gml:ConventionalUnit"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_ConventionalUnit_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_ConventionalUnit"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="ML_UnitDefinition_Type">
+		<xs:complexContent>
+			<xs:extension base="gml:UnitDefinitionType">
+				<xs:sequence>
+					<xs:element name="alternativeExpression" type="gmx:UomAlternativeExpression_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="ML_UnitDefinition" type="gmx:ML_UnitDefinition_Type" substitutionGroup="gml:UnitDefinition"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="ML_UnitDefinition_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:ML_UnitDefinition"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<!--===================== Alternative Expresssion type ===============================-->
+	<xs:complexType name="UomAlternativeExpression_Type">
+		<xs:annotation>
+			<xs:documentation>XML attributes contraints: - 1) Id is mandatory - 2) codeSpace (type xsd:anyURI) is mandatory</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gml:UnitDefinitionType">
+				<xs:sequence>
+					<xs:element name="locale" type="gmd:PT_Locale_PropertyType"/>
+				</xs:sequence>
+				<xs:attribute name="codeSpace" type="xs:anyURI" use="required"/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="UomAlternativeExpression" type="gmx:UomAlternativeExpression_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="UomAlternativeExpression_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmx:UomAlternativeExpression"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- =========================================================================== -->
+	<!-- === End of file === -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gsr/gsr.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gsr/gsr.xsd
new file mode 100644
index 0000000..8f7f428
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gsr/gsr.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gsr" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gsr="http://www.isotc211.org/2005/gsr">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:24:48 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="../gsr/spatialReferencing.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gsr/spatialReferencing.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gsr/spatialReferencing.xsd
new file mode 100644
index 0000000..246c934
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gsr/spatialReferencing.xsd
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gsr" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gsr="http://www.isotc211.org/2005/gsr">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:24:48 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="../gml/gml.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ........................................................................ -->
+	<!--==XCGE: gml:AbstractCRS==-->
+	<!-- ........................................................................ -->
+	<xs:complexType name="SC_CRS_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractCRS"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gss/geometry.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gss/geometry.xsd
new file mode 100644
index 0000000..e9e56d5
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gss/geometry.xsd
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gss" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:gss="http://www.isotc211.org/2005/gss">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:14:37 ====== The geometry packages (Figure 4) contain the various classes for coordinate geometry. All of these classes through the root class GM_Object inherit an optional association to a coordinate reference system. All direct positions exposed through the interfaces defined in this standard shall be in the coordinate reference system of the geometric object accessed. All elements of a geom [...]
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="../gml/gml.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ........................................................................ -->
+	<!--==XCGE: gml:Point==-->
+	<!-- ........................................................................ -->
+	<xs:complexType name="GM_Point_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:Point"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<!--==XCGE: gml:AbstractGeometry==-->
+	<!-- ........................................................................ -->
+	<xs:complexType name="GM_Object_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractGeometry"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gss/gss.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gss/gss.xsd
new file mode 100644
index 0000000..f8cac18
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gss/gss.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gss" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gss="http://www.isotc211.org/2005/gss">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:14:37 ====== This package contains the normative (Geometry and Topology) parts of the model for ISO 19107. This document should be referred to as the official description of the Model. If there are any differences, then ISO 19107 takes precedence.  -  - This packages also contains example (informative) of applications of 19107.</xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="../gss/geometry.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gts/gts.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gts/gts.xsd
new file mode 100644
index 0000000..a4edb52
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gts/gts.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gts" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gts="http://www.isotc211.org/2005/gts">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:18:09 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="../gts/temporalObjects.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gts/temporalObjects.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gts/temporalObjects.xsd
new file mode 100644
index 0000000..2145982
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/gts/temporalObjects.xsd
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema targetNamespace="http://www.isotc211.org/2005/gts" elementFormDefault="qualified" version="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:gts="http://www.isotc211.org/2005/gts">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:18:09 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.opengis.net/gml" schemaLocation="../gml/gml.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<!-- ........................................................................ -->
+	<!--==XCGE: gml:AbstractTimePrimitive==-->
+	<!-- ........................................................................ -->
+	<xs:complexType name="TM_Primitive_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gml:AbstractTimePrimitive"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="TM_PeriodDuration" type="xs:duration"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="TM_PeriodDuration_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gts:TM_PeriodDuration"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/Codelist/ML_gmxCodelists.xml b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/Codelist/ML_gmxCodelists.xml
new file mode 100644
index 0000000..3400509
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/Codelist/ML_gmxCodelists.xml
@@ -0,0 +1,819 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CT_CodelistCatalogue xmlns="http://www.isotc211.org/2005/gmx" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmx ../../gmx/gmx.xsd http://www.isotc211.org/2005/gmd ../../gmd/gmd.xsd http://www.isotc211.org/2005/gco ../../gco/gco.xsd http://www.w3.org/1999/xlink . [...]
+	<!--=====Catalogue description=====-->
+	<name>
+		<gco:CharacterString>ML_gmxCodelists</gco:CharacterString>
+	</name>
+	<scope xsi:type="gmd:PT_FreeText_PropertyType">
+		<gco:CharacterString>Codelists for description of metadata datasets compliant with ISO/TC 211 19115:2003 and 19139</gco:CharacterString>
+		<gmd:PT_FreeText>
+			<gmd:textGroup>
+				<gmd:LocalisedCharacterString locale="#xpointer(//*[@id='fra'])">Listes de codes pour la description de lots de métadonnées conforme ISO TC/211 19115:2003 et 19139</gmd:LocalisedCharacterString>
+			</gmd:textGroup>
+		</gmd:PT_FreeText>
+	</scope>
+	<fieldOfApplication>
+		<gco:CharacterString>GMX (and imported) namespace</gco:CharacterString>
+	</fieldOfApplication>
+	<versionNumber>
+		<gco:CharacterString>0.0</gco:CharacterString>
+	</versionNumber>
+	<versionDate>
+		<gco:Date>2005-03-18</gco:Date>
+	</versionDate>
+	<!--=== for Cultural and Linguistic Adaptability ===-->
+	<!--Default language-->
+	<language><gmd:LanguageCode codeList="#LanguageCode" codeListValue="eng">English</gmd:LanguageCode></language>
+	<characterSet><gmd:MD_CharacterSetCode codeList="#MD_CharacterSetCode" codeListValue="utf8">UTF 8</gmd:MD_CharacterSetCode></characterSet>
+	<!-- List of the 'locales' into which free text values can be translated-->
+	<locale>
+		<gmd:PT_Locale id="fra">
+			<gmd:languageCode><gmd:LanguageCode codeList="#LanguageCode" codeListValue="fra">French</gmd:LanguageCode></gmd:languageCode>
+			<gmd:country><gmd:Country codeList="#Country" codeListValue="FR">France</gmd:Country></gmd:country>
+			<gmd:characterEncoding><gmd:MD_CharacterSetCode codeList="#MD_CharacterSetCode" codeListValue="utf8">UTF 8</gmd:MD_CharacterSetCode></gmd:characterEncoding>
+		</gmd:PT_Locale>
+	</locale>
+	<!--============================================================================-->
+	<!--============================================================================-->
+	<!--============================= Codelists =======================================-->
+	<!--=== CI_DateTypeCode ===-->
+	<codelistItem>
+		<ML_CodeListDictionary gml:id="CI_DateTypeCode">
+			<gml:description>identification of when a given event occurred</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">CI_DateTypeCode</gml:identifier>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="CI_DateTypeCode_creation">
+					<gml:description>date identifies when the resource was brought into existence</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">creation</gml:identifier>
+					<gml:name>creation</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="CI_DateTypeCode_creation_fr" codeSpace="fra">
+							<gml:description>date identifiant la création de la ressource</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">creation</gml:identifier>
+							<gml:name>création</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="CI_DateTypeCode_publication">
+					<gml:description>date identifies when the resource was issued</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">publication</gml:identifier>
+					<gml:name>publication</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="CI_DateTypeCode_publication_fr" codeSpace="fra">
+							<gml:description>date identifiant la publication de la ressource</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">publication</gml:identifier>
+							<gml:name>publication</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="CI_DateTypeCode_revision">
+					<gml:description>date identifies when the resource was examined or re-examined and imporved or amended</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">revision</gml:identifier>
+					<gml:name>revision</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="CI_DateTypeCode_revision_fr" codeSpace="fra">
+							<gml:description>amélioration ou amendement de la ressource</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">revision</gml:identifier>
+							<gml:name>révision</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<alternativeExpression>
+				<ClAlternativeExpression gml:id="CI_DateTypeCode_fr" codeSpace="fra">
+					<gml:description>identification de quand un événement s'est produit</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">CI_DateTypeCode</gml:identifier>
+					<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+				</ClAlternativeExpression>
+			</alternativeExpression>
+		</ML_CodeListDictionary>
+	</codelistItem>
+	<!--=== CI_OnLineFunctionCode ===-->
+	<codelistItem>
+		<ML_CodeListDictionary gml:id="CI_OnLineFunctionCode">
+			<gml:description>function performed by the resource</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">CI_OnLineFunctionCode</gml:identifier>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="CI_OnLineFunctionCode_download">
+					<gml:description>online instructions for transferring data from one storage device or system to another</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">download</gml:identifier>
+					<gml:name>Download</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="CI_OnLineFunctionCode_download_fr" codeSpace="fra">
+							<gml:description>transfert de la ressource d'un système à un autre</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">download</gml:identifier>
+							<gml:name>Téléchargement</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="CI_OnLineFunctionCode_information">
+					<gml:description>online information about the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">information</gml:identifier>
+					<gml:name>Information</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="CI_OnLineFunctionCode_information_fr" codeSpace="fra">
+							<gml:description>description de la ressource en ligne</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">information</gml:identifier>
+							<gml:name>Information</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="CI_OnLineFunctionCode_offlineAccess">
+					<gml:description>online instructions for requesting the resource from the provider</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">offlineAccess</gml:identifier>
+					<gml:name>Off line access</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="CI_OnLineFunctionCode_offlineAccess_fr" codeSpace="fra">
+							<gml:description>information pour requérir la ressource</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">offlineAccess</gml:identifier>
+							<gml:name>Accès hors ligne</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="CI_OnLineFunctionCode_order">
+					<gml:description>online order process for obtening the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">order</gml:identifier>
+					<gml:name>Order</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="CI_OnLineFunctionCode_order_fr" codeSpace="fra">
+							<gml:description>formulaire pour obtenir la ressource</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">order</gml:identifier>
+							<gml:name>commande en ligne</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="CI_OnLineFunctionCode_search">
+					<gml:description>online search interface for seeking out information about the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">search</gml:identifier>
+					<gml:name>Search</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="CI_OnLineFunctionCode_search_fr" codeSpace="fra">
+							<gml:description>interface de recherche d'information sur la ressource</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">search</gml:identifier>
+							<gml:name>Moteur de recherche</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<alternativeExpression>
+				<ClAlternativeExpression gml:id="CI_OnLineFunctionCode_fr" codeSpace="fra">
+					<gml:description>Fonctionnalité offerte par la ressource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">CI_OnLineFunctionCode</gml:identifier>
+					<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+				</ClAlternativeExpression>
+			</alternativeExpression>
+		</ML_CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_CharacterSetCode ===-->
+	<codelistItem>
+		<ML_CodeListDictionary gml:id="MD_CharacterSetCode">
+			<gml:description>name of the character coding standard used in the resource</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_CharacterSetCode</gml:identifier>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_ucs2">
+					<gml:description>16-bit fixed size Universal Character Set, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">ucs2</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_ucs2_fr" codeSpace="fra">
+							<gml:description>16 bits ISO/IEC 10646</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">ucs2</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_ucs4">
+					<gml:description>32-bit fixed size Universal Character Set, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">ucs4</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_ucs4_fr" codeSpace="fra">
+							<gml:description>32 bits ISO/IEC 10646</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">ucs4</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_utf7">
+					<gml:description>7-bit variable size UCS Transfer Format, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">utf7</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_utf7_fr" codeSpace="fra">
+							<gml:description>7 bits ISO/IEC 10646</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">utf7</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_utf8">
+					<gml:description>8-bit variable size UCS Transfer Format, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">utf8</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_utf8_fr" codeSpace="fra">
+							<gml:description>8 bits ISO/IEC 10646</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">utf8</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_utf16">
+					<gml:description>16-bit variable size UCS Transfer Format, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">utf16</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_utf16_fr" codeSpace="fra">
+							<gml:description>16 bits ISO/IEC 10646</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">utf16</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part1">
+					<gml:description>ISO/IEC 8859-1, Information technology - 8-bit single byte coded graphic character sets - Part 1 : Latin alphabet No.1</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part1</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part1_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-1, alphabet latin 1</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part1</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part2">
+					<gml:description>ISO/IEC 8859-2, Information technology - 8-bit single byte coded graphic character sets - Part 2 : Latin alphabet No.2</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part2</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part2_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-2, alphabet latin 2</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part2</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part3">
+					<gml:description>ISO/IEC 8859-3, Information technology - 8-bit single byte coded graphic character sets - Part 3 : Latin alphabet No.3</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part3</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part3_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-3, alphabet latin 3</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part3</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part4">
+					<gml:description>ISO/IEC 8859-4, Information technology - 8-bit single byte coded graphic character sets - Part 4 : Latin alphabet No.4</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part4</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part4_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-4, alphabet latin 4</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part4</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part5">
+					<gml:description>ISO/IEC 8859-5, Information technology - 8-bit single byte coded graphic character sets - Part 5 : Latin/Cyrillic alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part5</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part5_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-5, alphabet latin/cyrillique</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part5</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part6">
+					<gml:description>ISO/IEC 8859-6, Information technology - 8-bit single byte coded graphic character sets - Part 6 : Latin/Arabic alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part6</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part6_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-6, alphabet latin/arabe</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part6</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part7">
+					<gml:description>ISO/IEC 8859-7, Information technology - 8-bit single byte coded graphic character sets - Part 7 : Latin/Greek alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part7</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part7_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-7, alphabet latin/grec</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part7</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part8">
+					<gml:description>ISO/IEC 8859-8, Information technology - 8-bit single byte coded graphic character sets - Part 8 : Latin/Hebrew alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part8</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part8_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-8, alphabet latin/hébreu</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part8</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part9">
+					<gml:description>ISO/IEC 8859-9, Information technology - 8-bit single byte coded graphic character sets - Part 9 : Latin alphabet No.5</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part9</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part9_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-9, alphabet latin 5</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part9</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part10">
+					<gml:description>ISO/IEC 8859-10, Information technology - 8-bit single byte coded graphic character sets - Part 10 : Latin alphabet No.6</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part10</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part10_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-10, alphabet latin 6</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part10</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part11">
+					<gml:description>ISO/IEC 8859-11, Information technology - 8-bit single byte coded graphic character sets - Part 11 : Latin/Thai alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part11</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part11_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-11, alphabet latin/Thaï</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part11</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<!-- <codeEntry>
+<ML_CodeDefinition gml:id="(reserved)">
+<gml:description>a future ISO/IEC 8-bit single byte coded graphic character set (e.g. possibly 8859 part 12</gml:description><gml:identifier codeSpace="ISOTC211/19115">(reserved)</gml:identifier>
+<alternativeExpression><AlternativeExpression gml:id="(reserved)_fr" codeSpace="fra">
+<gml:description>ISO/IEC 8859-12 (éventuellement)</gml:description><gml:identifier codeSpace="ISOTC211/19115">(reserved)</gml:identifier><locale xlink:href="#xpointer(//*[@id='fra'])"/>
+</AlternativeExpression></alternativeExpression>
+</ML_CodeDefinition>
+</codeEntry> -->
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part13">
+					<gml:description>ISO/IEC 8859-13, Information technology - 8-bit single byte coded graphic character sets - Part 13 : Latin alphabet No.7</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part13</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part13_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-13, alphabet latin 7</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part13</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part14">
+					<gml:description>ISO/IEC 8859-14, Information technology - 8-bit single byte coded graphic character sets - Part 14 : Latin alphabet No.8 (Celtic)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part14</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part14_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-14, alphabet latin 8 (celtique)</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part14</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part15">
+					<gml:description>ISO/IEC 8859-15, Information technology - 8-bit single byte coded graphic character sets - Part 15 : Latin alphabet No.9</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part15</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part15_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-15, alphabet latin 9</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part15</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_8859part16">
+					<gml:description>ISO/IEC 8859-16, Information technology - 8-bit single byte coded graphic character sets - Part 16 : Latin alphabet No.10</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part16</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_8859part16_fr" codeSpace="fra">
+							<gml:description>ISO/IEC 8859-16, alphabet latin 10</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">8859part16</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_jis">
+					<gml:description>japanese code set used for electronic transmission</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">jis</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_jis_fr" codeSpace="fra">
+							<gml:description>Japonais</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">jis</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_shiftJIS">
+					<gml:description>japanese code set used on MS-DOS machines</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">shiftJIS</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_shiftJIS_fr" codeSpace="fra">
+							<gml:description>Japonais pour MS-DOS</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">shiftJIS</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_eucJP">
+					<gml:description>japanese code set used on UNIX based machines</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">eucJP</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_eucJP_fr" codeSpace="fra">
+							<gml:description>Japonais pour UNIX</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">eucJP</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_usAscii">
+					<gml:description>United States ASCII code set (ISO 646 US)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">usAscii</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_usAscii_fr" codeSpace="fra">
+							<gml:description>ISO 646 US</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">usAscii</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_ebcdic">
+					<gml:description>IBM mainframe code set</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">ebcdic</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_ebcdic_fr" codeSpace="fra">
+							<gml:description>IBM</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">ebcdic</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_eucKR">
+					<gml:description>Korean code set</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">eucKR</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_eucKR_fr" codeSpace="fra">
+							<gml:description>Koréen</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">eucKR</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_big5">
+					<gml:description>traditional Chinese code set used in Taiwan, Hong Kong of China and other areas</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">big5</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_big5_fr" codeSpace="fra">
+							<gml:description>Chinois traditionel (Taiwan, Hong Kong, Chine)</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">big5</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_CharacterSetCode_GB2312">
+					<gml:description>simplified Chinese code set</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">GB2312</gml:identifier>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_CharacterSetCode_GB2312_fr" codeSpace="fra">
+							<gml:description>Chinois simplifié</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">GB2312</gml:identifier>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<alternativeExpression>
+				<ClAlternativeExpression gml:id="MD_CharacterSetCode_fr" codeSpace="fra">
+					<gml:description>Jeu de caractères</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">MD_CharacterSetCode</gml:identifier>
+					<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+				</ClAlternativeExpression>
+			</alternativeExpression>
+		</ML_CodeListDictionary>
+	</codelistItem>
+	<!--===MD_ScopeCode===-->
+	<codelistItem>
+		<ML_CodeListDictionary gml:id="MD_ScopeCode">
+			<gml:description>class of information to which the referencing entity applies</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_ScopeCode</gml:identifier>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_ScopeCode_attribute">
+					<gml:description>Information applies to the attribute class</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">attribute</gml:identifier>
+					<gml:name>Attribute</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_attribute_fr" codeSpace="fra">
+							<gml:description>Information qui s’applique à une classe d’attributs</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">attribute</gml:identifier>
+							<gml:name>Attribut</gml:name>
+							<locale xlink:href="#fra"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_ScopeCode_attributeType">
+					<gml:description>Information applies to the characteristic of a feature</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">attributeType</gml:identifier>
+					<gml:name>Attribute type</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_attributeType_fr" codeSpace="fra">
+							<gml:description>Information qui s’applique à la caractéristique d’une entité géographique</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">attributeType</gml:identifier>
+							<gml:name>Type d’attribut</gml:name>
+							<locale xlink:href="#fra"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_ScopeCode_dataset">
+					<gml:description>Information applies to the dataset</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">dataset</gml:identifier>
+					<gml:name>Dataset</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_dataset_fr" codeSpace="fra">
+							<gml:description>Information qui s’applique au jeu de données</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">dataset</gml:identifier>
+							<gml:name>Jeu de données</gml:name>
+							<locale xlink:href="#fra"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_dataset_dc" codeSpace="domainCode">
+							<gml:description>Information applies to the dataset</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">dataset</gml:identifier>
+							<gml:name>005</gml:name>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_ScopeCode_series">
+					<gml:description>Information applies to the series</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">series</gml:identifier>
+					<gml:name>Series</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_series_fr" codeSpace="fra">
+							<gml:description>Information qui s’applique à une série</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">series</gml:identifier>
+							<gml:name>Série</gml:name>
+							<locale xlink:href="#fra"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_ScopeCode_nonGeographicDataset">
+					<gml:description>Information applies to non-geographic data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">nonGeographicDataset</gml:identifier>
+					<gml:name>Non geographic dataset</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_nonGeographicDataset_fr" codeSpace="fra">
+							<gml:description>Information qui s’applique à des données non-géographiques</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">nonGeographicDataset</gml:identifier>
+							<gml:name>Jeu de données non géographiques</gml:name>
+							<locale xlink:href="#fra"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_ScopeCode_feature">
+					<gml:description>Information applies to a feature</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">feature</gml:identifier>
+					<gml:name>Feature</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_feature_fr" codeSpace="fra">
+							<gml:description>Information qui s’applique à un élément (entité géographique)</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">feature</gml:identifier>
+							<gml:name>Elément</gml:name>
+							<locale xlink:href="#fra"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_ScopeCode_featureType">
+					<gml:description>Information applies to a feature type</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">featureType</gml:identifier>
+					<gml:name>Feature type</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_featureType_fr" codeSpace="fra">
+							<gml:description>Information qui s’applique à un type d’élément</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">featureType</gml:identifier>
+							<gml:name>Type d’élément</gml:name>
+							<locale xlink:href="#fra"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_ScopeCode_propertyType">
+					<gml:description>Information applies to a property type</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">propertyType</gml:identifier>
+					<gml:name>Property type</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_propertyType_fr" codeSpace="fra">
+							<gml:description>Information qui s’applique à un type de propriété</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">propertyType</gml:identifier>
+							<gml:name>Type de propriété</gml:name>
+							<locale xlink:href="#fra"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="MD_ScopeCode_tile">
+					<gml:description>Information applies to a tile, a spatial subset of geographic data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">tile</gml:identifier>
+					<gml:name>Tile</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="MD_ScopeCode_tile_fr" codeSpace="fra">
+							<gml:description>Information qui s’applique à une tuile, un sous-ensemble spatial de données géographiques</gml:description>
+							<gml:identifier codeSpace="ISOTC211/19115">tile</gml:identifier>
+							<gml:name>Tuile</gml:name>
+							<locale xlink:href="#fra"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<alternativeExpression>
+				<ClAlternativeExpression gml:id="MD_ScopeCode_fr" codeSpace="fra">
+					<gml:description>information sur l'entité sur laquelle les métadonnées s'appliquent</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">MD_ScopeCode</gml:identifier>
+					<locale xlink:href="#fra"/>
+				</ClAlternativeExpression>
+			</alternativeExpression>
+		</ML_CodeListDictionary>
+	</codelistItem>
+	<!--================================================-->
+	<!--============= Language and Country ================-->
+	<codelistItem>
+		<ML_CodeListDictionary gml:id="LanguageCode">
+			<gml:description>Language : ISO 639-2 (3 characters)</gml:description>
+			<gml:identifier codeSpace="ISO 639-2">LanguageCode</gml:identifier>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="LanguageCode_eng">
+					<gml:description>English</gml:description>
+					<gml:identifier codeSpace="ISO 639-2">eng</gml:identifier>
+					<gml:name>English</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="LanguageCode_eng_fr" codeSpace="fra">
+							<gml:description>Anglais</gml:description>
+							<gml:identifier codeSpace="ISO 639-2">eng</gml:identifier>
+							<gml:name>Anglais</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="LanguageCode_fra">
+					<gml:description>French</gml:description>
+					<gml:identifier codeSpace="ISO 639-2">fra</gml:identifier>
+					<gml:name>French</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="LanguageCode_fra_fr" codeSpace="fra">
+							<gml:description>Français</gml:description>
+							<gml:identifier codeSpace="ISO 639-2">fra</gml:identifier>
+							<gml:name>Français</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<alternativeExpression>
+				<ClAlternativeExpression gml:id="LanguageCode_fr" codeSpace="fra">
+					<gml:description>Langue : ISO 639-2 (3 caractères)</gml:description>
+					<gml:identifier codeSpace="ISO 639-2">LanguageCode</gml:identifier>
+					<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+				</ClAlternativeExpression>
+			</alternativeExpression>
+		</ML_CodeListDictionary>
+	</codelistItem>
+	<!--...................................................................................................-->
+	<codelistItem>
+		<ML_CodeListDictionary gml:id="Country">
+			<gml:description>Country : ISO 3166-2 (2 characters)</gml:description>
+			<gml:identifier codeSpace="ISO 3166-2">Country</gml:identifier>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="Country_UK">
+					<gml:description>United Kingdom</gml:description>
+					<gml:identifier codeSpace="ISO 3166-2">UK</gml:identifier>
+					<gml:name>United Kingdom</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="Country_UK_fr" codeSpace="fra">
+							<gml:description>Royaume-Uni</gml:description>
+							<gml:identifier codeSpace="ISO 3166-2">UK</gml:identifier>
+							<gml:name>Royaume-Uni</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<ML_CodeDefinition gml:id="Country_FR">
+					<gml:description>France</gml:description>
+					<gml:identifier codeSpace="ISO 3166-2">FR</gml:identifier>
+					<gml:name>France</gml:name>
+					<alternativeExpression>
+						<CodeAlternativeExpression gml:id="Country_FR_fr" codeSpace="fra">
+							<gml:description>France</gml:description>
+							<gml:identifier codeSpace="ISO 3166-2">FR</gml:identifier>
+							<gml:name>France</gml:name>
+							<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+						</CodeAlternativeExpression>
+					</alternativeExpression>
+				</ML_CodeDefinition>
+			</codeEntry>
+			<alternativeExpression>
+				<ClAlternativeExpression gml:id="Country_fr" codeSpace="fra">
+					<gml:description>Pays : ISO 3166-2 (2 caractères)</gml:description>
+					<gml:identifier codeSpace="ISO 3166-2">Country</gml:identifier>
+					<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+				</ClAlternativeExpression>
+			</alternativeExpression>
+		</ML_CodeListDictionary>
+	</codelistItem>
+	<!--=========== EOF ===========-->
+</CT_CodelistCatalogue>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/Codelist/gmxCodelists.xml b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/Codelist/gmxCodelists.xml
new file mode 100644
index 0000000..9da91d5
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/Codelist/gmxCodelists.xml
@@ -0,0 +1,1858 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CT_CodelistCatalogue xmlns="http://www.isotc211.org/2005/gmx" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmx ../../gmx/gmx.xsd http://www.isotc211.org/2005/gco ../../gco/gco.xsd http://www.opengis.net/gml ../../gml/gml.xsd http://www.w3.org/1999/xlink ../../../../../../../../pycsw/schemas/w3c/xlink/xlink.xsd">
+	<!--=====Catalogue description=====-->
+	<name>
+		<gco:CharacterString>gmxCodelists</gco:CharacterString>
+	</name>
+	<scope>
+		<gco:CharacterString>Codelists for description of metadata datasets compliant with ISO/TC 211 19115:2003 and 19139</gco:CharacterString>
+	</scope>
+	<fieldOfApplication>
+		<gco:CharacterString>GMX (and imported) namespace</gco:CharacterString>
+	</fieldOfApplication>
+	<versionNumber>
+		<gco:CharacterString>0.0</gco:CharacterString>
+	</versionNumber>
+	<versionDate>
+		<gco:Date>2005-03-18</gco:Date>
+	</versionDate>
+	<!--============================================================================-->
+	<!--============================================================================-->
+	<!--============================= Codelists =======================================-->
+	<!--=== CI_DateTypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="CI_DateTypeCode">
+			<gml:description>identification of when a given event occurred</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">CI_DateTypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_DateTypeCode_creation">
+					<gml:description>date identifies when the resource was brought into existence</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">creation</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_DateTypeCode_publication">
+					<gml:description>date identifies when the resource was issued</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">publication</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_DateTypeCode_revision">
+					<gml:description>date identifies when the resource was examined or re-examined and imporved or amended</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">revision</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== CI_OnLineFunctionCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="CI_OnLineFunctionCode">
+			<gml:description>function performed by the resource</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">CI_OnLineFunctionCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_OnLineFunctionCode_download">
+					<gml:description>online instructions for transferring data from one storage device or system to another</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">download</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_OnLineFunctionCode_information">
+					<gml:description>online information about the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">information</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_OnLineFunctionCode_offlineAccess">
+					<gml:description>online instructions for requesting the resource from the provider</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">offlineAccess</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_OnLineFunctionCode_order">
+					<gml:description>online order process for obtening the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">order</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_OnLineFunctionCode_search">
+					<gml:description>online search interface for seeking out information about the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">search</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== CI_PresentationFormCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="CI_PresentationFormCode">
+			<gml:description>mode in which the data is represented</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">CI_PresentationFormCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_documentDigital">
+					<gml:description>digital representation of a primarily textual item (can contain illustrations also)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">documentDigital</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_documentHardcopy">
+					<gml:description>representation of a primarily textual item (can contain illustrations also) on paper, photograhic material, or other media</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">imageDigital</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_imageDigital">
+					<gml:description>likeness of natural or man-made features, objects, and activities acquired through the sensing of visual or any other segment of the electromagnetic spectrum by sensors, such as thermal infrared, and high resolution radar and stored in digital format</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">documentHardcopy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_imageHardcopy">
+					<gml:description>likeness of natural or man-made features, objects, and activities acquired through the sensing of visual or any other segment of the electromagnetic spectrum by sensors, such as thermal infrared, and high resolution radar and reproduced on paper, photographic material, or other media for use directly by the human user</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">imageHardcopy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_mapDigital">
+					<gml:description>map represented in raster or vector form</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">mapDigital</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_mapHardcopy">
+					<gml:description>map printed on paper, photographic material, or other media for use directly by the human user</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">mapHardcopy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_modelDigital">
+					<gml:description>multi-dimensional digital representation of a feature, process, etc.</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">modelDigital</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_modelHardcopy">
+					<gml:description>3-dimensional, physical model</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">modelHardcopy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_profileDigital">
+					<gml:description>vertical cross-section in digital form</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">profileDigital</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_profileHardcopy">
+					<gml:description>vertical cross-section printed on paper, etc.</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">profileHardcopy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_tableDigital">
+					<gml:description>digital representation of facts or figures systematically displayed, especially in columns</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">tableDigital</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_tableHardcopy">
+					<gml:description>representation of facts or figures systematically displayed, especially in columns, printed onpapers, photographic material, or other media</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">tableHardcopy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_videoDigital">
+					<gml:description>digital video recording</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">videoDigital</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_PresentationFormCode_videoHardcopy">
+					<gml:description>video recording on film</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">videoHardcopy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== CI_RoleCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="CI_RoleCode">
+			<gml:description>function performed by the responsible party</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">CI_RoleCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_resourceProvider">
+					<gml:description>party that supplies the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">resourceProvider</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_custodian">
+					<gml:description>party that accepts accountability and responsability for the data and ensures appropriate care and maintenance of the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">custodian</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_owner">
+					<gml:description>party that owns the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">owner</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_user">
+					<gml:description>party who uses the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">user</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_distributor">
+					<gml:description>party who distributes the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">distributor</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_originator">
+					<gml:description>party who created the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">originator</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_pointOfContact">
+					<gml:description>party who can be contacted for acquiring knowledge about or acquisition of the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">pointOfContact</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_principalInvestigator">
+					<gml:description>key party responsible for gathering information and conducting research</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">principalInvestigator</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_processor">
+					<gml:description>party wha has processed the data in a manner such that the resource has been modified</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">processor</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_publisher">
+					<gml:description>party who published the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">publisher</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="CI_RoleCode_author">
+					<gml:description>party who authored the resource</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">author</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== DQ_EvaluationMethodTypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="DQ_EvaluationMethodTypeCode">
+			<gml:description>type or method for evaluating an identified data quality measure</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">DQ_EvaluationMethodTypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="DQ_EvaluationMethodTypeCode_directInternal">
+					<gml:description>method of evaluating the quality of a dataset based on inspection of items within the dataset, where all data required is internal to the dataset being evaluated</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">directInternal</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DQ_EvaluationMethodTypeCode_directExternal">
+					<gml:description>method of evaluating the quality of a dataset based on inspection of items within the dataset, where reference data external to the dataset being evaluated is required</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">directExternal</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DQ_EvaluationMethodTypeCode_indirect">
+					<gml:description>method of evaluating the quality of a dataset based on external knowledge</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">indirect</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== DS_AssociationTypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="DS_AssociationTypeCode">
+			<gml:description>justification for the correlation of two datasets</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">DS_AssociationTypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_AssociationTypeCode_crossReference">
+					<gml:description>reference from one dataset to another</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">crossReference</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_AssociationTypeCode_largerWorkCitation">
+					<gml:description>reference to a master dataset of which this one is a part</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">largerWorkCitation</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_AssociationTypeCode_partOfSeamlessDatabase">
+					<gml:description>part of the same structured set of data held in a computer</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">partOfSeamlessDatabase</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_AssociationTypeCode_source">
+					<gml:description>mapping and charting information from which the dataset content originates</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">source</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_AssociationTypeCode_stereoMate">
+					<gml:description>part of a set of imagery that when used together, provides three-dimensional images</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">stereoMate</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== DS_InitiativeTypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="DS_InitiativeTypeCode">
+			<gml:description>type of aggregation activity in which datasets are related</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">DS_InitiativeTypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_campaign">
+					<gml:description>series of organized planned actions</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">campaign</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_collection">
+					<gml:description>accumulation of datasets assembled for a specific purpose</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">collection</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_exercise">
+					<gml:description>specific performance of a function or group of functions</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">exercise</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_experiment">
+					<gml:description>process designed to find if something is effective or valid</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">experiment</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_investigation">
+					<gml:description>search or systematic inquiry</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">investigation</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_mission">
+					<gml:description>specific operation of a data collection system</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">mission</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_sensor">
+					<gml:description>device or piece of equipment which detects or records</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">sensor</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_operation">
+					<gml:description>action that is part of a series of actions</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">operation</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_platform">
+					<gml:description>vehicle or other support base that holds a sensor</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">platform</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_process">
+					<gml:description>method of doing something involving a number of steps</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">process</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_program">
+					<gml:description>specific planned activity</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">program</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_project">
+					<gml:description>organized undertaking, research, or development</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">project</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_study">
+					<gml:description>examination or investigation</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">study</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_task">
+					<gml:description>piece of work</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">task</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="DS_InitiativeTypeCode_trial">
+					<gml:description>process of testing to discover or demonstrate something</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">trial</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_CellGeometryCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_CellGeometryCode">
+			<gml:description>code indicating whether grid data is point or area</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_CellGeometryCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CellGeometryCode_point">
+					<gml:description>each cell represents a point</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">point</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CellGeometryCode_area">
+					<gml:description>each cell represents an area</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">area</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_CharacterSetCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_CharacterSetCode">
+			<gml:description>name of the character coding standard used in the resource</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_CharacterSetCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_ucs2">
+					<gml:description>16-bit fixed size Universal Character Set, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">ucs2</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_ucs4">
+					<gml:description>32-bit fixed size Universal Character Set, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">ucs4</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_utf7">
+					<gml:description>7-bit variable size UCS Transfer Format, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">utf7</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_utf8">
+					<gml:description>8-bit variable size UCS Transfer Format, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">utf8</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_utf16">
+					<gml:description>16-bit variable size UCS Transfer Format, based on ISO/IEC 10646</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">utf16</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part1">
+					<gml:description>ISO/IEC 8859-1, Information technology - 8-bit single byte coded graphic character sets - Part 1 : Latin alphabet No.1</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part1</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part2">
+					<gml:description>ISO/IEC 8859-2, Information technology - 8-bit single byte coded graphic character sets - Part 2 : Latin alphabet No.2</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part2</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part3">
+					<gml:description>ISO/IEC 8859-3, Information technology - 8-bit single byte coded graphic character sets - Part 3 : Latin alphabet No.3</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part3</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part4">
+					<gml:description>ISO/IEC 8859-4, Information technology - 8-bit single byte coded graphic character sets - Part 4 : Latin alphabet No.4</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part4</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part5">
+					<gml:description>ISO/IEC 8859-5, Information technology - 8-bit single byte coded graphic character sets - Part 5 : Latin/Cyrillic alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part5</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part6">
+					<gml:description>ISO/IEC 8859-6, Information technology - 8-bit single byte coded graphic character sets - Part 6 : Latin/Arabic alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part6</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part7">
+					<gml:description>ISO/IEC 8859-7, Information technology - 8-bit single byte coded graphic character sets - Part 7 : Latin/Greek alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part7</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part8">
+					<gml:description>ISO/IEC 8859-8, Information technology - 8-bit single byte coded graphic character sets - Part 8 : Latin/Hebrew alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part8</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part9">
+					<gml:description>ISO/IEC 8859-9, Information technology - 8-bit single byte coded graphic character sets - Part 9 : Latin alphabet No.5</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part9</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part10">
+					<gml:description>ISO/IEC 8859-10, Information technology - 8-bit single byte coded graphic character sets - Part 10 : Latin alphabet No.6</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part10</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part11">
+					<gml:description>ISO/IEC 8859-11, Information technology - 8-bit single byte coded graphic character sets - Part 11 : Latin/Thai alphabet</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part11</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<!-- <codeEntry>
+<CodeDefinition gml:id="(reserved)">
+<gml:description>a future ISO/IEC 8-bit single byte coded graphic character set (e.g. possibly 8859 part 12</gml:description><gml:identifier codeSpace="ISOTC211/19115">(reserved)</gml:identifier>
+</CodeDefinition>
+</codeEntry> -->
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part13">
+					<gml:description>ISO/IEC 8859-13, Information technology - 8-bit single byte coded graphic character sets - Part 13 : Latin alphabet No.7</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part13</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part14">
+					<gml:description>ISO/IEC 8859-14, Information technology - 8-bit single byte coded graphic character sets - Part 14 : Latin alphabet No.8 (Celtic)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part14</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part15">
+					<gml:description>ISO/IEC 8859-15, Information technology - 8-bit single byte coded graphic character sets - Part 15 : Latin alphabet No.9</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part15</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_8859part16">
+					<gml:description>ISO/IEC 8859-16, Information technology - 8-bit single byte coded graphic character sets - Part 16 : Latin alphabet No.10</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8859part16</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_jis">
+					<gml:description>japanese code set used for electronic transmission</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">jis</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_shiftJIS">
+					<gml:description>japanese code set used on MS-DOS machines</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">shiftJIS</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_eucJP">
+					<gml:description>japanese code set used on UNIX based machines</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">eucJP</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_usAscii">
+					<gml:description>United States ASCII code set (ISO 646 US)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">usAscii</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_ebcdic">
+					<gml:description>IBM mainframe code set</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">ebcdic</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_eucKR">
+					<gml:description>Korean code set</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">eucKR</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_big5">
+					<gml:description>traditional Chinese code set used in Taiwan, Hong Kong of China and other areas</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">big5</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CharacterSetCode_GB2312">
+					<gml:description>simplified Chinese code set</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">GB2312</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_ClassificationCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_ClassificationCode">
+			<gml:description>name of the handling restrictions on the dataset</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_ClassificationCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ClassificationCode_unclassified">
+					<gml:description>available for general disclosure</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">unclassified</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ClassificationCode_restricted">
+					<gml:description>not for general disclosure</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">restricted</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ClassificationCode_confidential">
+					<gml:description>available for someone who can be entrusted with information</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">confidential</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ClassificationCode_secret">
+					<gml:description>kept or meant to be kept private, unknown, or hidden from all but a select group of people</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">secret</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ClassificationCode_topSecret">
+					<gml:description>of the highest secrecy</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">topSecret</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_CoverageContentTypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_CoverageContentTypeCode">
+			<gml:description>specific type of information represented in the cell</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_CoverageContentTypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CoverageContentTypeCode_image">
+					<gml:description>meaningful numerical representation of a physical parameter that is not the actual value of the physical parameter</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">image</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CoverageContentTypeCode_thematicClassification">
+					<gml:description>code value with no quantitative meaning, used to represent a physical quantity</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">thematicClassification</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_CoverageContentTypeCode_physicalMeasurement">
+					<gml:description>value in physical units of the quantity being measured</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">physicalMeasurement</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_DatatypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_DatatypeCode">
+			<gml:description>datatype of element or entity</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_DatatypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_class">
+					<gml:description>descriptor of a set of objects that share the same attributes, operations, methods, relationships, and behavior</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">class</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_codelist">
+					<gml:description>descriptor of a set of objects that share the same attributes, operations, methods, relationships, and behavior</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">codelist</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_enumeration">
+					<gml:description>data type whose instances form a list of named literal values, not extendable</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">enumeration</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_codelistElement">
+					<gml:description>permissible value for a codelist or enumeration</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">codelistElement</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_abstractClass">
+					<gml:description>class that cannot be directly instantiated</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">abstractClass</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_aggregateClass">
+					<gml:description>class that is composed of classes it is connected to by an aggregate relationship</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">aggregateClass</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_specifiedClass">
+					<gml:description>subclass that may be substituted for its superclass</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">specifiedClass</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_datatypeClass">
+					<gml:description>class with few or no operations whose primary purpose is to hold the abstract state of another class for transmittal, storage, encoding or persistent storage</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">datatypeClass</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_interfaceClass">
+					<gml:description>named set of operations that characterize the behavior of an element</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">interfaceClass</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_unionClass">
+					<gml:description>class describing a selection of one of the specified types</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">unionClass</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_metaClass">
+					<gml:description>class whose instances are classes</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">metaClass</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_typeClass">
+					<gml:description>class used for specification of a domain of instances (objects), together with the operations applicable to the objects. A type may have attributes and associations</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">typeClass</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_characterString">
+					<gml:description>free text field</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">characterString</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_integer">
+					<gml:description>numerical field</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">integer</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DatatypeCode_association">
+					<gml:description>semantic relationship between two classes that involves connections among their instances</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">association</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_DimensionNameTypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_DimensionNameTypeCode">
+			<gml:description>name of the dimension</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_DimensionNameTypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DimensionNameTypeCode_row">
+					<gml:description>ordinate (y) axis</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">row</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DimensionNameTypeCode_column">
+					<gml:description>abscissa (x) axis</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">column</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DimensionNameTypeCode_vertical">
+					<gml:description>vertical (z) axis</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">vertical</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DimensionNameTypeCode_track">
+					<gml:description>along the direction of motion of the scan point</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">track</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DimensionNameTypeCode_crossTrack">
+					<gml:description>perpendicular to the direction of motion of the scan point</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">crossTrack</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DimensionNameTypeCode_line">
+					<gml:description>scan line of a sensor</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">line</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DimensionNameTypeCode_sample">
+					<gml:description>element along a scan line</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">sample</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_DimensionNameTypeCode_time">
+					<gml:description>duration</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">time</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_GeometricObjectTypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_GeometricObjectTypeCode">
+			<gml:description>name of point or vector objects used to locate zero-, one-, two-, or three-dimensional spatial locations in the dataset</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_GeometricObjectTypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_GeometricObjectTypeCode_complex">
+					<gml:description>set of geometric primitives such that their boundaries can be represented as a union of other primitives</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">complex</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_GeometricObjectTypeCode_composite">
+					<gml:description>connected set of curves, solids or surfaces</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">composite</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_GeometricObjectTypeCode_curve">
+					<gml:description>bounded, 1-dimensional geometric primitive, representing the continuous image of a line</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">curve</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_GeometricObjectTypeCode_point">
+					<gml:description>zero-dimensional geometric primitive, representing a position but not having an extent</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">point</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_GeometricObjectTypeCode_solid">
+					<gml:description>bounded, connected 3-dimensional geometric primitive, representing the continuous image of a region of space</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">solid</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_GeometricObjectTypeCode_surface">
+					<gml:description>bounded, connected 2-dimensional geometric primitive, representing the continuous image of a region of a plane</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">surface</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_ImagingConditionCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_ImagingConditionCode">
+			<gml:description>code which indicates conditions which may affect the image</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_ImagingConditionCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_blurredImage">
+					<gml:description>portion of the image is blurred</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">blurredImage</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_cloud">
+					<gml:description>portion of the image is partially obscured by cloud cover</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">cloud</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_degradingObliquity">
+					<gml:description>acute angle between the plane of the ecliptic (the plane of the Earth s orbit) and the plane of the celestial equator</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">degradingObliquity</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_fog">
+					<gml:description>portion of the image is partially obscured by fog</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">fog</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_heavySmokeOrDust">
+					<gml:description>portion of the image is partially obscured by heavy smoke or dust</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">heavySmokeOrDust</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_night">
+					<gml:description>image was taken at night</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">night</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_rain">
+					<gml:description>image was taken during rainfall</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">rain</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_semiDarkness">
+					<gml:description>image was taken during semi-dark conditions -- twilight conditions</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">semiDarkness</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_shadow">
+					<gml:description>portion of the image is obscured by shadow</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">shadow</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_snow">
+					<gml:description>portion of the image is obscured by snow</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">snow</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ImagingConditionCode_terrainMasking">
+					<gml:description>the absence of collection data of a given point or area caused by the relative location of topographic features which obstruct the collection path between the collector(s) and the subject(s) of interest</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">terrainMasking</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_KeywordTypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_KeywordTypeCode">
+			<gml:description>methods used to group similar keywords</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_KeywordTypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_KeywordTypeCode_discipline">
+					<gml:description>keyword identifies a branch of instruction or specialized learning</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">discipline</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_KeywordTypeCode_place">
+					<gml:description>keyword identifies a location</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">place</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_KeywordTypeCode_stratum">
+					<gml:description>keyword identifies the layer(s) of any deposited substance</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">stratum</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_KeywordTypeCode_temporal">
+					<gml:description>keyword identifies a time period related to the dataset</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">temporal</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_KeywordTypeCode_theme">
+					<gml:description>keyword identifies a particular subject or topic</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">theme</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_MaintenanceFrequencyCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_MaintenanceFrequencyCode">
+			<gml:description>frequency with which modifications and deletions are made to the data after it is first produced</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_MaintenanceFrequencyCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_continual">
+					<gml:description>data is repeatedly and frequently updated</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">continual</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_daily">
+					<gml:description>data is updated each day</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">daily</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_weekly">
+					<gml:description>data is updated on a weekly basis</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">weekly</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_fortnightly">
+					<gml:description>data is updated every two weeks</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">fortnightly</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_monthly">
+					<gml:description>data is updated each month</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">monthly</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_quartely">
+					<gml:description>data is updated every three months</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">quartely</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_biannually">
+					<gml:description>data is updated twice each year</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">biannually</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_annually">
+					<gml:description>data is updated every year</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">annually</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_asNeeded">
+					<gml:description>data is updated as deemed necessary</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">asNeeded</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_irregular">
+					<gml:description>data is updated in intervals that are uneven in duration</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">irregular</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_notPlanned">
+					<gml:description>there are no plans to update the data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">notPlanned</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MaintenanceFrequencyCode_unknown">
+					<gml:description>frequency of maintenance for the data is not known</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">unknwon</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_MediumFormatCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_MediumFormatCode">
+			<gml:description>method used to write to the medium</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_MediumFormatCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumFormatCode_cpio">
+					<gml:description>CoPy In / Out (UNIX file format and command)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">cpio</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumFormatCode_tar">
+					<gml:description>Tape ARchive</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">tar</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumFormatCode_highSierra">
+					<gml:description>high sierra file system</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">highSierra</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumFormatCode_iso9660">
+					<gml:description>information processing   volume and file structure of CD-ROM</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">iso9660</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumFormatCode_iso9660RockRidge">
+					<gml:description>rock ridge interchange protocol (UNIX)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">iso9660RockRidge</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumFormatCode_iso9660AppleHFS">
+					<gml:description>hierarchical file system (Macintosh)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">iso9660AppleHFS</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_MediumNameCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_MediumNameCode">
+			<gml:description>name of the medium</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_MediumNameCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_cdRom">
+					<gml:description>read-only optical disk</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">cdRom</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_dvd">
+					<gml:description>digital versatile disk</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">dvd</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_dvdRom">
+					<gml:description>digital versatile disk, read only</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">dvdRom</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_3halfInchFloppy">
+					<gml:description>3,5 inch magnetic disk</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">3halfInchFloppy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_5quarterInchFloppy">
+					<gml:description>5,25 inch magnetic disk</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">5quarterInchFloppy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_7trackTape">
+					<gml:description>7 track magnetic tape</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">7trackTape</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_9trackType">
+					<gml:description>9 track magnetic tape</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">9trackType</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_3480Cartridge">
+					<gml:description>3480 cartridge tape drive</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">3480Cartridge</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_3490Cartridge">
+					<gml:description>3490 cartridge tape drive</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">3490Cartridge</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_3580Cartridge">
+					<gml:description>3580 cartridge tape drive</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">3580Cartridge</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_4mmCartridgeTape">
+					<gml:description>4 millimetre magnetic tape</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">4mmCartridgeTape</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_8mmCartridgeTape">
+					<gml:description>8 millimetre magnetic tape</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">8mmCartridgeTape</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_1quarterInchCartridgeTape">
+					<gml:description>0,25 inch magnetic tape</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">1quarterInchCartridgeTape</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_digitalLinearTape">
+					<gml:description>half inch cartridge streaming tape drive</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">digitalLinearTape</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_onLine">
+					<gml:description>direct computer linkage</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">onLine</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_satellite">
+					<gml:description>linkage through a satellite communication system</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">satellite</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_telephoneLink">
+					<gml:description>communication through a telephone network</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">telephoneLink</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_MediumNameCode_hardcopy">
+					<gml:description>pamphlet or leaflet giving descriptive information</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">hardcopy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_ObligationCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_ObligationCode">
+			<gml:description>obligation of the element or entity</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_ObligationCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ObligationCode_mandatory">
+					<gml:description>element is always required</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">mandatory</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ObligationCode_optional">
+					<gml:description>element is not required</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">optional</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ObligationCode_conditional">
+					<gml:description>element is required when a specific condition is met</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">conditional</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_PixelOrientationCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_PixelOrientationCode">
+			<gml:description>point in a pixel corresponding to the Earth location of the pixel</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_PixelOrientationCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_PixelOrientationCode_center">
+					<gml:description>point halfway between the lower left and the upper right of the pixel</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">center</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_PixelOrientationCode_lowerLeft">
+					<gml:description>the corner in the pixel closest to the origin of the SRS; if two are at the same distance from the origin, the one with the smallest x-value</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">lowerLeft</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_PixelOrientationCode_lowerRight">
+					<gml:description>next corner counterclockwise from the lower left</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">lowerRight</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_PixelOrientationCode_upperRight">
+					<gml:description>next corner counterclockwise from the lower right</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">upperRight</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_PixelOrientationCode_upperLeft">
+					<gml:description>next corner counterclockwise from the upper right</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">upperLeft</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_ProgressCode===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_ProgressCode">
+			<gml:description>status of the dataset or progress of a review</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_ProgressCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ProgressCode_completed">
+					<gml:description>production of the data has been completed</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">completed</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ProgressCode_historicalArchive">
+					<gml:description>data has been stored in an offline storage facility</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">historicalArchive</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ProgressCode_obsolete">
+					<gml:description>data is no longer relevant</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">obsolete</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ProgressCode_onGoing">
+					<gml:description>data is continually being updated</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">onGoing</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ProgressCode_planned">
+					<gml:description>fixed date has been established upon or by which the data will be created or updated</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">planned</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ProgressCode_required">
+					<gml:description>data needs to be generated or updated</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">required</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ProgressCode_underDevelopment">
+					<gml:description>data is currently in the process of being created</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">underDevelopment</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_RestrictionCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_RestrictionCode">
+			<gml:description>limitation(s) placed upon the access or use of the data</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_RestrictionCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_RestrictionCode_copyright">
+					<gml:description>exclusive right to the publication, production, or sale of the rights to a literary, dramatic, musical, or artistic work, or to the use of a commercial print or label, granted by law for a specified period of time to an author, composer, artist, distributor</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">copyright</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_RestrictionCode_patent">
+					<gml:description>government has granted exclusive right to make, sell, use or license an invention or discovery</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">patent</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_RestrictionCode_patentPending">
+					<gml:description>produced or sold information awaiting a patent</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">patentPending</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_RestrictionCode_trademark">
+					<gml:description>a name, symbol, or other device identifying a product, officially registered and legally restricted to the use of the owner or manufacturer</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">trademark</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_RestrictionCode_license">
+					<gml:description>formal permission to do something</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">license</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_RestrictionCode_intellectualPropertyRights">
+					<gml:description>rights to financial benefit from and control of distribution of non-tangible property that is a result of creativity</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">intellectualPropertyRights</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_RestrictionCode_restricted">
+					<gml:description>withheld from general circulation or disclosure</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">restricted</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_RestrictionCode_otherRestrictions">
+					<gml:description>limitation not listed</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">otherRestrictions</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_ScopeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_ScopeCode">
+			<gml:description>class of information to which the referencing entity applies</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_ScopeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_attribute">
+					<gml:description>information applies to the attribute class</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">attribute</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_attributeType">
+					<gml:description>information applies to the characteristic of a feature</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">attributeType</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_collectionHardware">
+					<gml:description>information applies to the collection hardware class</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">collectionHardware</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_collectionSession">
+					<gml:description>information applies to the collection session</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">collectionSession</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_dataset">
+					<gml:description>information applies to the dataset</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">dataset</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_series">
+					<gml:description>information applies to the series</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">series</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_nonGeographicDataset">
+					<gml:description>information applies to non-geographic data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">nonGeographicDataset</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_dimensionGroup">
+					<gml:description>information applies to a dimension group</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">dimensionGroup</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_feature">
+					<gml:description>information applies to a feature</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">feature</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_featureType">
+					<gml:description>information applies to a feature type</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">featureType</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_propertyType">
+					<gml:description>information applies to a property type</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">propertyType</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_fieldSession">
+					<gml:description>information applies to a field session</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">fieldSession</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_software">
+					<gml:description>information applies to a computer program or routine</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">software</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_service">
+					<gml:description>information applies to a capability which a service provider entity makes available to a service user entity through a set of interfaces that define a behaviour, such as a use case</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">service</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_model">
+					<gml:description>information applies to a copy or imitation of an existing or hypothetical object</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">model</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_ScopeCode_tile">
+					<gml:description>information applies to a tile, a spatial subset of geographic data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">tile</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_SpatialRepresentationTypeCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_SpatialRepresentationTypeCode">
+			<gml:description>method used to represent geographic information in the dataset</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_SpatialRepresentationTypeCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_SpatialRepresentationTypeCode_vector">
+					<gml:description>vector data is used to represent geographic data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">vector</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_SpatialRepresentationTypeCode_grid">
+					<gml:description>grid data is used to represent geographic data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">grid</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_SpatialRepresentationTypeCode_textTable">
+					<gml:description>textual or tabular data is used to represent geographic data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">textTable</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_SpatialRepresentationTypeCode_tin">
+					<gml:description>triangulated irregular network</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">tin</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_SpatialRepresentationTypeCode_stereoModel">
+					<gml:description>three-dimensional view formed by the intersecting homologous rays of an overlapping pair of images</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">stereoModel</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_SpatialRepresentationTypeCode_video">
+					<gml:description>scene from a video recording</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">video</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_TopicCategoryCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_TopicCategoryCode">
+			<gml:description>high-level geographic data thematic classification to assist in the grouping and search of available geographic data sets. Can be used to group keywords as well. Listed examples are not exhaustive.</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_TopicCategoryCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_farming">
+					<gml:description>rearing of animals and/or cultivation of plants. Examples: agriculture, irrigation, aquaculture, plantations, herding, pests and diseases affecting crops and livestock</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">farming</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_biota">
+					<gml:description>flora and/or fauna in natural environment. Examples: wildlife, vegetation, biological sciences, ecology, wilderness, sealife, wetlands, habitat</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">biota</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_boundaries">
+					<gml:description>legal land descriptions. Examples: political and administrative boundaries</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">boundaries</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_climatologyMeteorologyAtmosphere">
+					<gml:description>processes and phenomena of the atmosphere. Examples: cloud cover, weather, climate, atmospheric conditions, climate change, precipitation</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">climatologyMeteorologyAtmosphere</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_economy">
+					<gml:description>economic activities, conditions and employment. Examples: production, labour, revenue, commerce, industry, tourism and ecotourism, forestry, fisheries, commercial or subsistence hunting, exploration and exploitation of resources such as minerals, oil and gas</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">economy</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_elevation">
+					<gml:description>height above or below sea level. Examples: altitude, bathymetry, digital elevation models, slope, derived products</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">elevation</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_environment">
+					<gml:description>environmental resources, protection and conservation. Examples: environmental pollution, waste storage and treatment, environmental impact assessment, monitoring environmental risk, nature reserves, landscape</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">environment</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_geoscientificInformation">
+					<gml:description>information pertaining to earth sciences. Examples: geophysical features and processes, geology, minerals, sciences dealing with the composition, structure and origin of the earth s rocks, risks of earthquakes, volcanic activity, landslides, gravity information, soils, permafrost, hydrogeology, erosion</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">geoscientificInformation</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_health">
+					<gml:description>health, health services, human ecology, and safety. Examples: disease and illness, factors affecting health, hygiene, substance abuse, mental and physical health, health services</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">health</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_imageryBaseMapsEarthCover">
+					<gml:description>base maps. Examples: land cover, topographic maps, imagery, unclassified images, annotations</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">imageryBaseMapsEarthCover</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_intelligenceMilitary">
+					<gml:description>military bases, structures, activities. Examples: barracks, training grounds, military transportation, information collection</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">intelligenceMilitary</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_inlandWaters">
+					<gml:description>inland water features, drainage systems and their characteristics. Examples: rivers and glaciers, salt lakes, water utilization plans, dams, currents, floods, water quality, hydrographic charts</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">inlandWaters</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_location">
+					<gml:description>positional information and services. Examples: addresses, geodetic networks, control points, postal zones and services, place names</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">location</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_oceans">
+					<gml:description>features and characteristics of salt water bodies (excluding inland waters). Examples: tides, tidal waves, coastal information, reefs</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">oceans</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_planningCadastre">
+					<gml:description>information used for appropriate actions for future use of the land. Examples: land use maps, zoning maps, cadastral surveys, land ownership</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">planningCadastre</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_society">
+					<gml:description>characteristics of society and cultures. Examples: settlements, anthropology, archaeology, education, traditional beliefs, manners and customs, demographic data, recreational areas and activities, social impact assessments, crime and justice, census information</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">society</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_structure">
+					<gml:description>man-made construction. Examples: buildings, museums, churches, factories, housing, monuments, shops, towers</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">structure</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_transportation">
+					<gml:description>means and aids for conveying persons and/or goods. Examples: roads, airports/airstrips, shipping routes, tunnels, nautical charts, vehicle or vessel location, aeronautical charts, railways</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">transportation</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopicCategoryCode_utilitiesCommunication">
+					<gml:description>energy, water and waste systems and communications infrastructure and services. Examples: hydroelectricity, geothermal, solar and nuclear sources of energy, water purification and distribution, sewage collection and disposal, electricity and gas distribution, data communication, telecommunication, radio, communication networks</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">utilitiesCommunication</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== MD_TopologyLevelCode ===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MD_TopologyLevelCode">
+			<gml:description>degree of complexity of the spatial relationships</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MD_TopologyLevelCode</gml:identifier>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopologyLevelCode_geometryOnly">
+					<gml:description>geometry objects without any additional structure which describes topology</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">geometryOnly</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopologyLevelCode_topology1D">
+					<gml:description>1-dimensional topological complex --  commonly called  chain-node  topology</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">topology1D</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopologyLevelCode_planarGraph">
+					<gml:description>1-dimensional topological complex that is planar. (A planar graph is a graph that can be drawn in a plane in such a way that no two edges intersect except at a vertex.)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">planarGraph</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopologyLevelCode_fullPlanarGraph">
+					<gml:description>2-dimensional topological complex that is planar. (A 2-dimensional topological complex is commonly called  full topology  in a cartographic 2D environment.)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">fullPlanarGraph</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopologyLevelCode_surfaceGraph">
+					<gml:description>1-dimensional topological complex that is isomorphic to a subset of a surface. (A geometric complex is isomorphic to a topological complex if their elements are in a one-to-one, dimensional-and boundry-preserving correspondence to one another.)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">surfaceGraph</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopologyLevelCode_fullSurfaceGraph">
+					<gml:description>2-dimensional topological complex that is isomorphic to a subset of a surface</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">fullSurfaceGraph</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopologyLevelCode_topology3D">
+					<gml:description>3-dimensional topological complex. (A topological complex is a collection of topological primitives that are closed under the boundary operations.)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">topology3D</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopologyLevelCode_fullTopology3D">
+					<gml:description>complete coverage of a 3D Euclidean coordinate space</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">fullTopology3D</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MD_TopologyLevelCode_abstract">
+					<gml:description>topological complex without any specified geometric realisation</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">abstract</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!---===MX_ScopeCode===-->
+	<codelistItem>
+		<CodeListDictionary gml:id="MX_ScopeCode">
+			<gml:description>Extension of MD_ScopeCode for the needs of GMX application schemas and in the context of a transfer</gml:description>
+			<gml:identifier codeSpace="ISOTC211/19115">MX_ScopeCode</gml:identifier>
+			<!--MD_ScopeCode values-->
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_attribute">
+					<gml:description>information applies to the attribute class</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">attribute</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_attributeType">
+					<gml:description>information applies to the characteristic of a feature</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">attributeType</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_collectionHardware">
+					<gml:description>information applies to the collection hardware class</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">collectionHardware</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_collectionSession">
+					<gml:description>information applies to the collection session</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">collectionSession</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_dataset">
+					<gml:description>information applies to the dataset</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">dataset</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_series">
+					<gml:description>information applies to the series</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">series</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_nonGeographicDataset">
+					<gml:description>information applies to non-geographic data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">nonGeographicDataset</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_dimensionGroup">
+					<gml:description>information applies to a dimension group</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">dimensionGroup</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_feature">
+					<gml:description>information applies to a feature</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">feature</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_featureType">
+					<gml:description>information applies to a feature type</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">featureType</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_propertyType">
+					<gml:description>information applies to a property type</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">propertyType</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_fieldSession">
+					<gml:description>information applies to a field session</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">fieldSession</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_software">
+					<gml:description>information applies to a computer program or routine</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">software</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_service">
+					<gml:description>information applies to a capability which a service provider entity makes available to a service user entity through a set of interfaces that define a behaviour, such as a use case</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">service</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_model">
+					<gml:description>information applies to a copy or imitation of an existing or hypothetical object</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">model</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_tile">
+					<gml:description>information applies to a tile, a spatial subset of geographic data</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">tile</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<!--MX_ScopeCode extensions-->
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_initiative">
+					<gml:description>The referencing entity applies to a transfer aggregate which was originally identified as an initiative (DS_Initiative)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">initiative</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_stereomate">
+					<gml:description>The referencing entity applies to a transfer aggregate which was originally identified as a stereo mate (DS_StereoMate)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">stereomate</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_sensor">
+					<gml:description>The referencing entity applies to a transfer aggregate which was originally identified as a sensor (DS_Sensor)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">sensor</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_platformSeries">
+					<gml:description>The referencing entity applies to a transfer aggregate which was originally identified as a platform series (DS_PlatformSeries)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">platformSeries</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_sensorSeries">
+					<gml:description>The referencing entity applies to a transfer aggregate which was originally identified as a sensor series (DS_SensorSeries)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">sensorSeries</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_productionSeries">
+					<gml:description>The referencing entity applies to a transfer aggregate which was originally identified as a production series (DS_ProductionSeries)</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">productionSeries</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_transferAggregate">
+					<gml:description>The referencing entity applies to a transfer aggregate which has no existence outside of the transfer context</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">transferAggregate</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+			<codeEntry>
+				<CodeDefinition gml:id="MX_ScopeCode_otherAggregate">
+					<gml:description>The referencing entity applies to a transfer aggregate which has an existence outside of the transfer context, but which does not pertains to a specific aggregate type.</gml:description>
+					<gml:identifier codeSpace="ISOTC211/19115">otherAggregate</gml:identifier>
+				</CodeDefinition>
+			</codeEntry>
+		</CodeListDictionary>
+	</codelistItem>
+	<!--=== EOF ===-->
+</CT_CodelistCatalogue>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/crs/ML_gmxCrs.xml b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/crs/ML_gmxCrs.xml
new file mode 100644
index 0000000..ce3020a
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/crs/ML_gmxCrs.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CT_CrsCatalogue xmlns="http://www.isotc211.org/2005/gmx" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmx ../../gmx/gmx.xsd http://www.isotc211.org/2005/gmd ../../gmd/gmd.xsd http://www.isotc211.org/2005/gco ../../gco/gco.xsd http://www.w3.org/1999/xlink ../../ [...]
+	<!--=====Catalogue description=====-->
+	<name><gco:CharacterString>ML_gmxCrs</gco:CharacterString></name>
+	<scope xsi:type="gmd:PT_FreeText_PropertyType">
+		<gco:CharacterString>CRS catalogue for description of gmx metadata dataset</gco:CharacterString>
+		<gmd:PT_FreeText><gmd:textGroup><gmd:LocalisedCharacterString locale="#xpointer(//*[@id='fra'])">Catalogue des paramètres géodésiques pour la description de jeux de métadonnées conformes aux schémas gmx</gmd:LocalisedCharacterString></gmd:textGroup></gmd:PT_FreeText>
+	</scope>
+	<fieldOfApplication><gco:CharacterString>GMX (and imported) namespace</gco:CharacterString></fieldOfApplication>
+	<versionNumber><gco:CharacterString>0.0</gco:CharacterString></versionNumber>
+	<versionDate><gco:Date>2005-03-29</gco:Date></versionDate>
+	<!--=== for Cultural and Linguistic Adaptability ===-->
+	<!--Default language-->
+	<language><gmd:LanguageCode codeList="../codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">English</gmd:LanguageCode></language>
+	<characterSet><gmd:MD_CharacterSetCode codeList="../codelist/ML_gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8">UTF 8</gmd:MD_CharacterSetCode></characterSet>
+	<!--List of the 'locales' into which free text values can be translated-->
+	<locale>
+		<gmd:PT_Locale id="fra">
+			<gmd:languageCode><gmd:LanguageCode codeList="../codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="french">French</gmd:LanguageCode></gmd:languageCode>
+			<gmd:country><gmd:Country codeList="../Codelist/ML_gmxCodelists.xm#Country" codeListValue="FR">France</gmd:Country></gmd:country>
+			<gmd:characterEncoding><gmd:MD_CharacterSetCode codeList="../Codelist/ML_gmxCodelists.xm#MD_CharacterSetCode" codeListValue="utf8">UTF 8</gmd:MD_CharacterSetCode></gmd:characterEncoding>
+			</gmd:PT_Locale>
+	</locale>
+	<!--============================================================================-->
+	<!--============================================================================-->
+	<!--======================= Coordinate reference systems ============================-->
+	<!--*** WGS 84 - CRS ***-->
+	<crs>
+		<ML_GeodeticCRS gml:id="ml_EPSG4326">
+			<gml:identifier codeSpace="EPSG_v65">4326</gml:identifier>
+			<gml:name codeSpace="IGN-F">WGS84G</gml:name>
+			<gml:name>World Geodetic System 1984</gml:name>
+			<gml:domainOfValidity><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicDescription>
+				<gmd:geographicIdentifier><gmd:MD_Identifier><gmd:code><gco:CharacterString>World</gco:CharacterString></gmd:code></gmd:MD_Identifier> </gmd:geographicIdentifier></gmd:EX_GeographicDescription></gmd:geographicElement></gmd:EX_Extent></gml:domainOfValidity>
+			<gml:scope>not known</gml:scope>
+			<gml:usesEllipsoidalCS xlink:href="#xpointer(//*[@gml:id='EPSG6422'])"/>
+			<gml:usesGeodeticDatum xlink:href="#xpointer(//*[@gml:id='EPSG6422')]"/>
+			<!--==alternative definition(s)==-->
+			<alternativeExpression>
+				<CrsAlt gml:id="ml_EPSG4326_fr" codeSpace="fra">
+					<gml:identifier codeSpace="EPSG_v65">4326</gml:identifier>
+					<gml:name codeSpace="IGN-F">WGS84G</gml:name>
+					<gml:name>WGS 1984</gml:name>
+					<gml:domainOfValidity><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicDescription>
+				<gmd:geographicIdentifier><gmd:MD_Identifier><gmd:code><gco:CharacterString>Monde</gco:CharacterString></gmd:code></gmd:MD_Identifier> </gmd:geographicIdentifier></gmd:EX_GeographicDescription></gmd:geographicElement></gmd:EX_Extent></gml:domainOfValidity>
+					<gml:scope>inconnu</gml:scope>
+					<locale  xlink:href="#xpointer(//*[@id='fra'])"/>
+				</CrsAlt>
+			</alternativeExpression>
+		</ML_GeodeticCRS>
+	</crs>
+	<!--============================ Coordinate systems ===============================-->
+	<!--*** Ellipsoidal - 2D - degree ***-->
+	<coordinateSystem>
+		<gml:EllipsoidalCS gml:id="EPSG6422">
+			<gml:identifier codeSpace="EPSG_v65">6422</gml:identifier>
+			<gml:name>ellipsoidal2Ddeg</gml:name>
+			<gml:axis xlink:href="#xpointer(//*[@gml:id='EPSG9901'])"/>
+			<gml:axis xlink:href="#xpointer(//*[@gml:id='EPSG9902'])"/>
+		</gml:EllipsoidalCS>
+	</coordinateSystem>
+	<!--========================== Coordinate system axis ==============================-->
+	<!--*** Latitude ***-->
+	<axis>
+		<gml:CoordinateSystemAxis gml:id="EPSG9901" gml:uom="../uom/ML_gmxUom.xsd#xpointer(//*[@gml:id='deg'])">
+			<gml:identifier codeSpace="EPSG_v65">9901</gml:identifier>
+			<gml:name>Geodetic latitude</gml:name>
+			<gml:axisAbbrev>Lat</gml:axisAbbrev>
+			<gml:axisDirection codeSpace="EPSG">North</gml:axisDirection>
+		</gml:CoordinateSystemAxis>
+	</axis>
+	<!--*** Longitude ***-->
+	<axis>
+		<gml:CoordinateSystemAxis gml:id="EPSG9902" gml:uom="../uom/ML_gmxUom.xsd#xpointer(//*[@gml:id='deg'])">
+			<gml:identifier codeSpace="EPSG_v65">9902</gml:identifier>
+			<gml:name>Geodetic longitude</gml:name>
+			<gml:axisAbbrev>Lon</gml:axisAbbrev>
+			<gml:axisDirection codeSpace="EPSG">East</gml:axisDirection>
+		</gml:CoordinateSystemAxis>
+	</axis>
+	<!--================================ Datums =====================================-->
+	<!--*** WGS 84 - Datum ***-->
+	<datum>
+		<gml:GeodeticDatum gml:id="EPSG6326">
+			<gml:identifier codeSpace="EPSG_v65">6326</gml:identifier>
+			<gml:name>World Geodetic System 1984</gml:name>
+			<gml:scope>not known</gml:scope>
+			<gml:primeMeridian xlink:href="#xpointer(//*[@gml:id='EPSG8901'])"/>
+			<gml:ellipsoid xlink:href="#xpointer(//*[@gml:id='EPSG7030'])"/>
+		</gml:GeodeticDatum>
+	</datum>
+	<!--================================ Ellipsoids ====================================-->
+	<!--*** WGS 84 - Ellipsoid ***-->
+	<ellipsoid>
+		<gml:Ellipsoid gml:id="EPSG7030">
+			<gml:identifier codeSpace="EPSG_v65">7030</gml:identifier>
+			<gml:name>WGS 84</gml:name>
+			<gml:semiMajorAxis uom="../uom/ML_gmxUom.xsd#xpointer(//*[@gml:id='m'])">6378137</gml:semiMajorAxis>
+			<gml:secondDefiningParameter><gml:SecondDefiningParameter>
+					<gml:inverseFlattening uom="../uom/ML_gmxUom.xsd#xpointer(//*[@gml:id='m'])">298.2572</gml:inverseFlattening>
+			</gml:SecondDefiningParameter></gml:secondDefiningParameter>
+		</gml:Ellipsoid>
+	</ellipsoid>
+	<!--============================== Prime meridians =================================-->
+	<!--*** Greenwich ***-->
+	<primeMeridian>
+		<gml:PrimeMeridian gml:id="EPSG8901">
+			<gml:identifier codeSpace="EPSG_v65">8901</gml:identifier>
+			<gml:name>Greenwich</gml:name>
+			<gml:greenwichLongitude uom="../uom/ML_gmxUom.xsd#xpointer(//*[@gml:id='deg'])">0</gml:greenwichLongitude>
+		</gml:PrimeMeridian>
+	</primeMeridian>
+	<!--================================ Operations ===================================-->
+	<!--============================= Operation methods ================================-->
+	<!--=========================== Operation parameters ================================-->
+</CT_CrsCatalogue>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/crs/gmxCrs.xml b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/crs/gmxCrs.xml
new file mode 100644
index 0000000..456218e
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/crs/gmxCrs.xml
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CT_CrsCatalogue xmlns="http://www.isotc211.org/2005/gmx" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmx ../../gmx/gmx.xsd http://www.isotc211.org/2005/gmd ../../gmd/gmd.xsd http://www.isotc211.org/2005/gco ../../gco/gco.xsd http://www.w3.org/1999/xlink ../../ [...]
+	<!--=====Catalogue description=====-->
+	<name><gco:CharacterString>gmxCrs</gco:CharacterString></name>
+	<scope><gco:CharacterString>CRS parameters dictionary</gco:CharacterString></scope>
+	<fieldOfApplication><gco:CharacterString>GMX (and imported) namespace</gco:CharacterString></fieldOfApplication>
+	<versionNumber><gco:CharacterString>0.0</gco:CharacterString></versionNumber>
+	<versionDate><gco:Date>2005-03-18</gco:Date></versionDate>
+	<!--============================================================================-->
+	<!--============================================================================-->
+	<!--======================= Coordinate reference systems ============================-->
+	<!--*** WGS 84 - CRS ***-->
+	<crs>
+		<gml:GeodeticCRS gml:id="EPSG4326">
+			<gml:identifier codeSpace="EPSG_v65">4326</gml:identifier>
+			<gml:name codeSpace="IGN-F">WGS84G</gml:name>
+			<gml:name>World Geodetic System 1984</gml:name>
+			<gml:domainOfValidity><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicDescription>
+				<gmd:geographicIdentifier><gmd:MD_Identifier><gmd:code><gco:CharacterString>World: Afghanistan, Albania, Algeria, American Samoa, Andorra, Angola, Anguilla, Antarctica, Antigua and Barbuda, Argentina, Armenia, Aruba, Australia, 
+	Austria, Azerbaijan, Bahamas, Bahrain, Bangladesh, Barbados, Belgium, Belgium, Belize, Benin, Bermuda, Bhutan, Bolivia, Bosnia and Herzegowina, 
+	Botswana, Bouvet Island, Brazil, British Indian Ocean Territory, British Virgin Islands, Brunei Darussalam, Bulgaria, Burkina Faso, Burundi, Cambodia, 
+	Cameroon, Canada, Cape Verde, Cayman Islands, Central African Republic, Chad, Chile, China, Christmas Island, Cocos (Keeling) Islands, Comoros, 
+	Congo, Cook Islands, Costa Rica, Côte d'Ivoire (Ivory Coast), Croatia, Cuba, Cyprus, Czech Republic, Denmark, Djibouti, Dominica, Dominican Republic, 
+	East Timor, Ecuador, Egypt, El Salvador, Equatorial Guinea, Eritrea, Estonia, Ethiopia, Falkland Islands (Malvinas), Faroe Islands, Fiji, Finland, France, 
+	French Guiana, French Polynesia, French Southern Territories, Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, 
+	Guadeloupe, Guam, Guatemala, Guinea, Guinea-Bissau, Guyana, Haiti, Heard Island and McDonald Islands, Holy See (Vatican City State), Honduras, China 
+	- Hong Kong, Hungary, Iceland, India, Indonesia, Islamic Republic of Iran, Iraq, Ireland, Israel, Italy, Jamaica, Japan, Jordan, Kazakstan, Kenya, Kiribati, 
+	Democratic People's Republic of Korea (North Korea), Republic of Korea (South Korea), Kuwait, Kyrgyzstan, Lao People's Democratic Republic (Laos), 
+	Latvia, Lebanon, Lesotho, Liberia, Libyan Arab Jamahiriya, Liechtenstein, Lithuania, Luxembourg, China - Macau, The Former Yugoslav Republic of 
+	Macedonia, Madagascar, Malawi, Malaysia, Maldives, Mali, Malta, Marshall Islands, Martinique, Mauritania, Mauritius, Mayotte, Mexico, Federated States 
+	of Micronesia, Monaco, Mongolia, Montserrat, Morocco, Mozambique, Myanmar (Burma), Namibia, Nauru, Nepal, Netherlands, Netherlands Antilles, New 
+	Caledonia, New Zealand, Nicaragua, Niger, Nigeria, Niue, Norfolk Island, Northern Mariana Islands, Norway, Oman, Pakistan, Palau, Panama, Papua New 
+	Guinea (PNG), Paraguay, Peru, Philippines, Pitcairn, Poland, Portugal, Puerto Rico, Qatar, Reunion, Romania, Russian Federation, Rwanda, Saint Kitts and 
+	Nevis, Saint Lucia, Saint Vincent and the Grenadines, Samoa, San Marino, Sao Tome and Principe, Saudi Arabia, Senegal, Seychelles, Sierra Leone, 
+	Singapore, Slovakia (Slovak Republic), Slovenia, Solomon Islands, Somalia, South Africa, South Georgia and the South Sandwich Islands, Spain, Sri Lanka, 
+	Saint Helena, Saint Pierre and Miquelon, Sudan, Suriname, Svalbard and Jan Mayen, Swaziland, Sweden, Switzerland, Syrian Arab Republic, Taiwan, 
+	Tajikistan, United Republic of Tanzania, Thailand, The Democratic Republic of the Congo (Zaire), Togo, Tokelau, Tonga, Trinidad and Tobago, Tunisia, 
+	Turkey, Turkmenistan, Turks and Caicos Islands, Tuvalu, Uganda, Ukraine, United Arab Emirates (UAE), United Kingdom (UK), United States (USA), 
+	United States Minor Outlying Islands, Uruguay, Uzbekistan, Vanuatu, Venezuela, Vietnam, US Virgin Islands, Wallis and Futuna, Western Sahara, Yemen, 
+	Yugoslavia - Union of Serbia and Montenegro, Zambia, Zimbabwe.</gco:CharacterString></gmd:code></gmd:MD_Identifier> </gmd:geographicIdentifier></gmd:EX_GeographicDescription></gmd:geographicElement></gmd:EX_Extent></gml:domainOfValidity>
+			<gml:scope>not known</gml:scope>
+			<gml:ellipsoidalCS xlink:href="#xpointer(//*[@gml:id='EPSG6422'])"/>
+			<gml:geodeticDatum xlink:href="#xpointer(//*[@gml:id='EPSG6326')]"/>
+		</gml:GeodeticCRS>
+	</crs>
+	<!--*** UTM 38 Nord ***-->
+	<crs>
+		<gml:ProjectedCRS gml:id="EPSG32638">
+			<gml:identifier codeSpace="EPSG_v65">32638</gml:identifier>
+			<gml:name codeSpace="IGN-F">UTM38W84</gml:name>
+			<gml:name>WGS 84 / UTM zone 38N</gml:name>
+			<gml:domainOfValidity><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicDescription>
+				<gmd:geographicIdentifier><gmd:MD_Identifier><gmd:code><gco:CharacterString>Between 42 and 48 deg East; northern hemisphere. Armenia. Azerbaijan. Djibouti. Eritrea. Ethiopia. Georgia. Islamic Republic of Iran. Iraq. Kazakstan. Kuwait. Russian Federation. Saudi Arabia. Somalia. Tukey. Yemen.</gco:CharacterString></gmd:code></gmd:MD_Identifier> </gmd:geographicIdentifier></gmd:EX_GeographicDescription></gmd:geographicElement></gmd:EX_Extent></gml:domainOfValidity>
+			<gml:scope>not known</gml:scope>
+			<gml:conversion xlink:href="#xpointer(//*[@gml:id='EPSG16038'])"/>
+			<gml:baseGeodeticCRS xlink:href="#xpointer(//*[@gml:id='EPSG4326'])"/><!--WGS84 - CRS-->
+			<gml:cartesianCS xlink:href="#EPSG4400"/>
+		</gml:ProjectedCRS>
+	</crs>
+	<!--============================ Coordinate systems ===============================-->
+	<!--*** Ellipsoidal - 2D - degree ***-->
+	<coordinateSystem>
+		<gml:EllipsoidalCS gml:id="EPSG6422">
+			<gml:description>Ellipsoidal 2D CS. Axes: latitude, longitude. Orientations: north, east.  UoM: deg</gml:description>
+			<gml:identifier codeSpace="EPSG_v65">6422</gml:identifier>
+			<gml:name>CS ellipsoidal2D</gml:name>
+			<gml:axis xlink:href="#xpointer(//*[@gml:id='EPSG9901'])"/>
+			<gml:axis xlink:href="#xpointer(//*[@gml:id='EPSG9902'])"/>		
+		</gml:EllipsoidalCS>
+	</coordinateSystem>
+	<!--*** Cartesian - 2D ***-->
+	<coordinateSystem>
+		<gml:CartesianCS gml:id="EPSG4400">
+			<gml:description>Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: m.</gml:description>
+			<gml:identifier codeSpace="EPSG_v65">4400</gml:identifier>
+			<gml:name>Cs cartesian2D</gml:name>
+			<gml:axis xlink:href="#xpointer(//*[@gml:id='EPSG9907'])"/>
+			<gml:axis xlink:href="#xpointer(//*[@gml:id='EPSG9906'])"/>
+		</gml:CartesianCS>
+	</coordinateSystem>
+	<!--========================== Coordinate system axis ==============================-->
+	<!--*** Latitude ***-->
+	<axis>
+		<gml:CoordinateSystemAxis gml:id="EPSG9901" gml:uom="../uom/gmxUom.xsd#xpointer(//*[@gml:id='deg'])">
+			<gml:identifier codeSpace="EPSG_v65">9901</gml:identifier>
+			<gml:name>Geodetic latitude</gml:name>
+			<gml:axisAbbrev>Lat</gml:axisAbbrev>
+			<gml:axisDirection codeSpace="EPSG">North</gml:axisDirection>
+		</gml:CoordinateSystemAxis>
+	</axis>
+	<!--*** Longitude ***-->
+	<axis>
+		<gml:CoordinateSystemAxis gml:id="EPSG9902" gml:uom="../uom/gmxUom.xsd#xpointer(//*[@gml:id='deg'])">
+			<gml:identifier codeSpace="EPSG_v65">9902</gml:identifier>
+			<gml:name>Geodetic longitude</gml:name>
+			<gml:axisAbbrev>Lon</gml:axisAbbrev>
+			<gml:axisDirection codeSpace="EPSG">East</gml:axisDirection>
+		</gml:CoordinateSystemAxis>
+	</axis>
+	<!--*** Northing ***-->
+	<axis>
+		<gml:CoordinateSystemAxis gml:id="EPSG9907" gml:uom="../uom/gmxUom.xsd#xpointer(//*[@gml:id='m'])">
+			<gml:identifier codeSpace="EPSG_v65">9907</gml:identifier>
+			<gml:name>Northing</gml:name>
+			<gml:axisAbbrev>N</gml:axisAbbrev>
+			<gml:axisDirection codeSpace="EPSG">North</gml:axisDirection>
+		</gml:CoordinateSystemAxis>
+	</axis>
+	<!--*** Easting ***-->
+	<axis>
+		<gml:CoordinateSystemAxis gml:id="EPSG9906" gml:uom="../uom/gmxUom.xsd#xpointer(//*[@gml:id='m'])">
+			<gml:identifier codeSpace="EPSG_v65">9906</gml:identifier>
+			<gml:name>Easting</gml:name>
+			<gml:axisAbbrev>E</gml:axisAbbrev>
+			<gml:axisDirection codeSpace="EPSG">east</gml:axisDirection>
+		</gml:CoordinateSystemAxis>
+	</axis>
+	<!--================================ Datums =====================================-->
+	<!--*** WGS 84 - Datum ***-->
+	<datum>
+		<gml:GeodeticDatum gml:id="EPSG6326">
+			<gml:identifier codeSpace="EPSG_v65">6326</gml:identifier>
+			<gml:name>World Geodetic System 1984</gml:name>
+			<gml:scope>not known</gml:scope>
+			<gml:primeMeridian xlink:href="#xpointer(//*[@gml:id='EPSG8901'])"/>
+			<gml:ellipsoid xlink:href="#xpointer(//*[@gml:id='EPSG7030'])"/>
+		</gml:GeodeticDatum>
+	</datum>
+	<!--================================ Ellipsoids ====================================-->
+	<!--*** WGS 84 - Ellipsoid ***-->
+	<ellipsoid>
+		<gml:Ellipsoid gml:id="EPSG7030">
+			<gml:identifier codeSpace="EPSG_v65">7030</gml:identifier>
+			<gml:name>WGS 84</gml:name>
+			<gml:semiMajorAxis uom="../uom/gmxUom.xsd#xpointer(//*[@gml:id='m'])">6378137</gml:semiMajorAxis>
+			<gml:secondDefiningParameter><gml:SecondDefiningParameter>
+					<gml:inverseFlattening uom="../uom/gmxUom.xsd#xpointer(//*[@gml:id='m'])">298.2572</gml:inverseFlattening>
+			</gml:SecondDefiningParameter></gml:secondDefiningParameter>
+		</gml:Ellipsoid>
+	</ellipsoid>
+	<!--============================== Prime meridians =================================-->
+	<!--*** Greenwich ***-->
+	<primeMeridian>
+		<gml:PrimeMeridian gml:id="EPSG8901">
+			<gml:identifier codeSpace="EPSG_v65">8901</gml:identifier>
+			<gml:name>Greenwich</gml:name>
+			<gml:greenwichLongitude uom="../uom/gmxUom.xsd#xpointer(//*[@gml:id='deg'])">0</gml:greenwichLongitude>
+		</gml:PrimeMeridian>
+	</primeMeridian>
+	<!--================================ Operations ===================================-->
+	<operation>
+		<gml:Conversion gml:id="EPSG16038">
+			<gml:identifier codeSpace="EPSG_v65">16038</gml:identifier>
+			<gml:name>UTM Zone 38 N</gml:name>
+			<gml:scope>not known</gml:scope>
+			<gml:method xlink:href="EPSG9807"/>
+			<gml:parameterValue>
+				<gml:ParameterValue>
+					<gml:value uom="../uom/gmxUom.xm#xpointer(//*[@gml:id='deg'])">0</gml:value>
+					<gml:operationParameter xlink:href="EPSG8801"/>
+				</gml:ParameterValue>
+			</gml:parameterValue>
+			<gml:parameterValue>
+				<gml:ParameterValue>
+					<gml:value uom="../uom/gmxUom.xm#xpointer(//*[@gml:id='deg'])">45</gml:value>
+					<gml:operationParameter xlink:href="EPSG8802"/>
+				</gml:ParameterValue>
+			</gml:parameterValue>
+			<gml:parameterValue>
+				<gml:ParameterValue>
+					<gml:value uom="../uom/gmxUom.xm#xpointer(//*[@gml:id='unity'])">0.9996</gml:value>
+					<gml:operationParameter xlink:href="EPSG8805"/>
+				</gml:ParameterValue>
+			</gml:parameterValue>
+			<gml:parameterValue>
+				<gml:ParameterValue>
+					<gml:value uom="../uom/gmxUom.xm#xpointer(//*[@gml:id='m'])">500000</gml:value>
+					<gml:operationParameter xlink:href="EPSG8806"/>
+				</gml:ParameterValue>
+			</gml:parameterValue>
+			<gml:parameterValue>
+				<gml:ParameterValue>
+					<gml:value uom="../uom/gmxUom.xm#xpointer(//*[@gml:id='m'])">0</gml:value>
+					<gml:operationParameter xlink:href="EPSG8807"/>
+				</gml:ParameterValue>
+			</gml:parameterValue>
+		</gml:Conversion>
+	</operation>
+	<!--============================= Operation methods ================================-->
+	<operationMethod>
+		<gml:OperationMethod gml:id="EPSG9807">
+			<gml:identifier codeSpace="EPSG_v65">9807</gml:identifier>
+			<gml:name codeSpace="IGN-F">PRCM040</gml:name>
+			<gml:name>Transverse Mercator</gml:name>
+			<gml:formula>Transverse Mercator</gml:formula>
+			<gml:sourceDimensions>2</gml:sourceDimensions>
+			<gml:targetDimensions>2</gml:targetDimensions>
+			<gml:generalOperationParameter xlink:href="EPSG8801"/>
+			<gml:generalOperationParameter xlink:href="EPSG8802"/>
+			<gml:generalOperationParameter xlink:href="EPSG8805"/>
+			<gml:generalOperationParameter xlink:href="EPSG8806"/>
+			<gml:generalOperationParameter xlink:href="EPSG8807"/>
+		</gml:OperationMethod>
+	</operationMethod>
+	<!--=========================== Operation parameters ================================-->
+	<parameters>
+		<gml:OperationParameter gml:id="EPSG8801">
+			<gml:identifier codeSpace="EPSG_v65">8801</gml:identifier>
+			<gml:name>Latitude of natural origin</gml:name>
+		</gml:OperationParameter>
+	</parameters>
+	<parameters>
+		<gml:OperationParameter gml:id="EPSG8802">
+			<gml:identifier codeSpace="EPSG_v65">8802</gml:identifier>
+			<gml:name>Longitude of natural origin</gml:name>
+		</gml:OperationParameter>
+	</parameters>
+	<parameters>
+		<gml:OperationParameter gml:id="EPSG8805">
+			<gml:identifier codeSpace="EPSG_v65">8805</gml:identifier>
+			<gml:name>Scale factor at natural origin</gml:name>
+		</gml:OperationParameter>
+	</parameters>
+	<parameters>
+		<gml:OperationParameter gml:id="EPSG8806">
+			<gml:identifier codeSpace="EPSG_v65">8806</gml:identifier>
+			<gml:name>False Easting</gml:name>
+		</gml:OperationParameter>
+	</parameters>
+	<parameters>
+		<gml:OperationParameter gml:id="EPSG8807">
+			<gml:identifier codeSpace="EPSG_v65">8807</gml:identifier>
+			<gml:name>False Northing</gml:name>
+		</gml:OperationParameter>
+	</parameters>
+</CT_CrsCatalogue>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/example/fr-fr.xml b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/example/fr-fr.xml
new file mode 100644
index 0000000..fade933
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/example/fr-fr.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<PT_LocaleContainer xmlns="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmd ../../gmd/gmd.xsd http://www.isotc211.org/2005/gco ../../gco/gco.xsd http://www.opengis.net/gml ../../gml/gml.xsd http://www.w3.org/1999/xlink ../../../../../../../../pycsw/schemas/w3c/1999/xlink.xsd">
+	<!--==========================================-->
+	<!--===========Translation file Header ============-->
+	<!--===Text description===-->
+	<description>
+		<gco:CharacterString>France-France</gco:CharacterString>
+	</description>
+	<!--===Locale===-->
+	<locale>
+		<PT_Locale id="locale-fr">
+			<languageCode><LanguageCode codeList="../Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="fra">French</LanguageCode></languageCode>
+			<country><Country codeList="../Codelist/ML_gmxCodelists.xml#Country" codeListValue="FR">FR</Country></country>
+			<characterEncoding><MD_CharacterSetCode codeList="../Codelist/ML_gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8">UTF 8</MD_CharacterSetCode></characterEncoding>
+		</PT_Locale>
+	</locale>
+	<!--===Dates [creation / revision]===-->
+	<date>
+		<CI_Date>
+			<date><gco:Date>2005-03-18</gco:Date></date>
+			<dateType><CI_DateTypeCode codeList="../Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="fra">création</CI_DateTypeCode></dateType>
+		</CI_Date>
+	</date>
+	<date>
+		<CI_Date>
+			<date><gco:Date>2006-02-03</gco:Date></date>
+			<dateType><CI_DateTypeCode codeList="../Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="../Codelist/ML_gmxCodelists.xml#CI_DateTypeCode_revision" codeSpace="fra">révision</CI_DateTypeCode></dateType>
+		</CI_Date>
+	</date>
+	<!--===Responsible party [author]===-->
+	<responsibleParty>
+		<CI_ResponsibleParty>
+			<organisationName><gco:CharacterString>french translation team</gco:CharacterString></organisationName>
+			<role><CI_RoleCode codeList="../Codelist/ML_gmxCodelists.xml#CI_RoleCode" codeListValue="author" codeSpace="fra">auteur</CI_RoleCode></role>
+		</CI_ResponsibleParty>
+	</responsibleParty>
+	<!--============================================================================-->
+	<!--============================================================================-->
+	<!--=========================== Translation items ===================================-->
+	<!--+++abstract : Brief narrative summary of the content of the resource+++-->
+	<localisedString><LocalisedCharacterString id="abstract-fr" locale="#fr-fr">Résumé succint du contenu du jeu de données</LocalisedCharacterString></localisedString>
+	<!--++++++-->
+	<localisedString/>
+	<!--++++++-->
+	<localisedString/>
+	<!--++++++-->
+	<localisedString/>
+	<!--++++++-->
+	<localisedString/>
+	<!--++++++-->
+	<localisedString/>
+	<!--=== EOF ===-->
+</PT_LocaleContainer>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/uom/ML_gmxUom.xml b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/uom/ML_gmxUom.xml
new file mode 100644
index 0000000..1df1e88
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/uom/ML_gmxUom.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CT_UomCatalogue xmlns="http://www.isotc211.org/2005/gmx" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmx ../../gmx/gmx.xsd http://www.isotc211.org/2005/gmd ../../gmd/gmd.xsd http://www.isotc211.org/2005/gco ../../gco/gco.xsd http://www.opengis.net/gml ../../gm [...]
+	<!--=====Catalogue description=====-->
+	<name><gco:CharacterString>uom</gco:CharacterString></name>
+	<scope xsi:type="gmd:PT_FreeText_PropertyType">
+		<gco:CharacterString>units of measure dictionary compliant with SI definitions</gco:CharacterString>
+		<gmd:PT_FreeText><gmd:textGroup><gmd:LocalisedCharacterString locale="#xpointer(//*[@id='fra'])">dictionnaire d'unités de mesure conforme avec les définitions du Système International (SI)</gmd:LocalisedCharacterString></gmd:textGroup></gmd:PT_FreeText>
+	</scope>
+	<fieldOfApplication><gco:CharacterString>GMX (and imported) namespace</gco:CharacterString></fieldOfApplication>
+	<versionNumber><gco:CharacterString>0.0</gco:CharacterString></versionNumber>
+	<versionDate><gco:Date>2005-06-18</gco:Date></versionDate>
+	<!--=== for Cultural and Linguistic Adaptability ===-->
+	<!--Default language-->
+	<language><gmd:LanguageCode codeList="../Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">English</gmd:LanguageCode></language>
+	<characterSet><gmd:MD_CharacterSetCode codeList="../Codelist/ML_gmxCodelists.xml#MD_CharacterSetCode" codeListValue="utf8">UTF 8</gmd:MD_CharacterSetCode></characterSet>
+	<!--List of the 'locales' into which free text values can be translated-->
+	<locale>
+		<gmd:PT_Locale id="fra">
+			<gmd:languageCode><gmd:LanguageCode codeList="../Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="fra">French</gmd:LanguageCode></gmd:languageCode>
+			<gmd:country><gmd:Country codeList="../Codelist/ML_gmxCodelists.xm#Country" codeListValue="FR">France</gmd:Country></gmd:country>
+			<gmd:characterEncoding><gmd:MD_CharacterSetCode codeList="../Codelist/ML_gmxCodelists.xm#MD_CharacterSetCode" codeListValue="utf8">UTF 8</gmd:MD_CharacterSetCode></gmd:characterEncoding>
+			</gmd:PT_Locale>
+	</locale>
+	<!--============================================================================-->
+	<!--============================================================================-->
+	<!--============================= UOM items ======================================-->
+	<!--====== METER =====-->
+	<uomItem>
+		<ML_BaseUnit gml:id="m">
+			<gml:description>The metre is the length of the path travelled by ligth in vaccum during a time interval of 1/299 792 458 of a second</gml:description>
+			<gml:identifier codeSpace="http://www.bipm.fr/en/si/base_units">metre</gml:identifier>
+			<gml:quantityType>length</gml:quantityType>
+			<gml:catalogSymbol codeSpace="http://www1.bipm.org/en/si/base_units">m</gml:catalogSymbol>
+			<gml:unitsSystem xlink:href="http://www.bipm.fr/en/SI"/>
+			<!--==alternative definition(s)==-->
+			<alternativeExpression>
+				<UomAlternativeExpression gml:id="m_fr" codeSpace="fra">
+					<gml:description>unité de longueur de référence dans le système international, correspond à la distance parcourue par la lumière dans le vide pendant 1/299 792 458 seconde</gml:description>
+					<gml:identifier codeSpace="http://www.bipm.fr/fr/si/base_units">metre</gml:identifier>
+					<gml:name>mètre</gml:name>
+					<gml:quantityType>longueur</gml:quantityType>
+					<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+				</UomAlternativeExpression>
+			</alternativeExpression>
+			<!--......................................-->
+		</ML_BaseUnit>
+	</uomItem>
+	<!--====== DEGREE =====-->
+	<uomItem>
+		<ML_ConventionalUnit gml:id="deg">
+				<gml:description>Measure of angle equal to Pi/180 radians, widely used in geography</gml:description>
+				<gml:identifier codeSpace="ISO31-1">degree</gml:identifier>
+				<gml:quantityType>angle</gml:quantityType>
+				<gml:conversionToPreferredUnit uom="#xpointer(//*[@gml:id='rad'])">
+					<gml:factor>1.74532925199433E-02</gml:factor>
+				</gml:conversionToPreferredUnit>
+				<!--==alternative definition(s)==-->
+				<alternativeExpression>
+					<UomAlternativeExpression gml:id="deg_fr" codeSpace="fra">
+						<gml:description>Unité d'angle de référence en géographie égale à Pi/180 radians.</gml:description>
+						<gml:identifier codeSpace="ISO31-1">degree</gml:identifier>
+						<gml:name>degré</gml:name>
+						<gml:quantityType>angle</gml:quantityType>
+						<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+					</UomAlternativeExpression>
+				</alternativeExpression>
+			</ML_ConventionalUnit>
+	</uomItem>
+	<!--====== RADIAN =====-->
+	<uomItem>
+		<ML_DerivedUnit gml:id="rad">
+			<gml:description>Radian is an unit of angle measure. It is defined as the ratio of arc length to the radius of the circle.</gml:description>
+			<gml:identifier codeSpace="http://www1.bipm.org/en/si/derived_units">radian</gml:identifier>
+			<gml:quantityType>plane angle</gml:quantityType>
+			<gml:catalogSymbol codeSpace="http://www1.bipm.org/en/si/derived_units">rad</gml:catalogSymbol>
+			<gml:derivationUnitTerm uom="#xpointer(//*[@gml:id='m'])" exponent="1"/>
+			<gml:derivationUnitTerm uom="#xpointer(//*[@gml:id='m'])" exponent="-1"/>
+			<!--==alternative definition(s)==-->
+			<alternativeExpression>
+				<UomAlternativeExpression gml:id="rad_fr" codeSpace="fra">
+					<gml:description>Le radian est une unité de mesaure angulaire définie comme le ratio entre le rayon et la longueur de l'arc.</gml:description>
+					<gml:identifier codeSpace="http://www1.bipm.org/en/si/derived_units">radian</gml:identifier>
+					<gml:name>radian</gml:name>
+					<gml:quantityType>angle planaire</gml:quantityType>
+					<locale xlink:href="#xpointer(//*[@id='fra'])"/>
+				</UomAlternativeExpression>
+			</alternativeExpression>
+		</ML_DerivedUnit>
+	</uomItem>
+	<!--=== EOF ===-->
+</CT_UomCatalogue>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/uom/gmxUom.xml b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/uom/gmxUom.xml
new file mode 100644
index 0000000..daac9af
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/resources/uom/gmxUom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CT_UomCatalogue xmlns="http://www.isotc211.org/2005/gmx" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmx ../../gmx/gmx.xsd http://www.isotc211.org/2005/gco ../../gco/gco.xsd http://www.opengis.net/gml ../../gml/gml.xsd http://www.w3.org/1999/xlink ../../../../../../../../pycsw/schemas/w3c/1999/xlink.xsd">
+	<!--=====Catalogue description=====-->
+	<name><gco:CharacterString>gmxUom</gco:CharacterString></name>
+	<scope><gco:CharacterString>units of measure dictionary compliant with SI definitions</gco:CharacterString></scope>
+	<fieldOfApplication><gco:CharacterString>ISO/TC 211 GMX (and imported) namespace</gco:CharacterString></fieldOfApplication>
+	<versionNumber><gco:CharacterString>0.0</gco:CharacterString></versionNumber>
+	<versionDate><gco:Date>2005-03-18</gco:Date></versionDate>
+	<!--============================================================================-->
+	<!--============================================================================-->
+	<!--============================= UOM items ======================================-->
+	<!--====== METRE =====-->
+	<uomItem>
+		<gml:BaseUnit gml:id="m">
+			<gml:description>The metre is the length of the path travelled by ligth in vaccum during a time interval of 1/299 792 458 of a second</gml:description>
+			<gml:identifier codeSpace="http://www.bipm.fr/en/si/base_units">metre</gml:identifier>
+			<gml:quantityType>length</gml:quantityType>
+			<gml:catalogSymbol codeSpace="http://www.bipm.org/en/si/base_units">m</gml:catalogSymbol>
+			<gml:unitsSystem xlink:href="http://www.bipm.fr/en/si"/>
+		</gml:BaseUnit>
+	</uomItem>
+	<!--====== DEGREE =====-->
+	<uomItem>
+		<gml:ConventionalUnit gml:id="deg">
+				<gml:description>Measure of angle equal to Pi/180 radians, widely used in geography</gml:description>
+				<gml:identifier codeSpace="ISO31-1">degree</gml:identifier>
+				<gml:quantityType>angle</gml:quantityType>
+				<gml:conversionToPreferredUnit uom="#xpointer(//*[@gml:id='rad'])"><gml:factor>1.74532925199433E-02</gml:factor></gml:conversionToPreferredUnit>
+			</gml:ConventionalUnit>
+	</uomItem>
+	<!--====== RADIAN =====-->
+	<uomItem>
+		<gml:DerivedUnit gml:id="rad">
+			<gml:description>Radian is an unit of angle measure. It is defined as the ratio of arc length to the radius of the circle.</gml:description>
+			<gml:identifier codeSpace="http://www.bipm.fr/en/s/derived_unitsi">radian</gml:identifier>
+			<gml:quantityType>plane angle</gml:quantityType>
+			<gml:catalogSymbol codeSpace="http://www1.bipm.org/en/si/derived_units">rad</gml:catalogSymbol>
+			<gml:derivationUnitTerm uom="#xpointer(//*[@gml:id='m'])" exponent="1"/>
+			<gml:derivationUnitTerm uom="#xpointer(//*[@gml:id='m'])" exponent="-1"/>
+		</gml:DerivedUnit>
+	</uomItem>
+	<!--=== EOF ===-->
+</CT_UomCatalogue>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/srv/serviceMetadata.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/srv/serviceMetadata.xsd
new file mode 100644
index 0000000..d74a18f
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/srv/serviceMetadata.xsd
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:srv="http://www.isotc211.org/2005/srv" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" targetNamespace="http://www.isotc211.org/2005/srv" elementFormDefault="qualified" version="0.1">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 10-13-2006 11:14:04 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/identification.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../srv/serviceModel.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="SV_Parameter_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:MemberName_Type"/>
+					<xs:element name="direction" type="srv:SV_ParameterDirection_PropertyType" minOccurs="0"/>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="optionality" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="repeatability" type="gco:Boolean_PropertyType"/>
+					<xs:element name="valueType" type="gco:TypeName_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_Parameter" type="srv:SV_Parameter_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_Parameter_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_Parameter" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_OperationMetadata_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="operationName" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="DCP" type="srv:DCPList_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="operationDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="invocationName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="parameters" type="srv:SV_Parameter_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="connectPoint" type="gmd:CI_OnlineResource_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="dependsOn" type="srv:SV_OperationMetadata_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_OperationMetadata" type="srv:SV_OperationMetadata_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_OperationMetadata_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_OperationMetadata" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_ServiceIdentification_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_Identification_Type">
+				<xs:sequence>
+					<xs:element name="serviceType" type="gco:GenericName_PropertyType"/>
+					<xs:element name="serviceTypeVersion" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="accessProperties" type="gmd:MD_StandardOrderProcess_PropertyType" minOccurs="0"/>
+					<xs:element name="restrictions" type="gmd:MD_Constraints_PropertyType" minOccurs="0"/>
+					<xs:element name="keywords" type="gmd:MD_Keywords_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="extent" type="gmd:EX_Extent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="coupledResource" type="srv:SV_CoupledResource_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="couplingType" type="srv:SV_CouplingType_PropertyType"/>
+					<xs:element name="containsOperations" type="srv:SV_OperationMetadata_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="operatesOn" type="gmd:MD_DataIdentification_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_ServiceIdentification" type="srv:SV_ServiceIdentification_Type" substitutionGroup="gmd:AbstractMD_Identification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_ServiceIdentification_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_ServiceIdentification" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_OperationChain_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="operation" type="srv:SV_Operation_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_OperationChain" type="srv:SV_OperationChain_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_OperationChain_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_OperationChain" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_OperationChainMetadata_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="operation" type="srv:SV_OperationMetadata_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_OperationChainMetadata" type="srv:SV_OperationChainMetadata_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_OperationChainMetadata_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_OperationChainMetadata" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_CoupledResource_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="operationName" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="identifier" type="gco:CharacterString_PropertyType"/>
+					<xs:element ref="gco:ScopedName" minOccurs="0" maxOccurs="1"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_CoupledResource" type="srv:SV_CoupledResource_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_CoupledResource_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_CoupledResource" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="SV_ParameterDirection_Type">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="in"/>
+			<xs:enumeration value="out"/>
+			<xs:enumeration value="in/out"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_ParameterDirection" type="srv:SV_ParameterDirection_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_ParameterDirection_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_ParameterDirection" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DCPList" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DCPList_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:DCPList" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="SV_CouplingType" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_CouplingType_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_CouplingType" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/srv/serviceModel.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/srv/serviceModel.xsd
new file mode 100644
index 0000000..90ab18a
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/srv/serviceModel.xsd
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- edited with XMLSpy v2005 rel. 3 U (http://www.altova.com) by STEPHANE BIDAULT (I.G.N/SAF/RECEPTIONS) -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:srv="http://www.isotc211.org/2005/srv" targetNamespace="http://www.isotc211.org/2005/srv" elementFormDefault="qualified" version="0.1">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 10-13-2006 11:14:04 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/gmd.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../srv/serviceMetadata.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="SV_ServiceSpecification_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="opModel" type="srv:SV_OperationModel_PropertyType"/>
+					<xs:element name="typeSpec" type="srv:SV_PlatformNeutralServiceSpecification_PropertyType"/>
+					<xs:element name="theSV_Interface" type="srv:SV_Interface_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_ServiceSpecification" type="srv:SV_ServiceSpecification_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_ServiceSpecification_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_ServiceSpecification" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_PlatformNeutralServiceSpecification_Type">
+		<xs:complexContent>
+			<xs:extension base="srv:SV_ServiceSpecification_Type">
+				<xs:sequence>
+					<xs:element name="serviceType" type="srv:SV_ServiceType_PropertyType"/>
+					<xs:element name="implSpec" type="srv:SV_PlatformSpecificServiceSpecification_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_PlatformNeutralServiceSpecification" type="srv:SV_PlatformNeutralServiceSpecification_Type" substitutionGroup="srv:SV_ServiceSpecification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_PlatformNeutralServiceSpecification_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_PlatformNeutralServiceSpecification" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_PlatformSpecificServiceSpecification_Type">
+		<xs:complexContent>
+			<xs:extension base="srv:SV_PlatformNeutralServiceSpecification_Type">
+				<xs:sequence>
+					<xs:element name="DCP" type="srv:DCPList_PropertyType"/>
+					<xs:element name="implementation" type="srv:SV_Service_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_PlatformSpecificServiceSpecification" type="srv:SV_PlatformSpecificServiceSpecification_Type" substitutionGroup="srv:SV_PlatformNeutralServiceSpecification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_PlatformSpecificServiceSpecification_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_PlatformSpecificServiceSpecification" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_ServiceType_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_ServiceType" type="srv:SV_ServiceType_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_ServiceType_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_ServiceType" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_Port_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="theSV_Interface" type="srv:SV_Interface_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_Port" type="srv:SV_Port_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_Port_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_Port" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_Service_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="specification" type="srv:SV_PlatformSpecificServiceSpecification_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="theSV_Port" type="srv:SV_Port_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_Service" type="srv:SV_Service_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_Service_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_Service" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_Interface_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="typeName" type="gco:TypeName_PropertyType"/>
+					<xs:element name="theSV_Port" type="srv:SV_Port_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="operation" type="srv:SV_Operation_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_Interface" type="srv:SV_Interface_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_Interface_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_Interface" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_PortSpecification_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="binding" type="srv:DCPList_PropertyType"/>
+					<xs:element name="address" type="gmd:URL_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_PortSpecification" type="srv:SV_PortSpecification_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_PortSpecification_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_PortSpecification" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_Operation_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="operationName" type="gco:MemberName_PropertyType"/>
+					<xs:element name="dependsOn" type="srv:SV_Operation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="parameter" type="srv:SV_Parameter_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_Operation" type="srv:SV_Operation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_Operation_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_Operation" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="SV_OperationModel_Type">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="object"/>
+			<xs:enumeration value="message"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_OperationModel" type="srv:SV_OperationModel_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_OperationModel_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_OperationModel" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/srv/srv.xsd b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/srv/srv.xsd
new file mode 100644
index 0000000..4a41a2f
--- /dev/null
+++ b/pycsw/plugins/profiles/apiso/schemas/ogc/iso/19139/20060504/srv/srv.xsd
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- edited with XMLSpy v2005 rel. 3 U (http://www.altova.com) by STEPHANE BIDAULT (I.G.N/SAF/RECEPTIONS) -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.isotc211.org/2005/srv" elementFormDefault="qualified" version="0.1">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 10-13-2006 11:14:05 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:include schemaLocation="../srv/serviceMetadata.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+</xs:schema>
diff --git a/pycsw/plugins/profiles/ebrim/__init__.py b/pycsw/plugins/profiles/ebrim/__init__.py
new file mode 100644
index 0000000..f98f82b
--- /dev/null
+++ b/pycsw/plugins/profiles/ebrim/__init__.py
@@ -0,0 +1,29 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
diff --git a/pycsw/plugins/profiles/ebrim/docs/ebrim.rst b/pycsw/plugins/profiles/ebrim/docs/ebrim.rst
new file mode 100644
index 0000000..3de6c53
--- /dev/null
+++ b/pycsw/plugins/profiles/ebrim/docs/ebrim.rst
@@ -0,0 +1,30 @@
+.. _ebrim:
+
+CSW-ebRIM Registry Service - Part 1: ebRIM profile of CSW
+---------------------------------------------------------
+
+Overview
+^^^^^^^^
+The CSW-ebRIM Registry Service is a profile of CSW 2.0.2 which enables discovery of geospatial metadata following the ebXML information model.
+
+Configuration
+^^^^^^^^^^^^^
+
+No extra configuration is required.
+
+Querying
+^^^^^^^^
+
+ * **typename**: ``rim:RegistryObject``
+ * **outputschema**: ``urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0``
+
+Enabling ebRIM Support
+^^^^^^^^^^^^^^^^^^^^^^
+
+To enable ebRIM support, add ``ebrim`` to ``server.profiles`` as specified in :ref:`configuration`.
+
+Testing
+^^^^^^^
+
+A testing interface is available in ``tests/index.html`` which contains tests specific to ebRIM to demonstrate functionality.  See :ref:`tests` for more information.
+
diff --git a/pycsw/plugins/profiles/ebrim/ebrim.py b/pycsw/plugins/profiles/ebrim/ebrim.py
new file mode 100644
index 0000000..b2a1e54
--- /dev/null
+++ b/pycsw/plugins/profiles/ebrim/ebrim.py
@@ -0,0 +1,172 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import os
+from lxml import etree
+from pycsw import config, server, util
+from pycsw.plugins.profiles import profile
+
+class EBRIM(profile.Profile):
+    ''' EBRim class '''
+    def __init__(self, model, namespaces, context):
+
+        self.context = context
+
+        self.namespaces = {
+            'rim': 'urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0',
+            'wrs': 'http://www.opengis.net/cat/wrs/1.0'
+        }
+
+        self.repository = {
+            'rim:RegistryObject': {
+                'outputschema': 'urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0',
+                'queryables': {},
+                'mappings': {
+                    'csw:Record': {
+                        # map APISO queryables to DC queryables
+                        'apiso:Title': 'dc:title',
+                        'apiso:Creator': 'dc:creator',
+                        'apiso:Subject': 'dc:subject',
+                        'apiso:Abstract': 'dct:abstract',
+                        'apiso:Publisher': 'dc:publisher',
+                        'apiso:Contributor': 'dc:contributor',
+                        'apiso:Modified': 'dct:modified',
+                        #'apiso:Date': 'dc:date',
+                        'apiso:Type': 'dc:type',
+                        'apiso:Format': 'dc:format',
+                        'apiso:Language': 'dc:language',
+                        'apiso:Relation': 'dc:relation',
+                        'apiso:AccessConstraints': 'dc:rights',
+                    }
+                }
+            }
+        }
+
+        profile.Profile.__init__(self,
+            name='ebrim',
+            version='1.0.1',
+            title='ebRIM profile of CSW',
+            url='http://portal.opengeospatial.org/files/?artifact_id=31137',
+            namespace=self.namespaces['rim'],
+            typename='rim:RegistryObject',
+            outputschema=self.namespaces['rim'],
+            prefixes=['rim'],
+            model=model,
+            core_namespaces=namespaces,
+            added_namespaces=self.namespaces,
+            repository=self.repository['rim:RegistryObject'])
+
+    def extend_core(self, model, namespaces, config):
+        ''' Extend core configuration '''
+
+        self.ogc_schemas_base = config.get('server', 'ogc_schemas_base')
+
+    def check_parameters(self, kvp):
+        '''Check for Language parameter in GetCapabilities request'''
+        return None
+
+    def get_extendedcapabilities(self):
+        ''' Add child to ows:OperationsMetadata Element '''
+        return None
+
+    def get_schemacomponents(self):
+        ''' Return schema components as lxml.etree.Element list '''
+
+        node = etree.Element(
+        util.nspath_eval('csw:SchemaComponent', self.context.namespaces),
+        schemaLanguage='XMLSCHEMA', targetNamespace=self.namespace)
+
+        schema = etree.parse(os.path.join(self.context.pycsw_home,
+                 'plugins', 'profiles', 'ebrim',
+                 'schemas', 'ogc', 'csw', '2.0.2',
+                 'profiles', 'ebrim', '1.0', 'csw-ebrim.xsd')).getroot()
+
+        node.append(schema)
+
+        return [node]
+
+    def check_getdomain(self, kvp):
+        '''Perform extra profile specific checks in the GetDomain request'''
+        return None
+
+    def write_record(self, result, esn, outputschema, queryables):
+        ''' Return csw:SearchResults child as lxml.etree.Element '''
+
+        identifier = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Identifier'])
+        typename = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Typename'])
+
+        if esn == 'full' and typename == 'rim:RegistryObject':
+            # dump record as is and exit
+            return etree.fromstring(util.getqattr(result, queryables['pycsw:XML']['dbcol']))
+
+        if typename == 'csw:Record':  # transform csw:Record -> rim:RegistryObject model mappings
+            util.transform_mappings(queryables, self.repository['mappings']['csw:Record'])
+
+        node = etree.Element(util.nspath_eval('rim:ExtrinsicObject', self.namespaces))
+        node.attrib[util.nspath_eval('xsi:schemaLocation', self.context.namespaces)] = \
+        '%s %s/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim.xsd' % (self.namespaces['wrs'], self.ogc_schemas_base)
+
+        node.attrib['id'] = identifier
+        node.attrib['lid'] = identifier
+        node.attrib['objectType'] = str(util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Type']))
+        node.attrib['status'] = 'urn:oasis:names:tc:ebxml-regrep:StatusType:Submitted'
+
+        etree.SubElement(node, util.nspath_eval('rim:VersionInfo', self.namespaces), versionName='')
+
+        if esn == 'summary':
+            etree.SubElement(node, util.nspath_eval('rim:ExternalIdentifier', self.namespaces), value=identifier, identificationScheme='foo', registryObject=str(util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Relation'])), id=identifier)
+
+            name = etree.SubElement(node, util.nspath_eval('rim:Name', self.namespaces))
+            etree.SubElement(name, util.nspath_eval('rim:LocalizedString', self.namespaces), value=unicode(util.getqattr(result, queryables['pycsw:Title']['dbcol'])))
+
+            description = etree.SubElement(node, util.nspath_eval('rim:Description', self.namespaces))
+            etree.SubElement(description, util.nspath_eval('rim:LocalizedString', self.namespaces), value=unicode(util.getqattr(result, queryables['pycsw:Abstract']['dbcol'])))
+
+            val = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:BoundingBox'])
+            bboxel = server.write_boundingbox(val)
+
+            if bboxel is not None:
+                bboxslot = etree.SubElement(node, util.nspath_eval('rim:Slot', self.namespaces),
+                slotType='urn:ogc:def:dataType:ISO-19107:2003:GM_Envelope')
+
+                valuelist = etree.SubElement(bboxslot, util.nspath_eval('rim:ValueList', self.namespaces))
+                value = etree.SubElement(valuelist, util.nspath_eval('rim:Value', self.namespaces))
+                value.append(bboxel)
+
+            rkeywords = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Keywords'])
+            if rkeywords is not None:
+                subjectslot = etree.SubElement(node, util.nspath_eval('rim:Slot', self.namespaces),
+                name='http://purl.org/dc/elements/1.1/subject')
+                valuelist = etree.SubElement(subjectslot, util.nspath_eval('rim:ValueList', self.namespaces))
+                for keyword in rkeywords.split(','):
+                    etree.SubElement(valuelist,
+                    util.nspath_eval('rim:Value', self.namespaces)).text = keyword
+
+        return node
diff --git a/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim-iri.xsd b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim-iri.xsd
new file mode 100644
index 0000000..3ed45cf
--- /dev/null
+++ b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim-iri.xsd
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema id="csw-ebrim-iri"
+  targetNamespace="http://www.opengis.net/cat/wrs/1.0/iri"
+  xmlns:iri="http://www.opengis.net/cat/wrs/1.0/iri"
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
+  elementFormDefault="qualified" 
+  version="1.0.1">
+
+  <xsd:annotation>
+    <xsd:documentation xml:lang="en" 
+      source="http://www.w3.org/TR/wsdl20-adjuncts/#http-binding">
+    This schema defines content models for HTTP request messages that may be 
+    serialized into the query string portion of the URI or into the message body 
+    in accord with the WSDL HTTP binding rules for the IRI style. The schemas 
+    defined in the base specifications do not adhere to the rules for the IRI 
+    style and thus cannot be used for this purpose.
+    </xsd:documentation>
+  </xsd:annotation>
+
+  <xsd:element name="GetCapabilities">
+    <xsd:annotation>
+      <xsd:documentation 
+        source="http://portal.opengeospatial.org/files/?artifact_id=8798">
+        See OGC 05-008c1, cl. 7.2.1.</xsd:documentation>
+    </xsd:annotation>
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="service" type="xsd:string" fixed="CSW" />
+        <xsd:element name="request" type="xsd:string" fixed="GetCapabilities" />
+        <xsd:element name="version" type="xsd:string" minOccurs="0"/>
+        <xsd:element name="acceptVersions" type="iri:AcceptVersionsType" minOccurs="0" />
+        <xsd:element name="sections" type="iri:CommaSeparatedListType" minOccurs="0" />
+        <xsd:element name="updateSequence" type="xsd:string" minOccurs="0" />
+        <xsd:element name="acceptFormats" type="iri:CommaSeparatedListType" minOccurs="0" />
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+ 
+  <xsd:element name="GetRecordById">
+  <xsd:annotation>
+    <xsd:documentation 
+      source="http://portal.opengeospatial.org/files/?artifact_id=20555">
+    See OGC 07-006r1, cl. 10.9.2</xsd:documentation>
+    </xsd:annotation>
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="service" type="xsd:string" fixed="CSW" />
+        <xsd:element name="request" type="xsd:string" fixed="GetRecordById" />
+        <xsd:element name="version" type="xsd:string" fixed="2.0.2" />
+        <xsd:element name="id" type="iri:CommaSeparatedListType" />
+        <xsd:element name="elementSetName" type="iri:ElementSetType" minOccurs="0"/>
+        <xsd:element name="outputFormat" type="xsd:string" minOccurs="0"/>
+        <xsd:element name="outputSchema" type="xsd:anyURI" minOccurs="0"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+
+  <xsd:element name="GetRecords">
+  <xsd:annotation>
+    <xsd:documentation 
+      source="http://portal.opengeospatial.org/files/?artifact_id=20555">
+    See OGC 07-006r1, cl. 10.8.2. Some optional CSW parameters have been elided.
+    Matching items are returned as rim:RegistryObject elements that include 
+    the "summary" element set.</xsd:documentation>
+    </xsd:annotation>
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="service" type="xsd:string" fixed="CSW" />
+        <xsd:element name="request" type="xsd:string" fixed="GetRecords" />
+        <xsd:element name="version" type="xsd:string" fixed="2.0.2" />
+        <xsd:element name="typeNames" type="iri:CommaSeparatedListType" />
+        <xsd:element name="namespace" type="xsd:string" minOccurs="0" />
+        <xsd:element name="resultType" type="iri:ResultType" minOccurs="0" />
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+  
+  <xsd:element name="GetRepositoryItem">
+  <xsd:annotation>
+    <xsd:documentation>
+    See OGC 07-110r2, cl. 12.2.</xsd:documentation>
+    </xsd:annotation>
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="service" type="xsd:string" fixed="CSW-ebRIM" />
+        <xsd:element name="request" type="xsd:string" fixed="GetRepositoryItem" />
+        <xsd:element name="version" type="xsd:string" minOccurs="0" />
+        <xsd:element name="id" type="xsd:anyURI" />
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+  
+  <xsd:element name="Query">
+  <xsd:annotation>
+    <xsd:documentation>
+    Invokes a predefined query. See OGC 07-110r2, cl. 16.1</xsd:documentation>
+    </xsd:annotation>
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:element name="service" type="xsd:string" fixed="CSW-ebRIM" />
+        <xsd:element name="request" type="xsd:string" fixed="Query" />
+        <xsd:element name="qid" type="xsd:anyURI" />
+        <xsd:element name="elementSetName" type="iri:ElementSetType" minOccurs="0"/>
+        <xsd:element name="startPosition" type="xsd:positiveInteger" minOccurs="0"/>
+        <xsd:element name="maxRecords" type="xsd:nonNegativeInteger" minOccurs="0"/>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+  
+  <xsd:simpleType name="AcceptVersionsType">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+      Examples: "2.0.35", "1.1.0,1.1.1"
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:string">
+      <xsd:pattern value="(\d+\.\d{1,2}\.\d{1,2},?)+" />
+    </xsd:restriction>
+  </xsd:simpleType>
+  
+  <xsd:simpleType name="CommaSeparatedListType">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+      Examples: "OperationsMetadata", "application/xml,text/html"
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:string">
+      <xsd:pattern value="([\w:\.\-/]+,?)+" />
+    </xsd:restriction>
+  </xsd:simpleType>
+  
+  <xsd:simpleType name="ElementSetType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="brief" />
+      <xsd:enumeration value="summary" />
+      <xsd:enumeration value="full" />
+    </xsd:restriction>
+  </xsd:simpleType>
+  
+  <xsd:simpleType name="ResultType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="hits" />
+      <xsd:enumeration value="results" />
+    </xsd:restriction>
+  </xsd:simpleType>
+</xsd:schema>
\ No newline at end of file
diff --git a/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim.xsd b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim.xsd
new file mode 100644
index 0000000..1296e7e
--- /dev/null
+++ b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim.xsd
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsd:schema id="wrs" targetNamespace="http://www.opengis.net/cat/wrs/1.0" 
+  xmlns:wrs="http://www.opengis.net/cat/wrs/1.0" 
+  xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" 
+  xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ogc="http://www.opengis.net/ogc"
+  xmlns:xlink="http://www.w3.org/1999/xlink" 
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
+  elementFormDefault="qualified" 
+  version="1.0.1">
+
+  <xsd:annotation>
+    <xsd:appinfo xmlns:sch="http://www.ascc.net/xml/schematron">
+      <sch:pattern id="ComplexSlotValuesPattern" name="ComplexSlotValuesPattern">
+        <sch:rule context="//wrs:ValueList">
+          <sch:report test="rim:Value">rim:Value not allowed in this context: expected wrs:AnyValue.</sch:report>
+        </sch:rule>
+      </sch:pattern>
+    </xsd:appinfo>
+    <xsd:documentation xml:lang="en">
+    Schema for CSW-ebRIM catalogue profile (OGC 07-110r3).
+    </xsd:documentation>
+  </xsd:annotation>
+    
+  <xsd:import namespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" 
+    schemaLocation="http://docs.oasis-open.org/regrep/v3.0/schema/rim.xsd" />
+  <xsd:import namespace="http://www.opengis.net/cat/csw/2.0.2"
+    schemaLocation="../../../../../../../../../../../../pycsw/schemas/ogc/csw/2.0.2/CSW-publication.xsd"/>
+  <xsd:import namespace="http://www.w3.org/1999/xlink" 
+    schemaLocation="../../../../../../../../../../../../pycsw/schemas/w3c/1999/xlink.xsd"/>
+  <xsd:import namespace="http://www.opengis.net/ogc"
+    schemaLocation="../../../../../../../../../../../../pycsw/schemas/ogc/filter/1.1.0/filter.xsd"/>
+    
+  <xsd:element name="Capabilities" type="csw:CapabilitiesType" />
+  <xsd:element name="RecordId" type="wrs:RecordIdType" 
+    substitutionGroup="ogc:_Id" id="RecordId">
+    <xsd:annotation>
+    <xsd:documentation xml:lang="en">
+    A general record identifier, expressed as an absolute URI that maps to 
+    the rim:RegistryObject/@id attribute. It substitutes for the ogc:_Id 
+    element in an OGC filter expression.
+    </xsd:documentation>
+    </xsd:annotation>
+  </xsd:element>
+  <xsd:complexType name="RecordIdType" id="RecordIdType">
+    <xsd:complexContent mixed="true">
+      <xsd:extension base="ogc:AbstractIdType" />
+    </xsd:complexContent>
+  </xsd:complexType>
+  
+  <xsd:element name="ExtrinsicObject" type="wrs:ExtrinsicObjectType" 
+    substitutionGroup="rim:ExtrinsicObject"/>
+  <xsd:complexType name="ExtrinsicObjectType">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+      Extends rim:ExtrinsicObjectType to add the following:
+      1. MTOM/XOP based attachment support.
+      2. XLink based reference to a part in a multipart/related message 
+         structure.
+      NOTE: This content model is planned for RegRep 4.0.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:complexContent>
+      <xsd:extension base="rim:ExtrinsicObjectType">
+        <xsd:choice minOccurs="0" maxOccurs="1">
+          <xsd:element name="repositoryItemRef" type="wrs:SimpleLinkType"/>
+          <xsd:element name="repositoryItem" type="xsd:base64Binary" xmime:expectedContentTypes="*/*" />
+        </xsd:choice>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  
+  <xsd:element name="ValueList" type="wrs:ValueListType" 
+    substitutionGroup="rim:ValueList" />
+  <xsd:complexType name="ValueListType">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">Allows complex slot values.</xsd:documentation>
+    </xsd:annotation>
+    <xsd:complexContent>
+      <xsd:extension base="rim:ValueListType">
+        <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+          <xsd:element ref="wrs:AnyValue" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:element name="AnyValue" type="wrs:AnyValueType"/>
+  <xsd:complexType name="AnyValueType" mixed="true">
+    <xsd:sequence>
+      <xsd:any minOccurs="0" />
+    </xsd:sequence>
+  </xsd:complexType>
+  
+  <xsd:complexType name="SimpleLinkType" id="SimpleLinkType">
+    <xsd:annotation>
+      <xsd:documentation xml:lang="en">
+      Incorporates the attributes defined for use in simple XLink elements.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attributeGroup ref="xlink:simpleAttrs" />
+  </xsd:complexType>
+</xsd:schema>
diff --git a/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/1.1/csw-ebrim-binding.wsdl b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/1.1/csw-ebrim-binding.wsdl
new file mode 100644
index 0000000..a038252
--- /dev/null
+++ b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/1.1/csw-ebrim-binding.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wsd:definitions
+    targetNamespace="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding"
+    xmlns:tns="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding"
+    xmlns:interface="urn:ogc:specification:wrs:1.0:wsdl-1.1:interface"
+    xmlns:wrs="http://www.opengis.net/cat/wrs/1.0"
+    xmlns:kvp="http://www.opengis.net/cat/wrs/1.0/kvp"
+    xmlns:csw="http://www.opengis.net/cat/csw/2.0.2"
+    xmlns:ows="http://www.opengis.net/ows"
+    xmlns:wsd="http://schemas.xmlsoap.org/wsdl/"
+    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
+    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
+    xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <wsd:documentation>
+    WSDL 1.1 binding descriptions for the CSW-ebRIM catalogue application profile.
+    </wsd:documentation>
+    <wsd:import
+        namespace="urn:ogc:specification:wrs:1.0:wsdl-1.1:interface"
+        location="./csw-ebrim-interface.wsdl" />
+   
+    <wsd:binding name="OGCWebServiceSOAPBinding" type="interface:OGCWebService">
+        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+        <wsd:operation name="GetCapabilities-xml">
+            <soap:operation soapAction="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding:OGCWebService#GetCapabilities-xml"/>
+            <wsd:input>
+                <soap:body use="literal"/>
+            </wsd:input>
+            <wsd:output>
+                <soap:body use="literal"/>
+            </wsd:output>
+            <wsd:fault name="invalidRequestException">
+                <soap:fault name="invalidRequestException" use="literal"/>
+            </wsd:fault>
+        </wsd:operation>
+    </wsd:binding>
+   
+    <wsd:binding name="DiscoverySOAPBinding" type="interface:Discovery">
+        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+        <wsd:operation name="GetRecords">
+            <soap:operation soapAction="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding:Discovery#GetRecords"/>
+            <wsd:input>
+                <soap:body use="literal"/>
+            </wsd:input>
+            <wsd:output>
+                <soap:body use="literal"/>
+            </wsd:output>
+            <wsd:fault name="invalidRequestException">
+                <soap:fault name="invalidRequestException" use="literal"/>
+            </wsd:fault>
+        </wsd:operation>
+       
+        <wsd:operation name="GetRecordById-xml">
+            <soap:operation soapAction="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding:Discovery#GetRecordById-xml"/>
+            <wsd:input>
+                <soap:body use="literal"/>
+            </wsd:input>
+            <wsd:output>
+                <soap:body use="literal"/>
+            </wsd:output>
+            <wsd:fault name="invalidRequestException">
+                <soap:fault name="invalidRequestException" use="literal"/>
+            </wsd:fault>
+        </wsd:operation>
+       
+        <wsd:operation name="DescribeRecord">
+            <soap:operation soapAction="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding:Discovery#DescribeRecord"/>
+            <wsd:input>
+                <soap:body use="literal"/>
+            </wsd:input>
+            <wsd:output>
+                <soap:body use="literal"/>
+            </wsd:output>
+            <wsd:fault name="invalidRequestException">
+                <soap:fault name="invalidRequestException" use="literal"/>
+            </wsd:fault>
+        </wsd:operation>
+       
+        <wsd:operation name="GetDomain">
+            <soap:operation soapAction="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding:Discovery#GetDomain"/>
+            <wsd:input>
+                <soap:body use="literal"/>
+            </wsd:input>
+            <wsd:output>
+                <soap:body use="literal"/>
+            </wsd:output>
+            <wsd:fault name="invalidRequestException">
+                <soap:fault name="invalidRequestException" use="literal"/>
+            </wsd:fault>
+        </wsd:operation>
+    </wsd:binding>
+   
+    <wsd:binding name="PublicationSOAPBinding" type="interface:Publication">
+        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+        <wsd:operation name="Transaction">
+            <soap:operation soapAction="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding:Publication#Transaction"/>
+            <wsd:input>
+                <soap:body use="literal"/>
+            </wsd:input>
+            <wsd:output>
+                <soap:body use="literal"/>
+            </wsd:output>
+            <wsd:fault name="invalidRequestException">
+                <soap:fault name="invalidRequestException" use="literal"/>
+            </wsd:fault>
+            <wsd:fault name="transactionFailedFault">
+                <soap:fault name="transactionFailedFault" use="literal"/>
+            </wsd:fault>
+        </wsd:operation>
+       
+        <wsd:operation name="Harvest">
+            <soap:operation soapAction="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding:Publication#Harvest"/>
+            <wsd:input>
+                <soap:body use="literal"/>
+            </wsd:input>
+            <wsd:output>
+                <soap:body use="literal"/>
+            </wsd:output>
+            <wsd:fault name="invalidRequestException">
+                <soap:fault name="invalidRequestException" use="literal"/>
+            </wsd:fault>
+            <wsd:fault name="transactionFailedFault">
+                <soap:fault name="transactionFailedFault" use="literal"/>
+            </wsd:fault>
+        </wsd:operation>
+    </wsd:binding>
+</wsd:definitions>
diff --git a/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/1.1/csw-ebrim-interface.wsdl b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/1.1/csw-ebrim-interface.wsdl
new file mode 100644
index 0000000..4ced4ba
--- /dev/null
+++ b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/1.1/csw-ebrim-interface.wsdl
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wsd:definitions
+    targetNamespace="urn:ogc:specification:wrs:1.0:wsdl-1.1:interface"
+    xmlns:tns="urn:ogc:specification:wrs:1.0:wsdl-1.1:interface"
+    xmlns:wrs="http://www.opengis.net/cat/wrs/1.0"
+    xmlns:kvp="http://www.opengis.net/cat/wrs/1.0/kvp"
+    xmlns:csw="http://www.opengis.net/cat/csw/2.0.2"
+    xmlns:ows="http://www.opengis.net/ows"
+    xmlns:wsd="http://schemas.xmlsoap.org/wsdl/" 
+    xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <wsd:documentation>
+    WSDL 1.1 interface descriptions for the CSW-ebRIM catalogue application profile.
+    </wsd:documentation>
+    <wsd:types>
+        <xs:schema id="wrs-kvp"
+                   targetNamespace="http://www.opengis.net/cat/wrs/1.0/kvp"
+                   xmlns:kvp="http://www.opengis.net/cat/wrs/1.0/kvp">
+            <xs:import
+                namespace="http://www.opengis.net/cat/wrs/1.0"
+                schemaLocation="../../csw-ebrim.xsd" />
+            <xs:import namespace="http://www.opengis.net/cat/csw/2.0.2"
+                schemaLocation="http://schemas.opengis.net/csw/2.0.2/CSW-publication.xsd" />
+            <xs:import
+                namespace="http://www.opengis.net/ows"
+                schemaLocation="http://schemas.opengis.net/ows/1.0.0/owsAll.xsd" />
+
+            <xs:annotation>
+                <xs:documentation xml:lang="en">
+                    This schema declares message elements for GET requests or POST requests
+                    encoded as content type "application/x-www-form-urlencoded" (i.e.,
+                    KVP-style encoding).
+                   
+                    1. Parameter names and values are escaped. Space characters are
+                    replaced by '+', and then reserved characters are percent-encoded
+                    as described in RFC 3986, section 2.2.
+                    2. the parameter name is separated from the value by the EQUALS SIGN
+                    character and name/value pairs are separated from each other
+                    by the AMPERSAND character. If multiple values are allowed they
+                    are separated using the COMMA character.
+                </xs:documentation>
+            </xs:annotation>
+            <xs:group name="common-elements">
+                <xs:sequence>
+                    <xs:element name="service" type="xs:anyURI"
+                                fixed="urn:x-ogc:specification:csw-ebrim:Service:OGC-CSW:ebRIM" />
+                    <xs:element name="request" type="xs:string" />
+                </xs:sequence>
+            </xs:group>
+            <xs:element name="GetCapabilities" type="kvp:GetCapabilitiesType"/>
+            <!-- TODO: Fix temporary hack to satisfy missing def -->
+            <xs:element name="GetRepositoryItem" type="kvp:GetCapabilitiesType"/>
+            <xs:complexType name="GetCapabilitiesType">
+                <xs:sequence>
+                    <xs:group ref="kvp:common-elements"/>
+                    <xs:element name="acceptVersions" type="kvp:AcceptVersionsType" minOccurs="0" />
+                    <!-- TODO: Find out where this type is defined -->
+                    <!-- xs:element name="sections" type="kvp:CommaSeparatedWordsType" minOccurs="0" /-->
+                    <xs:element name="updateSequence" type="xs:string" minOccurs="0" />
+                    <xs:element name="acceptFormats" type="kvp:CommaSeparatedValuesType" minOccurs="0" />
+                </xs:sequence>
+            </xs:complexType>
+            <xs:element name="GetRecordById" type="kvp:GetRecordByIdType"/>
+            <xs:complexType name="GetRecordByIdType">
+                <xs:sequence>
+                    <xs:group ref="kvp:common-elements"/>
+                    <xs:element name="id" type="xs:anyURI" />
+                    <xs:element name="elementSet" type="kvp:ElementSetType" minOccurs="0"/>
+                </xs:sequence>
+            </xs:complexType>
+            <xs:simpleType name="AcceptVersionsType">
+                <xs:annotation>
+                    <xs:documentation xml:lang="en">
+                        Examples: "2.0.35", "1.1.0,1.1.1"
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:restriction base="xs:string">
+                    <xs:pattern value="(\d+\.\d?\d\.\d?\d,?)+" />
+                </xs:restriction>
+            </xs:simpleType>
+            <xs:simpleType name="CommaSeparatedValuesType">
+                <xs:annotation>
+                    <xs:documentation xml:lang="en">
+                        Examples: "OperationsMetadata", "application/xml,text/html"
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:restriction base="xs:string">
+                    <xs:pattern value="([\w\+\-/]+,?)+" />
+                </xs:restriction>
+            </xs:simpleType>
+            <xs:simpleType name="ElementSetType">
+                <xs:restriction base="xs:string">
+                    <xs:enumeration value="brief" />
+                    <xs:enumeration value="summary" />
+                    <xs:enumeration value="full" />
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:schema>
+    </wsd:types>
+   
+    <!-- Request message definitions. -->
+    <wsd:message name="msgGetCapabilitiesKVP">
+        <wsd:part element="kvp:GetCapabilities" name="partGetCapabilitiesKVP"/>
+    </wsd:message>
+    <wsd:message name="msgCapabilities">
+        <wsd:part element="wrs:Capabilities" name="partCapabilities"/>
+    </wsd:message>
+    <wsd:message name="msgGetCapabilitiesCSW">
+        <wsd:part element="csw:GetCapabilities" name="partGetCapabilitiesCSW"/>
+    </wsd:message>
+    <wsd:message name="msgGetRecords">
+        <wsd:part element="csw:GetRecords" name="partGetRecords"/>
+    </wsd:message>
+    <wsd:message name="msgGetRecordsResponse">
+        <wsd:part element="csw:GetRecordsResponse" name="partGetRecordsResponse"/>
+    </wsd:message>
+    <wsd:message name="msgGetRecordByIdCSW">
+        <wsd:part element="csw:GetRecordById" name="partGetRecordByIdCSW"/>
+    </wsd:message>
+    <wsd:message name="msgGetRecordByIdResponse">
+        <wsd:part element="csw:GetRecordByIdResponse" name="partGetRecordByIdResponse"/>
+    </wsd:message>
+    <wsd:message name="msgGetRecordByIdKVP">
+        <wsd:part element="kvp:GetRecordById" name="partGetRecordByIdKVP"/>
+    </wsd:message>
+    <wsd:message name="msgDescribeRecord">
+        <wsd:part element="csw:DescribeRecord" name="partDescribeRecord"/>
+    </wsd:message>
+    <wsd:message name="msgDescribeRecordResponse">
+        <wsd:part element="csw:DescribeRecordResponse" name="partDescribeRecordResponse"/>
+    </wsd:message>
+    <wsd:message name="msgGetDomain">
+        <wsd:part element="csw:GetDomain" name="partGetDomain"/>
+    </wsd:message>
+    <wsd:message name="msgGetDomainResponse">
+        <wsd:part element="csw:GetDomainResponse" name="partGetDomainResponse"/>
+    </wsd:message>
+    <wsd:message name="msgGetRepositoryItemKVP">
+        <wsd:part element="kvp:GetRepositoryItem" name="partGetRepositoryItemKVP"/>
+    </wsd:message>
+    <wsd:message name="msgGetRepositoryItemResponse">
+        <wsd:part type="xs:anyType" name="partGetRepositoryItemResponse"/>
+    </wsd:message>
+    <wsd:message name="msgTransaction">
+        <wsd:part element="csw:Transaction" name="partTransaction"/>
+    </wsd:message>
+    <wsd:message name="msgTransactionResponse">
+        <wsd:part element="csw:TransactionResponse" name="partTransactionResponse"/>
+    </wsd:message>
+    <wsd:message name="msgHarvest">
+        <wsd:part element="csw:Harvest" name="partHarvest"/>
+    </wsd:message>
+    <wsd:message name="msgHarvestResponse">
+        <wsd:part element="csw:HarvestResponse" name="partHarvestResponse"/>
+    </wsd:message>
+    <wsd:message name="msgInvalidRequestFault">
+        <wsd:part element="ows:ExceptionReport" name="partInvalidRequestFault"/>
+    </wsd:message>
+    <wsd:message name="msgTransactionFailedFault">
+        <wsd:part element="ows:ExceptionReport" name="partTransactionFailedFault"/>
+    </wsd:message>
+   
+    <wsd:portType name="OGCWebService">
+        <!--wsd:operation name="GetCapabilities">
+            <wsd:documentation>
+                Uses the GET method with the "application/x-www-form-urlencoded"
+                serialization format. Message elements are inserted into the Request-URI.
+            </wsd:documentation>
+            <wsd:input message="tns:msgGetCapabilitiesKVP" />
+            <wsd:output message="tns:msgCapabilities" />
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+        </wsd:operation-->
+        <wsd:operation name="GetCapabilities-xml">
+            <wsd:documentation>
+                Uses the POST method with the "application/xml" serialization format.
+            </wsd:documentation>
+            <wsd:input message="tns:msgGetCapabilitiesCSW" />
+            <wsd:output message="tns:msgCapabilities" />
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+        </wsd:operation>
+    </wsd:portType>
+   
+    <wsd:portType name="Discovery">
+        <wsd:operation name="GetRecords">
+            <wsd:input message="tns:msgGetRecords" />
+            <wsd:output message="tns:msgGetRecordsResponse" />
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+        </wsd:operation>
+        <!--wsd:operation name="GetRecordById">
+            <wsd:documentation>
+                Uses the GET method with the "application/x-www-form-urlencoded"
+                serialization format. Message elements are inserted into the Request-URI.
+            </wsd:documentation>
+            <wsd:input message="tns:msgGetRecordByIdKVP" />
+            <wsd:output message="tns:msgGetRecordByIdResponse" />
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+        </wsd:operation-->
+        <wsd:operation name="GetRecordById-xml">
+            <wsd:input message="tns:msgGetRecordByIdCSW" />
+            <wsd:output message="tns:msgGetRecordByIdResponse" />
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+        </wsd:operation>
+        <wsd:operation name="DescribeRecord">
+            <wsd:input message="tns:msgDescribeRecord" />
+            <wsd:output message="tns:msgDescribeRecordResponse" />
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+        </wsd:operation>
+        <wsd:operation name="GetDomain">
+            <wsd:input message="tns:msgGetDomain" />
+            <wsd:output message="tns:msgGetDomainResponse" />
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+        </wsd:operation>
+        <!--wsd:operation name="GetRepositoryItem">
+            <wsd:documentation>
+                Uses the GET method with the "application/x-www-form-urlencoded"
+                serialization format. Message elements are inserted into the Request-URI.
+            </wsd:documentation>
+            <wsd:input message="tns:msgGetRepositoryItemKVP" />
+            <wsd:output message="tns:msgGetRepositoryItemResponse">
+                <wsd:documentation>
+                    The entity-body must be an instance of a registered MIME media type.
+                    See http://www.iana.org/assignments/media-types/.
+                </wsd:documentation>
+            </wsd:output>
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+        </wsd:operation-->
+    </wsd:portType>
+   
+    <wsd:portType name="Publication">
+        <wsd:operation name="Transaction">
+            <wsd:input message="tns:msgTransaction"/>
+            <wsd:output message="tns:msgTransactionResponse"/>
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+            <wsd:fault name="transactionFailedFault" message="tns:msgTransactionFailedFault" />
+        </wsd:operation>
+        <wsd:operation name="Harvest">
+            <wsd:input message="tns:msgHarvest"/>
+            <wsd:output message="tns:msgHarvestResponse"/>
+            <wsd:fault name="invalidRequestException" message="tns:msgInvalidRequestFault" />
+            <wsd:fault name="transactionFailedFault" message="tns:msgTransactionFailedFault" />
+        </wsd:operation>
+    </wsd:portType>
+</wsd:definitions>
diff --git a/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/1.1/csw-ebrim-service.wsdl b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/1.1/csw-ebrim-service.wsdl
new file mode 100644
index 0000000..c5295ca
--- /dev/null
+++ b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/1.1/csw-ebrim-service.wsdl
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wsd:definitions
+    targetNamespace="urn:ogc:specification:wrs:1.0:wsdl-1.1:service"
+    xmlns:tns="urn:ogc:specification:wrs:1.0:wsdl-1.1:service"
+    xmlns:binding="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding"
+    xmlns:wsd="http://schemas.xmlsoap.org/wsdl/"
+    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <wsd:documentation>
+    WSDL 1.1 service descriptions for the CSW-ebRIM catalogue application profile.
+    This is meant to be a template and does not specify an actual service.
+    </wsd:documentation>
+   
+    <wsd:import
+        namespace="urn:ogc:specification:wrs:1.0:wsdl-1.1:binding"
+        location="./csw-ebrim-binding.wsdl" />
+    <wsd:service name="CSWEBRIMSOAPService">
+        <wsd:port binding="binding:OGCWebServiceSOAPBinding" name="OGCWebServicePort">
+            <soap:address location="http://localhost:8080/wrs/ogcwebservice"/>
+        </wsd:port>
+        <wsd:port binding="binding:DiscoverySOAPBinding" name="DiscoveryPort">
+            <soap:address location="http://localhost:8080/wrs/discovery"/>
+        </wsd:port>
+        <wsd:port binding="binding:PublicationSOAPBinding" name="PublicationPort">
+            <soap:address location="http://localhost:8080/wrs/publication"/>
+        </wsd:port>
+    </wsd:service>
+   
+</wsd:definitions>
diff --git a/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/2.0/csw-ebrim-interface.wsdl b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/2.0/csw-ebrim-interface.wsdl
new file mode 100644
index 0000000..e0c0f49
--- /dev/null
+++ b/pycsw/plugins/profiles/ebrim/schemas/ogc/csw/2.0.2/profiles/ebrim/1.0/wsdl/2.0/csw-ebrim-interface.wsdl
@@ -0,0 +1,350 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wsd:description
+  targetNamespace="http://www.opengis.net/cat/wrs/1.0/wsdl"
+  xmlns:tns="http://www.opengis.net/cat/wrs/1.0/wsdl"
+  xmlns:wrs="http://www.opengis.net/cat/wrs/1.0"
+  xmlns:iri="http://www.opengis.net/cat/wrs/1.0/iri"
+  xmlns:csw="http://www.opengis.net/cat/csw/2.0.2"
+  xmlns:ows="http://www.opengis.net/ows"
+  xmlns:wsd="http://www.w3.org/ns/wsdl"
+  xmlns:wsdx="http://www.w3.org/ns/wsdl-extensions"
+  xmlns:wsoap="http://www.w3.org/ns/wsdl/soap"
+  xmlns:whttp="http://www.w3.org/ns/wsdl/http"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xsi:schemaLocation="http://www.w3.org/ns/wsdl http://www.w3.org/2007/06/wsdl/wsdl20.xsd
+  http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd">
+
+  <wsd:documentation>
+  W3C WSDL interface descriptions for the CSW-ebRIM 1.0 catalogue service. This
+  document shall be imported by all instance-specific service descriptions.
+  </wsd:documentation>
+
+  <wsd:types>
+    <xsd:import
+      namespace="http://www.opengis.net/cat/wrs/1.0"
+      schemaLocation="http://schemas.opengis.net/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim.xsd" />
+    <xsd:import
+      namespace="http://www.opengis.net/cat/wrs/1.0/iri"
+      schemaLocation="http://schemas.opengis.net/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim-iri.xsd" />
+    <xsd:import
+      namespace="http://www.opengis.net/cat/csw/2.0.2"
+      schemaLocation="http://schemas.opengis.net/csw/2.0.2/CSW-publication.xsd" />
+    <xsd:import
+      namespace="http://www.opengis.net/ows"
+      schemaLocation="http://schemas.opengis.net/ows/1.0.0/owsAll.xsd" />
+
+  </wsd:types>
+ 
+  <wsd:interface name="CommonDiscoveryInterface">
+   
+    <wsd:fault name="InvalidRequestFault"
+      element="ows:ExceptionReport">
+      <wsd:documentation>
+      The body of the request message is invalid or not well formed. The response
+      status code is 400 and the OGC exception code is "InvalidRequest".
+      </wsd:documentation>
+    </wsd:fault>
+
+    <wsd:fault name="NotImplementedFault"
+      element="ows:ExceptionReport">
+      <wsd:documentation>
+      Unsupported functionality--the request cannot be processed. The response
+      status code is 501 and the OGC exception code is "NotImplemented".
+      </wsd:documentation>
+    </wsd:fault>
+   
+    <wsd:operation name="GetCapabilities-iri"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out"
+      style="http://www.w3.org/2005/08/wsdl/style/iri"
+      wsdx:safe="true">
+      <wsd:documentation>Request OGC service description (mandatory).</wsd:documentation>
+      <wsd:input messageLabel="In" element="iri:GetCapabilities" />
+      <wsd:output messageLabel="Out" element="wrs:Capabilities" />
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+    </wsd:operation>
+
+    <wsd:operation name="GetCapabilities-xml"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out"
+      wsdx:safe="true">
+      <wsd:documentation>
+      Alternative GetCapabilities request that supplies an XML message body
+      (optional).
+      </wsd:documentation>
+      <wsd:input messageLabel="In" element="csw:GetCapabilities" />
+      <wsd:output messageLabel="Out" element="wrs:Capabilities" />
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+      <wsd:outfault messageLabel="Out" ref="tns:NotImplementedFault" />
+    </wsd:operation>
+   
+    <wsd:operation name="GetRecords-xml"
+      pattern="http://www.w3.org/2005/05/wsdl/in-out"
+      wsdx:safe="true">
+      <wsd:documentation>
+      Main search and retrieval facility (mandatory).
+      </wsd:documentation>
+      <wsd:input messageLabel="In" element="csw:GetRecords" />
+      <wsd:output messageLabel="Out" element="csw:GetRecordsResponse" />
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+    </wsd:operation>
+
+    <wsd:operation name="GetRecords-iri"
+      pattern="http://www.w3.org/2005/05/wsdl/in-out"
+      style="http://www.w3.org/2005/08/wsdl/style/iri"
+      wsdx:safe="true">
+      <wsd:documentation>
+      Alternative GetRecords request using the IRI style (optional).
+      </wsd:documentation>
+      <wsd:input messageLabel="In" element="iri:GetRecords" />
+      <wsd:output messageLabel="Out" element="csw:GetRecordsResponse" />
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+      <wsd:outfault messageLabel="Out" ref="tns:NotImplementedFault" />
+    </wsd:operation>
+   
+    <wsd:operation name="GetRecordById-iri"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out"
+      style="http://www.w3.org/2005/08/wsdl/style/iri"
+      wsdx:safe="true">
+      <wsd:documentation>
+      Retrieve representations of one or more registry objects by identifier
+      (mandatory).
+      </wsd:documentation>
+      <wsd:input messageLabel="In" element="iri:GetRecordById" />
+      <wsd:output messageLabel="Out" element="csw:GetRecordByIdResponse" />
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+    </wsd:operation>
+
+    <wsd:operation name="GetRecordById-xml"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out"
+      wsdx:safe="true">
+      <wsd:documentation>Alternative GetRecordById request that supplies an XML
+      message body (optional).</wsd:documentation>
+      <wsd:input messageLabel="In" element="csw:GetRecordById" />
+      <wsd:output messageLabel="Out" element="csw:GetRecordByIdResponse" />
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+      <wsd:outfault messageLabel="Out" ref="tns:NotImplementedFault" />
+    </wsd:operation>
+
+    <wsd:operation name="DescribeRecord"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out"
+      wsdx:safe="true">
+      <wsd:input messageLabel="In" element="csw:DescribeRecord" />
+      <wsd:output messageLabel="Out" element="csw:DescribeRecordResponse" />
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+    </wsd:operation>
+
+    <wsd:operation name="GetDomain"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out"
+      wsdx:safe="true">
+      <wsd:input messageLabel="In" element="csw:GetDomain" />
+      <wsd:output messageLabel="Out" element="csw:GetDomainResponse" />
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+      <wsd:outfault messageLabel="Out" ref="tns:NotImplementedFault" />
+    </wsd:operation>
+   
+  </wsd:interface>
+ 
+  <wsd:interface name="DiscoveryInterface" extends="tns:CommonDiscoveryInterface">
+   
+    <wsd:documentation>
+    Includes discovery operations specific to CSW-ebRIM implementations.
+    </wsd:documentation>
+
+    <wsd:operation name="GetRepositoryItem"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out"
+      style="http://www.w3.org/2005/08/wsdl/style/iri"
+      wsdx:safe="true">
+      <wsd:documentation>
+      Retrieve a repository item described by an ExtrinsicObject (mandatory).
+      </wsd:documentation>
+      <wsd:input messageLabel="In" element="iri:GetRepositoryItem" />
+      <wsd:output messageLabel="Out" element="#other">
+        <wsd:documentation>
+        The response body contains the actual repository item.
+        </wsd:documentation>
+      </wsd:output>
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+    </wsd:operation>
+   
+    <wsd:operation name="Query"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out"
+      style="http://www.w3.org/2005/08/wsdl/style/iri"
+      wsdx:safe="true">
+      <wsd:documentation>
+      Invoke a predefined query (mandatory).
+      </wsd:documentation>
+      <wsd:input messageLabel="In" element="iri:Query" />
+      <wsd:output messageLabel="Out" element="csw:GetRecordsResponse" />
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+    </wsd:operation>
+
+  </wsd:interface>
+ 
+  <wsd:interface name="RegistrationInterface">
+   
+    <wsd:documentation>
+    At least one of the registration operations must be implemented.
+    </wsd:documentation>
+     
+    <wsd:fault name="InvalidRequestFault"
+      element="ows:ExceptionReport">
+      <wsd:documentation>
+      The body of the request message is invalid or not well formed. The
+      response status code is 400 and the OGC exception code is "InvalidRequest".
+      </wsd:documentation>
+    </wsd:fault>
+
+    <wsd:fault name="NotImplementedFault"
+      element="ows:ExceptionReport">
+      <wsd:documentation>
+      Unsupported functionality--the request cannot be processed. The response
+      status code is 501 and the OGC exception code is "NotImplemented".
+      </wsd:documentation>
+    </wsd:fault>
+   
+    <wsd:fault name="TransactionFailedFault"
+      element="ows:ExceptionReport">
+      <wsd:documentation>
+      The requested transaction could not be completed for some reason other
+      than a validation error. The response status code is 500 and the OGC
+      exception code is "TransactionFailed".
+      </wsd:documentation>
+    </wsd:fault>
+
+    <wsd:operation name="Transaction"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out">
+
+      <wsd:input messageLabel="In" element="csw:Transaction"/>          
+      <wsd:output messageLabel="Out" element="csw:TransactionResponse"/>
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+      <wsd:outfault messageLabel="Out" ref="tns:TransactionFailedFault" />
+      <wsd:outfault messageLabel="Out" ref="tns:NotImplementedFault" />
+    </wsd:operation>
+
+    <wsd:operation name="Harvest"
+      pattern="http://www.w3.org/2005/08/wsdl/in-out">
+
+      <wsd:input messageLabel="In" element="csw:Harvest"/>
+      <wsd:output messageLabel="Out" element="csw:HarvestResponse"/>
+      <wsd:outfault messageLabel="Out" ref="tns:InvalidRequestFault" />
+      <wsd:outfault messageLabel="Out" ref="tns:TransactionFailedFault" />
+      <wsd:outfault messageLabel="Out" ref="tns:NotImplementedFault" />
+    </wsd:operation>
+  </wsd:interface>
+ 
+  <wsd:binding name="CommonDiscovery-HttpBinding"
+    interface="tns:CommonDiscoveryInterface"
+    type="http://www.w3.org/ns/wsdl/http">
+
+    <wsd:fault ref="tns:InvalidRequestFault" whttp:code="400" />
+    <wsd:fault ref="tns:NotImplementedFault" whttp:code="501" />
+   
+    <wsd:operation ref="tns:GetCapabilities-iri" whttp:method="GET" />
+    <wsd:operation ref="tns:GetCapabilities-xml" whttp:method="POST" />
+    <wsd:operation ref="tns:GetRecordById-iri" whttp:method="GET" />
+    <wsd:operation ref="tns:GetRecordById-xml" whttp:method="POST" />
+    <wsd:operation ref="tns:GetRecords-iri" whttp:method="GET" />
+    <wsd:operation ref="tns:GetRecords-xml" whttp:method="POST" />
+    <wsd:operation ref="tns:DescribeRecord" whttp:method="POST" />
+    <wsd:operation ref="tns:GetDomain" whttp:method="POST" />
+
+  </wsd:binding>
+ 
+  <wsd:binding name="Discovery-HttpBinding"
+    interface="tns:DiscoveryInterface"
+    type="http://www.w3.org/ns/wsdl/http">
+
+    <wsd:fault ref="tns:InvalidRequestFault" whttp:code="400" />
+    <wsd:fault ref="tns:NotImplementedFault" whttp:code="501" />
+
+    <!-- need binding ops from CommonDiscovery-HttpBinding? -->
+    <wsd:operation ref="tns:GetRepositoryItem" whttp:method="GET"
+      whttp:outputSerialization="*/*" />
+    <wsd:operation ref="tns:Query" whttp:method="GET" />
+
+  </wsd:binding>
+ 
+  <wsd:binding name="Registration-HttpBinding"
+    interface="tns:RegistrationInterface"
+    type="http://www.w3.org/ns/wsdl/http">
+
+    <wsd:fault ref="tns:InvalidRequestFault" whttp:code="400" />
+    <wsd:fault ref="tns:NotImplementedFault" whttp:code="501" />
+    <wsd:fault ref="tns:TransactionFailedFault" whttp:code="500" />
+   
+    <wsd:operation ref="tns:Transaction" whttp:method="POST"
+      whttp:inputSerialization="application/xml,multipart/related;type='application/xml'"/>
+    <wsd:operation ref="tns:Harvest" whttp:method="POST" />
+
+  </wsd:binding>
+ 
+  <wsd:binding name="CommonDiscovery-SoapBinding"
+    interface="tns:CommonDiscoveryInterface"
+    type="http://www.w3.org/ns/wsdl/soap"
+    wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/">
+
+    <wsd:fault ref="tns:InvalidRequestFault"
+      wsoap:code="soap:Sender" wsoap:subcodes="InvalidRequest" />
+    <wsd:fault ref="tns:NotImplementedFault"
+      wsoap:code="soap:Receiver" wsoap:subcodes="NotImplemented" />
+
+    <wsd:operation ref="tns:GetCapabilities-iri"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response"/>
+    <wsd:operation ref="tns:GetCapabilities-xml"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response/"
+      wsoap:action="urn:ogc:serviceType:CatalogueService:2.0.2:HTTP:ebRIM" />
+
+    <wsd:operation ref="tns:GetRecordById-iri"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response"/>
+    <wsd:operation ref="tns:GetRecordById-xml"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response/"
+      wsoap:action="urn:ogc:serviceType:CatalogueService:2.0.2:HTTP:ebRIM" />
+
+    <wsd:operation ref="tns:DescribeRecord"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response/"
+      wsoap:action="urn:ogc:serviceType:WebRegistryService:1.0" />
+    <wsd:operation ref="tns:GetDomain"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response/"
+      wsoap:action="urn:ogc:serviceType:CatalogueService:2.0.2:HTTP:ebRIM" />
+
+    <wsd:operation ref="tns:GetRecords-iri"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/soap-response"/>
+    <wsd:operation ref="tns:GetRecords-xml"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response/"
+      wsoap:action="urn:ogc:serviceType:CatalogueService:2.0.2:HTTP:ebRIM" />
+  </wsd:binding>
+ 
+  <wsd:binding name="Registration-SoapBinding"
+    interface="tns:RegistrationInterface"
+    type="http://www.w3.org/ns/wsdl/soap"
+    wsoap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/">
+
+    <wsd:fault ref="tns:InvalidRequestFault"
+      wsoap:code="soap:Sender" wsoap:subcodes="InvalidRequest" />
+    <wsd:fault ref="tns:NotImplementedFault"
+      wsoap:code="soap:Receiver" wsoap:subcodes="NotImplemented" />
+    <wsd:fault ref="tns:TransactionFailedFault"
+      wsoap:code="soap:Receiver" wsoap:subcodes="TransactionFailed" />
+   
+    <wsd:operation ref="tns:Transaction"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response/"
+      wsoap:action="urn:ogc:serviceType:CatalogueService:2.0.2:HTTP:ebRIM">
+      <wsd:input>
+        <wsoap:module
+          ref="http://www.w3.org/2004/08/soap/features/http-optimization"
+          required="true">
+          <wsd:documentation>
+          The HTTP SOAP Transmission Optimization Feature is required to handle
+          requests containing MIME multipart/related entities with repository
+          items. See http://www.w3.org/TR/soap12-mtom/.
+          </wsd:documentation>
+        </wsoap:module>
+      </wsd:input>
+    </wsd:operation>
+     
+    <wsd:operation ref="tns:Harvest"
+      wsoap:mep="http://www.w3.org/2003/05/soap/mep/request-response/"
+      wsoap:action="urn:ogc:serviceType:CatalogueService:2.0.2:HTTP:ebRIM" />
+
+  </wsd:binding>
+</wsd:description>
diff --git a/pycsw/plugins/profiles/profile.py b/pycsw/plugins/profiles/profile.py
new file mode 100644
index 0000000..f3b44fb
--- /dev/null
+++ b/pycsw/plugins/profiles/profile.py
@@ -0,0 +1,139 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#                Angelos Tzotsos <tzotsos at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import os
+import warnings
+
+class Profile(object):
+    ''' base Profile class '''
+    def __init__(self, name, version, title, url,
+    namespace, typename, outputschema, prefixes, model, core_namespaces,
+    added_namespaces,repository):
+
+        ''' Initialize profile '''
+        self.name = name
+        self.version = version
+        self.title = title
+        self.url = url
+        self.namespace = namespace
+        self.typename = typename
+        self.outputschema = outputschema
+        self.prefixes = prefixes
+        self.repository = repository
+
+        model['operations']['DescribeRecord']['parameters']\
+        ['typeName']['values'].append(self.typename)
+
+        model['operations']['GetRecords']['parameters']['outputSchema']\
+        ['values'].append(self.outputschema)
+
+        model['operations']['GetRecords']['parameters']['typeNames']\
+        ['values'].append(self.typename)
+
+        model['operations']['GetRecordById']['parameters']['outputSchema']\
+        ['values'].append(self.outputschema)
+
+        if 'Harvest' in model['operations']:
+            model['operations']['Harvest']['parameters']['ResourceType']\
+            ['values'].append(self.outputschema)
+
+        # namespaces
+        core_namespaces.update(added_namespaces)
+
+        # repository
+        model['typenames'][self.typename] = self.repository
+
+    def extend_core(self, model, namespaces, config):
+        ''' Extend config.model and config.namespaces '''
+        raise NotImplementedError
+
+    def check_parameters(self):
+        ''' Perform extra parameters checking.
+            Return dict with keys "locator", "code", "text" or None ''' 
+        raise NotImplementedError
+
+    def get_extendedcapabilities(self):
+        ''' Return ExtendedCapabilities child as lxml.etree.Element '''
+        raise NotImplementedError
+
+    def get_schemacomponents(self):
+        ''' Return schema components as lxml.etree.Element list '''
+        raise NotImplementedError
+    
+    def check_getdomain(self, kvp):
+        '''Perform extra profile specific checks in the GetDomain request'''
+        raise NotImplementedError
+
+    def write_record(self, result, esn, outputschema, queryables):
+        ''' Return csw:SearchResults child as lxml.etree.Element '''
+        raise NotImplementedError
+
+    def transform2dcmappings(self, queryables):
+        ''' Transform information model mappings into csw:Record mappings ''' 
+        raise NotImplementedError
+
+def load_profiles(path, cls, profiles):
+    ''' load CSW profiles, return dict by class name ''' 
+
+    def look_for_subclass(modulename):
+        module = __import__(modulename)
+ 
+        dmod = module.__dict__
+        for modname in modulename.split('.')[1:]:
+            dmod = dmod[modname].__dict__
+ 
+        for key, entry in dmod.items():
+            if key == cls.__name__:
+                continue
+ 
+            try:
+                if issubclass(entry, cls):
+                    aps['plugins'][key] = entry
+            except TypeError:
+                continue
+ 
+    aps = {}
+    aps['plugins'] = {}
+    aps['loaded'] = {}
+
+    for prof in profiles.split(','):
+        # fgdc, atom, dif are supported in core
+        # no need to specify them explicitly anymore
+        # provide deprecation warning
+        # https://github.com/geopython/pycsw/issues/118
+        if prof in ['fgdc', 'atom', 'dif']:
+            warnings.warn('%s is now a core module, and does not need to be'
+                          ' specified explicitly.  So you can remove %s from '
+                          'server.profiles' % (prof, prof))
+        else: 
+            modulename='%s.%s.%s' % (path.replace(os.sep, '.'), prof, prof)
+            look_for_subclass(modulename)
+    return aps
diff --git a/pycsw/plugins/repository/__init__.py b/pycsw/plugins/repository/__init__.py
new file mode 100644
index 0000000..0b17d0e
--- /dev/null
+++ b/pycsw/plugins/repository/__init__.py
@@ -0,0 +1,29 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
diff --git a/pycsw/plugins/repository/geonode/__init__.py b/pycsw/plugins/repository/geonode/__init__.py
new file mode 100644
index 0000000..0b17d0e
--- /dev/null
+++ b/pycsw/plugins/repository/geonode/__init__.py
@@ -0,0 +1,29 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
diff --git a/pycsw/plugins/repository/geonode/geonode_.py b/pycsw/plugins/repository/geonode/geonode_.py
new file mode 100644
index 0000000..dd256a8
--- /dev/null
+++ b/pycsw/plugins/repository/geonode/geonode_.py
@@ -0,0 +1,147 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+from django.db import models
+from django.db import connection
+from django.db.models import Avg, Max, Min, Count
+from django.conf import settings
+
+from pycsw import util
+from geonode.base.models import ResourceBase
+
+class GeoNodeRepository(object):
+    ''' Class to interact with underlying repository '''
+    def __init__(self, context, repo_filter=None):
+        ''' Initialize repository '''
+
+        self.context = context
+        self.filter = repo_filter
+        self.fts = False
+
+        self.dbtype = settings.DATABASES['default']['ENGINE'].split('.')[-1]
+
+        # GeoNode PostgreSQL installs are PostGIS enabled
+        if self.dbtype == 'postgresql_psycopg2':
+            self.dbtype = 'postgresql+postgis+wkt'
+
+        if self.dbtype in ['sqlite', 'sqlite3']:  # load SQLite query bindings
+            cursor = connection.cursor()
+            connection.connection.create_function(
+            'query_spatial', 4, util.query_spatial)
+            connection.connection.create_function(
+            'get_anytext', 1, util.get_anytext)
+            connection.connection.create_function(
+            'get_geometry_area', 1, util.get_geometry_area)
+
+        # generate core queryables db and obj bindings
+        self.queryables = {}
+
+        for tname in self.context.model['typenames']:
+            for qname in self.context.model['typenames'][tname]['queryables']:
+                self.queryables[qname] = {}
+
+                for qkey, qvalue in \
+                self.context.model['typenames'][tname]['queryables'][qname].iteritems():
+                    self.queryables[qname][qkey] = qvalue
+
+        # flatten all queryables
+        # TODO smarter way of doing this
+        self.queryables['_all'] = {}
+        for qbl in self.queryables:
+            self.queryables['_all'].update(self.queryables[qbl])
+        self.queryables['_all'].update(self.context.md_core_model['mappings'])
+
+    def query_ids(self, ids):
+        ''' Query by list of identifiers '''
+        return self._get_repo_filter(ResourceBase.objects).filter(uuid__in=ids).all()
+
+    def query_domain(self, domain, typenames, domainquerytype='list',
+        count=False):
+        ''' Query by property domain values '''
+
+        objects = self._get_repo_filter(ResourceBase.objects)
+
+        if domainquerytype == 'range':
+            return [tuple(objects.aggregate(
+            Min(domain), Max(domain)).values())]
+        else:
+            if count:
+                return [(d[domain], d['%s__count' % domain]) \
+                for d in objects.values(domain).annotate(Count(domain))]
+            else:
+                return objects.values_list(domain).distinct()
+
+
+    def query_latest_insert(self):
+        ''' Query to get latest update to repository '''
+        from datetime import datetime
+        return self._get_repo_filter(ResourceBase.objects).aggregate(
+            Max('date'))['date__max'].strftime('%Y-%m-%dT%H:%M:%SZ')
+
+    def query_source(self, source):
+        ''' Query by source '''
+        return self._get_repo_filter(ResourceBase.objects).filter(source=source)
+
+    def query(self, constraint, sortby=None, typenames=None,
+        maxrecords=10, startposition=0):
+        ''' Query records from underlying repository '''
+
+        # run the raw query and get total
+        if 'where' in constraint:  # GetRecords with constraint
+            query = self._get_repo_filter(ResourceBase.objects).extra(where=[constraint['where']], params=constraint['values'])
+
+        else:  # GetRecords sans constraint
+            query = self._get_repo_filter(ResourceBase.objects)
+
+        total = query.count()
+
+        # apply sorting, limit and offset
+        if sortby is not None:
+            if 'spatial' in sortby and sortby['spatial']:  # spatial sort
+                desc = False
+                if sortby['order'] == 'DESC':
+                    desc = True
+                query = query.all()
+                return [str(total), sorted(query, key=lambda x: float(util.get_geometry_area(getattr(x, sortby['propertyname']))), reverse=desc)[startposition:startposition+int(maxrecords)]]
+            else:
+                if sortby['order'] == 'DESC':
+                    pname = '-%s' % sortby['propertyname']
+                else:
+                    pname = sortby['propertyname']
+                return [str(total), \
+                query.order_by(pname)[startposition:startposition+int(maxrecords)]]
+        else:  # no sort
+            return [str(total), query.all()[startposition:startposition+int(maxrecords)]]
+
+    def _get_repo_filter(self, query):
+        ''' Apply repository wide side filter / mask query '''
+        if self.filter is not None:
+            return query.filter(self.filter)
+        return query
diff --git a/pycsw/plugins/repository/odc/__init__.py b/pycsw/plugins/repository/odc/__init__.py
new file mode 100644
index 0000000..0b17d0e
--- /dev/null
+++ b/pycsw/plugins/repository/odc/__init__.py
@@ -0,0 +1,29 @@
+# -*- coding: ISO-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
diff --git a/pycsw/plugins/repository/odc/odc.py b/pycsw/plugins/repository/odc/odc.py
new file mode 100644
index 0000000..b427023
--- /dev/null
+++ b/pycsw/plugins/repository/odc/odc.py
@@ -0,0 +1,154 @@
+#-*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import os, sys
+
+from django.db import models
+from django.db import connection
+from django.db.models import Avg, Max, Min, Count
+from django.conf import settings
+
+from pycsw import util
+from OpenDataCatalog.opendata.models import Resource
+
+class OpenDataCatalogRepository(object):
+    ''' Class to interact with underlying repository '''
+    def __init__(self, context, repo_filter=None):
+        ''' Initialize repository '''
+
+        self.context = context
+        self.filter = repo_filter
+        self.fts = False
+
+        self.dbtype = settings.DATABASES['default']['ENGINE'].split('.')[-1]
+
+        # ODC PostgreSQL installs are not PostGIS enabled
+        if self.dbtype == 'postgresql_psycopg2':
+            self.dbtype = 'postgresql'
+            
+        if self.dbtype in ['sqlite', 'sqlite3']:  # load SQLite query bindings
+            cursor = connection.cursor()
+            connection.connection.create_function(
+            'query_spatial', 4, util.query_spatial)
+            connection.connection.create_function(
+            'get_anytext', 1, util.get_anytext)
+            connection.connection.create_function(
+            'get_geometry_area', 1, util.get_geometry_area)
+
+        # generate core queryables db and obj bindings
+        self.queryables = {}
+
+        for tname in self.context.model['typenames']:
+            for qname in self.context.model['typenames'][tname]['queryables']:
+                self.queryables[qname] = {}
+
+                for qkey, qvalue in \
+                self.context.model['typenames'][tname]['queryables'][qname].iteritems():
+                    self.queryables[qname][qkey] = qvalue
+
+        # flatten all queryables
+        # TODO smarter way of doing this
+        self.queryables['_all'] = {}
+        for qbl in self.queryables:
+            self.queryables['_all'].update(self.queryables[qbl])
+        self.queryables['_all'].update(self.context.md_core_model['mappings'])
+
+    def query_ids(self, ids):
+        ''' Query by list of identifiers '''
+
+        # identifiers are URN masked, where the last token of the identifier
+        # is opendata.models.Resource.id (integer)
+        # 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:
+            return []
+
+    def query_domain(self, domain, typenames, domainquerytype='list',
+        count=False):
+        ''' Query by property domain values '''
+
+        objects = self._get_repo_filter(Resource.objects)
+
+        if domainquerytype == 'range':
+            return [tuple(objects.aggregate(
+            Min(domain), Max(domain)).values())]
+        else:
+            if count:
+                return [(d[domain], d['%s__count' % domain]) \
+                for d in objects.values(domain).annotate(Count(domain))]
+            else:
+                return objects.values_list(domain).distinct()
+
+    def query_latest_insert(self):
+        ''' Query to get latest update to repository '''
+        from datetime import datetime
+        return self._get_repo_filter(Resource.objects).aggregate(
+            Max('last_updated'))['last_updated__max'].strftime('%Y-%m-%dT%H:%M:%SZ')
+
+    def query_source(self, source):
+        ''' Query by source '''
+        return self._get_repo_filter(Resource.objects).filter(source=source)
+
+    def query(self, constraint, sortby=None, typenames=None,
+        maxrecords=10, startposition=0):
+        ''' Query records from underlying repository '''
+
+        # run the raw query and get total
+        if 'where' in constraint:  # GetRecords with constraint
+            query = self._get_repo_filter(Resource.objects).extra(where=[constraint['where']], params=constraint['values'])
+
+        else:  # GetRecords sans constraint
+            query = self._get_repo_filter(Resource.objects)
+
+        total = query.count()
+
+        # apply sorting, limit and offset
+        if sortby is not None:
+            if 'spatial' in sortby and sortby['spatial']:  # spatial sort
+                desc = False
+                if sortby['order'] == 'DESC':
+                    desc = True
+                query = query.all()
+                return [str(total), sorted(query, key=lambda x: float(util.get_geometry_area(getattr(x, sortby['propertyname']))), reverse=desc)[startposition:startposition+int(maxrecords)]]
+            if sortby['order'] == 'DESC':
+                pname = '-%s' % sortby['propertyname']
+            else:
+                pname = sortby['propertyname']
+            return [str(total), \
+            query.order_by(pname)[startposition:startposition+int(maxrecords)]]
+        else:  # no sort
+            return [str(total), query.all()[startposition:startposition+int(maxrecords)]]
+
+    def _get_repo_filter(self, query):
+        ''' Apply repository wide side filter / mask query '''
+        if self.filter is not None:
+            return query.filter(self.filter)
+        return query
diff --git a/pycsw/repository.py b/pycsw/repository.py
new file mode 100644
index 0000000..b633e09
--- /dev/null
+++ b/pycsw/repository.py
@@ -0,0 +1,386 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#          Angelos Tzotsos <tzotsos at gmail.com>
+#
+# Copyright (c) 2010 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import logging
+import os
+from sqlalchemy import create_engine, asc, desc, func, __version__, select
+from sqlalchemy.sql import text
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.orm import create_session
+from pycsw import util
+
+LOGGER = logging.getLogger(__name__)
+
+class Repository(object):
+    _engines = {}
+
+    @classmethod
+    def create_engine(clazz, url):
+        '''
+        SQL Alchemy engines are thread-safe and simple wrappers for connection pools
+
+        https://groups.google.com/forum/#!topic/sqlalchemy/t8i3RSKZGb0
+
+        To reduce startup time we can cache the engine as a class variable in the
+        repository object and do database initialization once
+
+        Engines are memoized by url
+        '''
+        if url not in clazz._engines:
+            LOGGER.debug('creating new engine: %s', url)
+            engine = create_engine('%s' % url, echo=False)
+
+            # load SQLite query bindings
+            # This can be directly bound via events
+            # for sqlite < 0.7, we need to to this on a per-connection basis
+            if engine.name in ['sqlite', 'sqlite3'] and __version__ >= '0.7':
+                from sqlalchemy import event
+                @event.listens_for(engine, "connect")
+                def connect(dbapi_connection, connection_rec):
+                    dbapi_connection.create_function(
+                    'query_spatial', 4, util.query_spatial)
+                    dbapi_connection.create_function(
+                    'update_xpath', 3, util.update_xpath)
+                    dbapi_connection.create_function('get_anytext', 1,
+                    util.get_anytext)
+                    dbapi_connection.create_function('get_geometry_area', 1,
+                    util.get_geometry_area)
+                    dbapi_connection.create_function('get_spatial_overlay_rank', 2,
+                    util.get_spatial_overlay_rank)
+
+            clazz._engines[url] = engine
+
+        return clazz._engines[url]
+
+    ''' Class to interact with underlying repository '''
+    def __init__(self, database, context, app_root=None, table='records', repo_filter=None):
+        ''' Initialize repository '''
+
+        self.context = context
+        self.filter = repo_filter
+        self.fts = False
+
+        # Don't use relative paths, this is hack to get around
+        # most wsgi restriction...
+        if (app_root and database.startswith('sqlite:///') and
+            not database.startswith('sqlite:////')):
+            database = database.replace('sqlite:///',
+                       'sqlite:///%s%s' % (app_root, os.sep))
+
+        self.engine = Repository.create_engine('%s' % database)
+
+        base = declarative_base(bind=self.engine)
+
+        LOGGER.debug('binding ORM to existing database')
+
+        self.postgis_geometry_column = None
+
+        schema, table = util.sniff_table(table)
+
+        self.dataset = type('dataset', (base,),
+        dict(__tablename__=table,__table_args__={'autoload': True,
+                                                 'schema': schema}))
+
+        self.dbtype = self.engine.name
+
+        self.session = create_session(self.engine)
+
+        temp_dbtype = None
+
+        if self.dbtype == 'postgresql':
+            # check if PostgreSQL is enabled with PostGIS 1.x
+            try:
+                self.session.execute(select([func.postgis_version()]))
+                temp_dbtype = 'postgresql+postgis+wkt'
+                LOGGER.debug('PostgreSQL+PostGIS1+WKT detected')
+            except Exception, err:
+                LOGGER.debug('PostgreSQL+PostGIS1+WKT detection failed')
+
+            # check if PostgreSQL is enabled with PostGIS 2.x
+            try:
+                self.session.execute('select(postgis_version())')
+                temp_dbtype = 'postgresql+postgis+wkt'
+                LOGGER.debug('PostgreSQL+PostGIS2+WKT detected')
+            except Exception, err:
+                LOGGER.debug('PostgreSQL+PostGIS2+WKT detection failed')
+
+            # check if a native PostGIS geometry column exists
+            try:
+                result = self.session.execute("select f_geometry_column from geometry_columns where f_table_name = '%s' and f_geometry_column != 'wkt_geometry' limit 1;" % table)
+                row = result.fetchone()
+                self.postgis_geometry_column = str(row['f_geometry_column'])
+                temp_dbtype = 'postgresql+postgis+native'
+                LOGGER.debug('PostgreSQL+PostGIS+Native detected')
+            except Exception, err:
+                LOGGER.debug('PostgreSQL+PostGIS+Native not picked up: %s', str(err))
+
+            # check if a native PostgreSQL FTS GIN index exists
+            result = self.session.execute("select relname from pg_class where relname='fts_gin_idx'").scalar()
+            self.fts = bool(result)
+            LOGGER.debug('PostgreSQL FTS enabled: %r', self.fts)
+
+        if temp_dbtype is not None:
+            LOGGER.debug('%s support detected' % temp_dbtype)
+            self.dbtype = temp_dbtype
+
+        if self.dbtype in ['sqlite', 'sqlite3']:  # load SQLite query bindings
+            # <= 0.6 behaviour
+            if not __version__ >= '0.7':
+                self.connection = self.engine.raw_connection()
+                self.connection.create_function(
+                'query_spatial', 4, util.query_spatial)
+                self.connection.create_function(
+                'update_xpath', 3, util.update_xpath)
+                self.connection.create_function('get_anytext', 1,
+                util.get_anytext)
+                self.connection.create_function('get_geometry_area', 1,
+                util.get_geometry_area)
+                self.connection.create_function('get_spatial_overlay_rank', 2,
+                util.get_spatial_overlay_rank)
+
+        LOGGER.debug('setting repository queryables')
+        # generate core queryables db and obj bindings
+        self.queryables = {}
+
+        for tname in self.context.model['typenames']:
+            for qname in self.context.model['typenames'][tname]['queryables']:
+                self.queryables[qname] = {}
+
+                for qkey, qvalue in \
+                self.context.model['typenames'][tname]['queryables'][qname].iteritems():
+                    self.queryables[qname][qkey] = qvalue
+
+        # flatten all queryables
+        # TODO smarter way of doing this
+        self.queryables['_all'] = {}
+        for qbl in self.queryables:
+            self.queryables['_all'].update(self.queryables[qbl])
+
+        self.queryables['_all'].update(self.context.md_core_model['mappings'])
+
+    def _create_values(self, values):
+        value_dict = {}
+        for num, value in enumerate(values):
+            value_dict['pvalue%d' % num] = value
+        return value_dict
+
+    def query_ids(self, ids):
+        ''' Query by list of identifiers '''
+        column = getattr(self.dataset, \
+        self.context.md_core_model['mappings']['pycsw:Identifier'])
+
+        query = self.session.query(self.dataset).filter(column.in_(ids))
+        return self._get_repo_filter(query).all()
+
+    def query_domain(self, domain, typenames, domainquerytype='list',
+        count=False):
+        ''' Query by property domain values '''
+
+        domain_value = getattr(self.dataset, domain)
+
+        if domainquerytype == 'range':
+            LOGGER.debug('Generating property name range values')
+            query = self.session.query(func.min(domain_value),
+                                       func.max(domain_value))
+        else:
+            if count:
+                LOGGER.debug('Generating property name frequency counts')
+                query = self.session.query(getattr(self.dataset, domain),
+                    func.count(domain_value)).group_by(domain_value)
+            else:
+                query = self.session.query(domain_value).distinct()
+        return self._get_repo_filter(query).all()
+
+    def query_latest_insert(self):
+        ''' Query to get latest update to repository '''
+        column = getattr(self.dataset, \
+        self.context.md_core_model['mappings']['pycsw:InsertDate'])
+
+        return self._get_repo_filter(self.session.query(func.max(column))).first()[0]
+
+    def query_source(self, source):
+        ''' Query by source '''
+        column = getattr(self.dataset, \
+        self.context.md_core_model['mappings']['pycsw:Source'])
+
+        query = self.session.query(self.dataset).filter(column == source)
+        return self._get_repo_filter(query).all()
+
+    def query(self, constraint, sortby=None, typenames=None,
+        maxrecords=10, startposition=0):
+        ''' Query records from underlying repository '''
+
+        # run the raw query and get total
+        if 'where' in constraint:  # GetRecords with constraint
+            LOGGER.debug('constraint detected')
+            query = self.session.query(self.dataset).filter(
+            text(constraint['where'])).params(self._create_values(constraint['values']))
+        else:  # GetRecords sans constraint
+            LOGGER.debug('No constraint detected')
+            query = self.session.query(self.dataset)
+
+        total = self._get_repo_filter(query).count()
+
+        if util.ranking_pass:  #apply spatial ranking
+            #TODO: Check here for dbtype so to extract wkt from postgis native to wkt
+            LOGGER.debug('spatial ranking detected')
+            LOGGER.debug('Target WKT: %s', getattr(self.dataset, self.context.md_core_model['mappings']['pycsw:BoundingBox']))
+            LOGGER.debug('Query WKT: %s', util.ranking_query_geometry)
+            query = query.order_by(func.get_spatial_overlay_rank(getattr(self.dataset, self.context.md_core_model['mappings']['pycsw:BoundingBox']), util.ranking_query_geometry).desc())
+            #trying to make this wsgi safe
+            util.ranking_pass = False
+            util.ranking_query_geometry = ''
+
+        if sortby is not None:  # apply sorting
+            LOGGER.debug('sorting detected')
+            #TODO: Check here for dbtype so to extract wkt from postgis native to wkt
+            sortby_column = getattr(self.dataset, sortby['propertyname'])
+
+            if sortby['order'] == 'DESC':  # descending sort
+                if 'spatial' in sortby and sortby['spatial']:  # spatial sort
+                    query = query.order_by(func.get_geometry_area(sortby_column).desc())
+                else:  # aspatial sort
+                    query = query.order_by(sortby_column.desc())
+            else:  # ascending sort
+                if 'spatial' in sortby and sortby['spatial']:  # spatial sort
+                    query = query.order_by(func.get_geometry_area(sortby_column))
+                else:  # aspatial sort
+                    query = query.order_by(sortby_column)
+
+        # always apply limit and offset
+        return [str(total), self._get_repo_filter(query).limit(
+        maxrecords).offset(startposition).all()]
+
+    def insert(self, record, source, insert_date):
+        ''' Insert a record into the repository '''
+
+        try:
+            self.session.begin()
+            self.session.add(record)
+            self.session.commit()
+        except Exception, err:
+            self.session.rollback()
+            raise RuntimeError('ERROR: %s' % str(err.orig))
+
+    def update(self, record=None, recprops=None, constraint=None):
+        ''' Update a record in the repository based on identifier '''
+
+        if record is not None:
+            identifier = getattr(record,
+            self.context.md_core_model['mappings']['pycsw:Identifier'])
+            xml = getattr(self.dataset,
+            self.context.md_core_model['mappings']['pycsw:XML'])
+            anytext = getattr(self.dataset,
+            self.context.md_core_model['mappings']['pycsw:AnyText'])
+
+        if recprops is None and constraint is None:  # full update
+            LOGGER.debug('full update')
+            update_dict = dict([(getattr(self.dataset, key),
+            getattr(record, key)) \
+            for key in record.__dict__.keys() if key != '_sa_instance_state'])
+
+            try:
+                self.session.begin()
+                self._get_repo_filter(self.session.query(self.dataset)).filter_by(
+                identifier=identifier).update(update_dict)
+                self.session.commit()
+            except Exception, err:
+                self.session.rollback()
+                raise RuntimeError('ERROR: %s' % str(err.orig))
+        else:  # update based on record properties
+            LOGGER.debug('property based update')
+            try:
+                rows = rows2 = 0
+                self.session.begin()
+                for rpu in recprops:
+                    # update queryable column and XML document via XPath
+                    if 'xpath' not in rpu['rp']:
+                        self.session.rollback()
+                        raise RuntimeError('XPath not found for property %s' % rpu['rp']['name'])
+                    if 'dbcol' not in rpu['rp']:
+                        self.session.rollback()
+                        raise RuntimeError('property not found for XPath %s' % rpu['rp']['name'])
+                    rows += self._get_repo_filter(self.session.query(self.dataset)).filter(
+                        text(constraint['where'])).params(self._create_values(constraint['values'])).update({
+                            getattr(self.dataset,
+                            rpu['rp']['dbcol']): rpu['value'],
+                            'xml': func.update_xpath(str(self.context.namespaces),
+                                   getattr(self.dataset,
+                                   self.context.md_core_model['mappings']['pycsw:XML']),
+                                   str(rpu)),
+                        }, synchronize_session='fetch')
+                    # then update anytext tokens
+                    rows2 += self._get_repo_filter(self.session.query(self.dataset)).filter(
+                        text(constraint['where'])).params(self._create_values(constraint['values'])).update({
+                            'anytext': func.get_anytext(getattr(
+                            self.dataset, self.context.md_core_model['mappings']['pycsw:XML']))
+                        }, synchronize_session='fetch')
+                self.session.commit()
+                return rows
+            except Exception, err:
+                self.session.rollback()
+                raise RuntimeError('ERROR: %s' % str(err.orig))
+
+    def delete(self, constraint):
+        ''' Delete a record from the repository '''
+
+        try:
+            self.session.begin()
+            rows = self._get_repo_filter(self.session.query(self.dataset)).filter(
+            text(constraint['where'])).params(self._create_values(constraint['values']))
+
+            parentids = []
+            for row in rows:  # get ids
+                parentids.append(getattr(row,
+                self.context.md_core_model['mappings']['pycsw:Identifier']))
+
+            rows=rows.delete(synchronize_session='fetch')
+
+            if rows > 0:
+                LOGGER.debug('Deleting all child records')
+                # delete any child records which had this record as a parent
+                rows += self._get_repo_filter(self.session.query(self.dataset)).filter(
+                    getattr(self.dataset,
+                    self.context.md_core_model['mappings']['pycsw:ParentIdentifier']).in_(parentids)).delete(
+                    synchronize_session='fetch')
+
+            self.session.commit()
+        except Exception, err:
+            self.session.rollback()
+            raise RuntimeError('ERROR: %s' % str(err.orig))
+
+        return rows
+
+    def _get_repo_filter(self, query):
+        ''' Apply repository wide side filter / mask query '''
+        if self.filter is not None:
+            return query.filter(self.filter)
+        return query
diff --git a/pycsw/schemas/ogc/README.txt b/pycsw/schemas/ogc/README.txt
new file mode 100644
index 0000000..d495c48
--- /dev/null
+++ b/pycsw/schemas/ogc/README.txt
@@ -0,0 +1,9 @@
+
+These schemas are shipped with pycsw to support realtime XML validation.
+
+The schemas have been downloaded from the official OGC schema repository at http://schemas.opengis.net/
+
+Note that only schemas required for pycsw are included.
+
+As well, xs:import and xs:include statements with references to absolute URLs have been modified
+to refer to relative URLs for performance.
diff --git a/pycsw/schemas/ogc/csw/2.0.2/CSW-discovery.xsd b/pycsw/schemas/ogc/csw/2.0.2/CSW-discovery.xsd
new file mode 100644
index 0000000..dc0de11
--- /dev/null
+++ b/pycsw/schemas/ogc/csw/2.0.2/CSW-discovery.xsd
@@ -0,0 +1,494 @@
+<?xml version="1.0"?>
+<xsd:schema
+   id="csw-discovery"
+   targetNamespace="http://www.opengis.net/cat/csw/2.0.2"
+   xmlns:csw="http://www.opengis.net/cat/csw/2.0.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:ows="http://www.opengis.net/ows"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="2.0.2 2010-01-22">
+
+   <xsd:annotation>
+      <xsd:appinfo>
+         <dc:identifier xmlns:dc="http://purl.org/dc/elements/1.1/">http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd</dc:identifier>
+      </xsd:appinfo>
+      <xsd:documentation xml:lang="en">
+    This schema defines the request and response messages for the CSW-Discovery operations specified in clause 10 of OGC-07-066.
+
+    CSW is an OGC Standard.
+    Copyright (c) 2004,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </xsd:documentation>
+   </xsd:annotation>
+
+   <xsd:include schemaLocation="record.xsd"/>
+
+   <xsd:import namespace="http://www.opengis.net/ows" schemaLocation="../../ows/1.0.0/owsAll.xsd"/>
+
+   <xsd:import namespace="http://www.opengis.net/ogc" schemaLocation="../../filter/1.1.0/filter.xsd"/>
+
+   <xsd:complexType name="RequestBaseType" id="RequestBaseType" abstract="true">
+      <xsd:annotation>
+         <xsd:documentation>
+            Base type for all request messages except GetCapabilities. The 
+            attributes identify the relevant service type and version.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:attribute name="service" type="ows:ServiceType"
+                     use="required" fixed="CSW"/>
+      <xsd:attribute name="version" type="ows:VersionType"
+                     use="required" fixed="2.0.2"/>
+   </xsd:complexType>
+
+   <xsd:element name="GetCapabilities" id="GetCapabilities"
+                type="csw:GetCapabilitiesType"/>
+   <xsd:complexType name="GetCapabilitiesType" id="GetCapabilitiesType">
+      <xsd:annotation>
+         <xsd:documentation>
+            Request for a description of service capabilities. See OGC 05-008 
+            for more information.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="ows:GetCapabilitiesType">
+            <xsd:attribute name="service" type="ows:ServiceType" use="optional"
+               default="http://www.opengis.net/cat/csw"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:element name="Capabilities" id="Capabilities"
+      type="csw:CapabilitiesType"/>
+   <xsd:complexType name="CapabilitiesType" id="CapabilitiesType">
+      <xsd:annotation>
+         <xsd:documentation>This type extends ows:CapabilitiesBaseType defined in OGC-05-008 
+         to include information about supported OGC filter components. A 
+         profile may extend this type to describe additional capabilities.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="ows:CapabilitiesBaseType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:Filter_Capabilities"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:element name="DescribeRecord" type="csw:DescribeRecordType"
+      id="DescribeRecord"/>
+   <xsd:complexType name="DescribeRecordType" id="DescribeRecordType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">This request allows a user to discover elements of the
+         information model supported by the catalogue. If no TypeName 
+         elements are included, then all of the schemas for the 
+         information model must be returned.
+      
+         schemaLanguage - preferred schema language
+                          (W3C XML Schema by default)
+         outputFormat - preferred output format (application/xml by default)</xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:RequestBaseType">
+            <xsd:sequence>
+               <xsd:element name="TypeName" type="xsd:QName" minOccurs="0"
+                  maxOccurs="unbounded"/>
+            </xsd:sequence>
+            <xsd:attribute name="outputFormat" type="xsd:string" use="optional"
+               default="application/xml"/>
+            <xsd:attribute name="schemaLanguage" type="xsd:anyURI"
+               use="optional" default="http://www.w3.org/XML/Schema"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:element name="DescribeRecordResponse" id="DescribeRecordResponse"
+      type="csw:DescribeRecordResponseType"/>
+   <xsd:complexType name="DescribeRecordResponseType"
+      id="DescribeRecordResponseType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">The response contains a list of matching schema components
+         in the requested schema language.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:element name="SchemaComponent" type="csw:SchemaComponentType"
+            minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="SchemaComponentType" mixed="true"
+      id="SchemaComponentType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">A schema component includes a schema fragment (type
+         definition) or an entire schema from some target namespace;
+         the schema language is identified by URI. If the component
+         is a schema fragment its parent MUST be referenced (parentSchema).</xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:any namespace="##any" processContents="lax"/>
+      </xsd:sequence>
+      <xsd:attribute name="targetNamespace" type="xsd:anyURI" use="required"/>
+      <xsd:attribute name="parentSchema" type="xsd:anyURI" use="optional"/>
+      <xsd:attribute name="schemaLanguage" type="xsd:anyURI" use="required"/>
+   </xsd:complexType>
+   <xsd:element name="GetRecords" type="csw:GetRecordsType" id="GetRecords"/>
+   <xsd:complexType name="GetRecordsType" id="GetRecordsType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+         The principal means of searching the catalogue. The matching 
+         catalogue entries may be included with the response. The client 
+         may assign a requestId (absolute URI). A distributed search is 
+         performed if the DistributedSearch element is present and the 
+         catalogue is a member of a federation. Profiles may allow 
+         alternative query expressions.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:RequestBaseType">
+            <xsd:sequence>
+               <xsd:element name="DistributedSearch"
+                  type="csw:DistributedSearchType" minOccurs="0"/>
+               <xsd:element name="ResponseHandler" type="xsd:anyURI"
+                  minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:choice>
+                  <xsd:element ref="csw:AbstractQuery"/>
+                  <xsd:any processContents="strict" namespace="##other"/>
+               </xsd:choice>
+            </xsd:sequence>
+            <xsd:attribute name="requestId" type="xsd:anyURI" use="optional"/>
+            <xsd:attribute name="resultType" type="csw:ResultType"
+               use="optional" default="hits"/>
+            <xsd:attributeGroup ref="csw:BasicRetrievalOptions"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:attributeGroup name="BasicRetrievalOptions" id="BasicRetrievalOptions">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">Various attributes that specify basic retrieval options:
+
+            outputFormat   - the media type of the response message
+            outputSchema   - the preferred schema for records in the result set
+            startPosition  - requests a slice of the result set, starting
+                             at this position
+            maxRecords     - the maximum number of records to return. No
+                             records are  returned if maxRecords=0.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:attribute name="outputFormat" type="xsd:string" use="optional"
+         default="application/xml"/>
+      <xsd:attribute name="outputSchema" type="xsd:anyURI" use="optional"/>
+      <xsd:attribute name="startPosition" type="xsd:positiveInteger"
+         use="optional" default="1"/>
+      <xsd:attribute name="maxRecords" type="xsd:nonNegativeInteger"
+         use="optional" default="10"/>
+   </xsd:attributeGroup>
+   <xsd:simpleType name="ResultType" id="ResultType">
+      <xsd:restriction base="xsd:string">
+         <xsd:enumeration value="results">
+            <xsd:annotation>
+               <xsd:documentation>Include results in the response.</xsd:documentation>
+            </xsd:annotation>
+         </xsd:enumeration>
+         <xsd:enumeration value="hits">
+            <xsd:annotation>
+               <xsd:documentation>Provide a result set summary, but no results.</xsd:documentation>
+            </xsd:annotation>
+         </xsd:enumeration>
+         <xsd:enumeration value="validate">
+            <xsd:annotation>
+               <xsd:documentation>Validate the request and return an Acknowledgement message if it 
+	      is valid. Continue processing the request asynchronously.</xsd:documentation>
+            </xsd:annotation>
+         </xsd:enumeration>
+      </xsd:restriction>
+   </xsd:simpleType>
+   <xsd:complexType name="DistributedSearchType" id="DistributedSearchType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">Governs the behaviour of a distributed search.
+         hopCount     - the maximum number of message hops before
+                        the search is terminated. Each catalogue node 
+                        decrements this value when the request is received, 
+                        and must not forward the request if hopCount=0.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:attribute name="hopCount" type="xsd:positiveInteger" use="optional"
+         default="2"/>
+   </xsd:complexType>
+   <xsd:element name="AbstractQuery" type="csw:AbstractQueryType"
+      id="AbstractQuery" abstract="true"/>
+   <xsd:complexType name="AbstractQueryType" id="AbstractQueryType"
+      abstract="true"/>
+   <xsd:element name="Query" type="csw:QueryType" id="Query"
+      substitutionGroup="csw:AbstractQuery"/>
+   <xsd:complexType name="QueryType" id="QueryType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">Specifies a query to execute against instances of one or
+         more object types. A set of ElementName elements may be included 
+         to specify an adhoc view of the csw:Record instances in the result 
+         set. Otherwise, use ElementSetName to specify a predefined view. 
+         The Constraint element contains a query filter expressed in a 
+         supported query language. A sorting criterion that specifies a 
+         property to sort by may be included.
+
+         typeNames - a list of object types to query.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:AbstractQueryType">
+            <xsd:sequence>
+               <xsd:choice>
+                  <xsd:element ref="csw:ElementSetName"/>
+                  <xsd:element name="ElementName"
+                               type="xsd:QName"
+                               minOccurs="1" maxOccurs="unbounded"/>
+               </xsd:choice>
+               <xsd:element ref="csw:Constraint" minOccurs="0" maxOccurs="1"/>
+               <xsd:element ref="ogc:SortBy" minOccurs="0" maxOccurs="1"/>
+            </xsd:sequence>
+            <xsd:attribute name="typeNames" type="csw:TypeNameListType"
+               use="required"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:simpleType name="TypeNameListType" id="TypeNameListType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">The exact syntax is defined in an application profile. If querying 
+       against the common record properties, only a single type may be 
+       specified (Record).</xsd:documentation>
+      </xsd:annotation>
+      <xsd:list itemType="xsd:QName"/>
+   </xsd:simpleType>
+   <xsd:element name="Constraint" type="csw:QueryConstraintType" id="Constraint"/>
+   <xsd:complexType name="QueryConstraintType" id="QueryConstraintType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">A search constraint that adheres to one of the following syntaxes:
+         Filter   - OGC filter expression
+         CqlText  - OGC CQL predicate</xsd:documentation>
+      </xsd:annotation>
+      <xsd:choice>
+         <xsd:element ref="ogc:Filter"/>
+         <xsd:element name="CqlText" type="xsd:string"/>
+      </xsd:choice>
+      <xsd:attribute name="version" type="xsd:string" use="required">
+         <xsd:annotation>
+            <xsd:documentation>Query language version</xsd:documentation>
+         </xsd:annotation>
+      </xsd:attribute>
+   </xsd:complexType>
+   <xsd:element name="ElementSetName" type="csw:ElementSetNameType"
+      id="ElementSetName" default="summary"/>
+   <xsd:complexType name="ElementSetNameType" id="ElementSetNameType">
+      <xsd:simpleContent>
+         <xsd:extension base="csw:ElementSetType">
+            <xsd:attribute name="typeNames" type="csw:TypeNameListType"
+               use="optional"/>
+         </xsd:extension>
+      </xsd:simpleContent>
+   </xsd:complexType>
+   <xsd:simpleType name="ElementSetType" id="ElementSetType">
+      <xsd:annotation>
+         <xsd:documentation>Named subsets of catalogue object properties; these
+         views are mapped to a specific information model and
+         are defined in an application profile.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:restriction base="xsd:string">
+         <xsd:enumeration value="brief"/>
+         <xsd:enumeration value="summary"/>
+         <xsd:enumeration value="full"/>
+      </xsd:restriction>
+   </xsd:simpleType>
+   <xsd:element name="GetRecordsResponse" type="csw:GetRecordsResponseType"
+      id="GetRecordsResponse"/>
+   <xsd:complexType name="GetRecordsResponseType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            The response message for a GetRecords request. Some or all of the 
+            matching records may be included as children of the SearchResults 
+            element. The RequestId is only included if the client specified it.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:element name="RequestId" type="xsd:anyURI" minOccurs="0"/>
+         <xsd:element name="SearchStatus" type="csw:RequestStatusType"/>
+         <xsd:element name="SearchResults" type="csw:SearchResultsType"/>
+      </xsd:sequence>
+      <xsd:attribute name="version" type="xsd:string" use="optional"/>
+   </xsd:complexType>
+
+   <xsd:complexType name="RequestStatusType" id="RequestStatusType">
+      <xsd:annotation>
+         <xsd:documentation>
+            This element provides information about the status of the
+            search request.
+
+            status    - status of the search
+            timestamp - the date and time when the result set was modified 
+                        (ISO 8601 format: YYYY-MM-DDThh:mm:ss[+|-]hh:mm).
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:attribute name="timestamp" type="xsd:dateTime" use="optional"/>
+   </xsd:complexType>
+
+   <xsd:complexType name="SearchResultsType" id="SearchResultsType">
+      <xsd:annotation>
+         <xsd:documentation>Includes representations of result set members if maxRecords > 0.
+         The items must conform to one of the csw:Record views or a 
+         profile-specific representation. 
+         
+         resultSetId  - id of the result set (a URI).
+         elementSet  - The element set that has been returned
+                       (i.e., "brief", "summary", "full")
+         recordSchema  - schema reference for included records(URI)
+         numberOfRecordsMatched  - number of records matched by the query
+         numberOfRecordsReturned - number of records returned to client
+         nextRecord - position of next record in the result set
+                      (0 if no records remain).
+         expires - the time instant when the result set expires and 
+                   is discarded (ISO 8601 format)</xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:choice>
+            <xsd:element ref="csw:AbstractRecord"
+                         minOccurs="0" maxOccurs="unbounded"/>
+            <xsd:any processContents="strict" namespace="##other"
+                     minOccurs="0" maxOccurs="unbounded"/>
+         </xsd:choice>
+      </xsd:sequence>
+      <xsd:attribute name="resultSetId"
+                     type="xsd:anyURI" use="optional"/>
+      <xsd:attribute name="elementSet"
+                     type="csw:ElementSetType" use="optional"/>
+      <xsd:attribute name="recordSchema"
+                     type="xsd:anyURI" use="optional"/>
+      <xsd:attribute name="numberOfRecordsMatched"
+                     type="xsd:nonNegativeInteger" use="required"/>
+      <xsd:attribute name="numberOfRecordsReturned"
+                     type="xsd:nonNegativeInteger" use="required"/>
+      <xsd:attribute name="nextRecord"
+                     type="xsd:nonNegativeInteger" use="optional"/>
+      <xsd:attribute name="expires" type="xsd:dateTime" use="optional"/>
+   </xsd:complexType>
+   <xsd:element name="GetRecordById" type="csw:GetRecordByIdType"
+      id="GetRecordById"/>
+   <xsd:complexType name="GetRecordByIdType" id="GetRecordByIdType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            Convenience operation to retrieve default record representations 
+            by identifier.
+            Id - object identifier (a URI) that provides a reference to a 
+                 catalogue item (or a result set if the catalogue supports 
+                 persistent result sets).
+            ElementSetName - one of "brief, "summary", or "full"
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:RequestBaseType">
+            <xsd:sequence>
+               <xsd:element name="Id" type="xsd:anyURI" maxOccurs="unbounded"/>
+               <xsd:element ref="csw:ElementSetName" minOccurs="0"/>
+            </xsd:sequence>
+            <xsd:attribute name="outputFormat" type="xsd:string"
+                           use="optional" default="application/xml"/>
+            <xsd:attribute name="outputSchema" type="xsd:anyURI"
+                           use="optional"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:element name="GetRecordByIdResponse"
+      type="csw:GetRecordByIdResponseType" id="GetRecordByIdResponse"/>
+   <xsd:complexType name="GetRecordByIdResponseType"
+      id="GetRecordByIdResponseType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">Returns a representation of the matching entry. If there is no 
+         matching record, the response message must be empty.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:choice>
+            <xsd:element ref="csw:AbstractRecord"
+                         minOccurs="0" maxOccurs="unbounded"/>
+            <xsd:any processContents="strict" namespace="##other"
+                     minOccurs="0" maxOccurs="unbounded"/>
+         </xsd:choice>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:element name="GetDomain" type="csw:GetDomainType" id="GetDomain"/>
+   <xsd:complexType name="GetDomainType" id="GetDomainType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">Requests the actual values of some specified request parameter 
+        or other data element.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:RequestBaseType">
+            <xsd:sequence>
+               <xsd:choice>
+                  <xsd:element name="PropertyName" type="xsd:anyURI"/>
+                  <xsd:element name="ParameterName" type="xsd:anyURI"/>
+               </xsd:choice>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:element name="GetDomainResponse" type="csw:GetDomainResponseType"
+      id="GetDomainResponse"/>
+   <xsd:complexType name="GetDomainResponseType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">Returns the actual values for some property. In general this is a
+         subset of the value domain (that is, set of permissible values),
+         although in some cases these may be the same.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:element name="DomainValues" type="csw:DomainValuesType"
+            maxOccurs="unbounded"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="DomainValuesType" id="DomainValuesType">
+      <xsd:sequence>
+         <xsd:choice>
+            <xsd:element name="PropertyName" type="xsd:anyURI"/>
+            <xsd:element name="ParameterName" type="xsd:anyURI"/>
+         </xsd:choice>
+         <xsd:choice minOccurs="0">
+            <xsd:element name="ListOfValues" type="csw:ListOfValuesType"/>
+            <xsd:element name="ConceptualScheme" type="csw:ConceptualSchemeType"/>
+            <xsd:element name="RangeOfValues" type="csw:RangeOfValuesType"/>
+         </xsd:choice>
+      </xsd:sequence>
+      <xsd:attribute name="type" type="xsd:QName" use="required"/>
+      <xsd:attribute name="uom" type="xsd:anyURI" use="optional"/>
+   </xsd:complexType>
+   <xsd:complexType name="ListOfValuesType" id="ListOfValuesType">
+      <xsd:sequence>
+         <xsd:element name="Value" type="xsd:anyType" maxOccurs="unbounded"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="ConceptualSchemeType" id="ConceptualSchemeType">
+      <xsd:sequence>
+         <xsd:element name="Name" type="xsd:string"/>
+         <xsd:element name="Document" type="xsd:anyURI"/>
+         <xsd:element name="Authority" type="xsd:anyURI"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="RangeOfValuesType" id="RangeOfValuesType">
+      <xsd:sequence>
+         <xsd:element name="MinValue" type="xsd:anyType"/>
+         <xsd:element name="MaxValue" type="xsd:anyType"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:element name="Acknowledgement" type="csw:AcknowledgementType"
+      id="Acknowledgement"/>
+   <xsd:complexType name="AcknowledgementType" id="AcknowledgementType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">This is a general acknowledgement response message for all requests 
+         that may be processed in an asynchronous manner.
+         EchoedRequest - Echoes the submitted request message
+         RequestId     - identifier for polling purposes (if no response 
+                         handler is available, or the URL scheme is
+                         unsupported)</xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:element name="EchoedRequest" type="csw:EchoedRequestType"/>
+         <xsd:element name="RequestId" type="xsd:anyURI" minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:attribute name="timeStamp" type="xsd:dateTime" use="required"/>
+   </xsd:complexType>
+   <xsd:complexType name="EchoedRequestType" id="EchoedRequestType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">Includes a copy of the request message body.</xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:any namespace="##any" processContents="lax"/>
+      </xsd:sequence>
+   </xsd:complexType>
+</xsd:schema>
diff --git a/pycsw/schemas/ogc/csw/2.0.2/CSW-publication.xsd b/pycsw/schemas/ogc/csw/2.0.2/CSW-publication.xsd
new file mode 100644
index 0000000..755fba3
--- /dev/null
+++ b/pycsw/schemas/ogc/csw/2.0.2/CSW-publication.xsd
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsd:schema id="csw-publication"
+   targetNamespace="http://www.opengis.net/cat/csw/2.0.2"
+   xmlns:csw="http://www.opengis.net/cat/csw/2.0.2"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+   version="2.0.2 2010-01-22">
+   <xsd:annotation>
+      <xsd:appinfo>
+         <dc:identifier xmlns:dc="http://purl.org/dc/elements/1.1/">http://schemas.opengis.net/csw/2.0.2/CSW-publication.xsd</dc:identifier>
+      </xsd:appinfo>
+      <xsd:documentation xml:lang="en">
+         This schema defines the request and response messages for the 
+         CSW-Publication operations specified in clause 10 of OGC-07-066.
+         
+         CSW is an OGC Standard.
+         Copyright (c) 2004, 2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+         To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </xsd:documentation>
+   </xsd:annotation>
+   <xsd:include schemaLocation="CSW-discovery.xsd"/>
+   <xsd:element name="Transaction" type="csw:TransactionType" id="Transaction"/>
+   <xsd:complexType name="TransactionType" id="TransactionType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            Users may insert, update, or delete catalogue entries. If the 
+            verboseResponse attribute has the value "true", then one or more 
+            csw:InsertResult elements must be included in the response.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:RequestBaseType">
+            <xsd:sequence>
+               <xsd:choice minOccurs="1" maxOccurs="unbounded">
+                  <xsd:element name="Insert" type="csw:InsertType"/>
+                  <xsd:element name="Update" type="csw:UpdateType"/>
+                  <xsd:element name="Delete" type="csw:DeleteType"/>
+               </xsd:choice>
+            </xsd:sequence>
+            <xsd:attribute name="verboseResponse" type="xsd:boolean"
+               use="optional" default="false"/>
+            <xsd:attribute name="requestId" type="xsd:anyURI" use="optional"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="InsertType" id="InsertType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            Submits one or more records to the catalogue. The representation
+            is defined by the application profile. The handle attribute
+            may be included to specify a local identifier for the action 
+            (it must be unique within the context of the transaction).
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:any processContents="strict" namespace="##other"
+            maxOccurs="unbounded"/>
+      </xsd:sequence>
+      <xsd:attribute name="typeName" type="xsd:anyURI" use="optional"/>
+      <xsd:attribute name="handle" type="xsd:ID" use="optional"/>
+   </xsd:complexType>
+   <xsd:complexType name="UpdateType" id="UpdateType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            Update statements may replace an entire record or only update part 
+            of a record:
+            1) To replace an existing record, include a new instance of the 
+               record;
+            2) To update selected properties of an existing record, include
+               a set of RecordProperty elements. The scope of the update
+               statement  is determined by the Constraint element.
+               The 'handle' is a local identifier for the action.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:choice>
+            <xsd:any processContents="strict" namespace="##other"/>
+            <xsd:sequence>
+               <xsd:element ref="csw:RecordProperty" maxOccurs="unbounded"/>
+               <xsd:element ref="csw:Constraint"/>
+            </xsd:sequence>
+         </xsd:choice>
+      </xsd:sequence>
+      <xsd:attribute name="handle" type="xsd:ID" use="optional"/>
+   </xsd:complexType>
+   <xsd:complexType name="DeleteType" id="DeleteType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            Deletes one or more catalogue items that satisfy some set of 
+            conditions.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:element ref="csw:Constraint" minOccurs="1" maxOccurs="1"/>
+      </xsd:sequence>
+      <xsd:attribute name="typeName" type="xsd:anyURI" use="optional"/>
+      <xsd:attribute name="handle" type="xsd:ID" use="optional"/>
+   </xsd:complexType>
+   <xsd:element name="RecordProperty" type="csw:RecordPropertyType">
+      <xsd:annotation>
+         <xsd:documentation>
+            The RecordProperty element is used to specify the new
+            value of a record property in an update statement.
+         </xsd:documentation>
+      </xsd:annotation>
+   </xsd:element>
+   <xsd:complexType name="RecordPropertyType">
+      <xsd:sequence>
+         <xsd:element name="Name" type="xsd:string">
+            <xsd:annotation>
+               <xsd:documentation>
+                  The Name element contains the name of a property
+                  to be updated.  The name may be a path expression.
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+         <xsd:element name="Value" type="xsd:anyType" minOccurs="0">
+            <xsd:annotation>
+               <xsd:documentation>
+                  The Value element contains the replacement value for the
+                  named property.
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:element name="TransactionResponse" type="csw:TransactionResponseType"
+      id="TransactionResponse"/>
+   <xsd:complexType name="TransactionResponseType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            The response for a transaction request that was successfully
+            completed. If the transaction failed for any reason, a service 
+            exception report indicating a TransactionFailure is returned
+            instead.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:element name="TransactionSummary"
+            type="csw:TransactionSummaryType"/>
+         <xsd:element name="InsertResult" type="csw:InsertResultType"
+            minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+      <xsd:attribute name="version" type="xsd:string" use="optional"/>
+   </xsd:complexType>
+   <xsd:complexType name="TransactionSummaryType" id="TransactionSummaryType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+         Reports the total number of catalogue items modified by a transaction 
+         request (i.e, inserted, updated, deleted). If the client did not 
+         specify a requestId, the server may assign one (a URI value).
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:element name="totalInserted" type="xsd:nonNegativeInteger"
+            minOccurs="0"/>
+         <xsd:element name="totalUpdated" type="xsd:nonNegativeInteger"
+            minOccurs="0"/>
+         <xsd:element name="totalDeleted" type="xsd:nonNegativeInteger"
+            minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:attribute name="requestId" type="xsd:anyURI" use="optional"/>
+   </xsd:complexType>
+   <xsd:complexType name="InsertResultType" id="InsertResultType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            Returns a "brief" view of any newly created catalogue records.
+            The handle attribute may reference a particular statement in
+            the corresponding transaction request.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:sequence>
+         <xsd:element ref="csw:BriefRecord" maxOccurs="unbounded"/>
+      </xsd:sequence>
+      <xsd:attribute name="handleRef" type="xsd:anyURI" use="optional"/>
+   </xsd:complexType>
+   <xsd:element name="Harvest" type="csw:HarvestType" id="Harvest"/>
+   <xsd:complexType name="HarvestType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+         Requests that the catalogue attempt to harvest a resource from some 
+         network location identified by the source URL.
+
+         Source          - a URL from which the resource is retrieved
+         ResourceType    - normally a URI that specifies the type of the resource
+                           (DCMES v1.1) being harvested if it is known.
+         ResourceFormat  - a media type indicating the format of the 
+                           resource being harvested.  The default is 
+                           "application/xml".
+         ResponseHandler - a reference to some endpoint to which the 
+                           response shall be forwarded when the
+                           harvest operation has been completed
+         HarvestInterval - an interval expressed using the ISO 8601 syntax; 
+                           it specifies the interval between harvest 
+                           attempts (e.g., P6M indicates an interval of 
+                           six months).
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:RequestBaseType">
+            <xsd:sequence>
+               <xsd:element name="Source" type="xsd:anyURI"/>
+               <xsd:element name="ResourceType" type="xsd:string"/>
+               <xsd:element name="ResourceFormat" type="xsd:string"
+                  minOccurs="0" default="application/xml"/>
+               <xsd:element name="HarvestInterval" type="xsd:duration"
+                  minOccurs="0"/>
+               <xsd:element name="ResponseHandler" type="xsd:anyURI"
+                  minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:element name="HarvestResponse" type="csw:HarvestResponseType"
+      id="HarvestResponse">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+         The content of the response varies depending on the presence of the 
+         ResponseHandler element. If present, then the catalogue should 
+         verify the request and respond immediately with an csw:Acknowledgement 
+         element in the response. The catalogue must then attempt to harvest 
+         the resource at some later time and send the response message to the 
+         location specified by the value of the ResponseHandler element using 
+         the indicated protocol (e.g. ftp, mailto, http).
+         
+         If the ResponseHandler element is absent, then the catalogue 
+         must attempt to harvest the resource immediately and include a 
+         TransactionResponse element in the response.
+        
+         In any case, if the harvest attempt is successful the response 
+         shall include summary representations of the newly created 
+         catalogue item(s).
+         </xsd:documentation>
+      </xsd:annotation>
+   </xsd:element>
+   <xsd:complexType name="HarvestResponseType" id="HarvestResponseType">
+      <xsd:choice>
+         <xsd:element ref="csw:Acknowledgement"/>
+         <xsd:element ref="csw:TransactionResponse"/>
+      </xsd:choice>
+   </xsd:complexType>
+</xsd:schema>
diff --git a/pycsw/schemas/ogc/csw/2.0.2/rec-dcmes.xsd b/pycsw/schemas/ogc/csw/2.0.2/rec-dcmes.xsd
new file mode 100644
index 0000000..c9bd35e
--- /dev/null
+++ b/pycsw/schemas/ogc/csw/2.0.2/rec-dcmes.xsd
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xs:schema id="dcmes" targetNamespace="http://purl.org/dc/elements/1.1/"
+   xmlns:xs="http://www.w3.org/2001/XMLSchema"
+   xmlns:dc="http://purl.org/dc/elements/1.1/" elementFormDefault="qualified"
+   attributeFormDefault="unqualified" version="2.0.2">
+   <xs:annotation>
+      <xs:documentation xml:lang="en"
+         source="http://dublincore.org/documents/dces/">This schema declares XML elements for the 15 Dublin Core elements in 
+    the "http://purl.org/dc/elements/1.1/" namespace.</xs:documentation>
+   </xs:annotation>
+   <xs:complexType name="SimpleLiteral">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">This is the default type for all of the DC elements. It defines a 
+      complexType SimpleLiteral which permits mixed content but disallows 
+      child elements by use of minOcccurs/maxOccurs. However, this complexType 
+      does permit the derivation of other types which would permit child 
+      elements. The scheme attribute may be used as a qualifier to reference 
+      an encoding scheme that describes the value domain for a given property.</xs:documentation>
+      </xs:annotation>
+      <xs:complexContent mixed="true">
+         <xs:restriction base="xs:anyType">
+            <xs:sequence>
+               <xs:any processContents="lax" minOccurs="0" maxOccurs="0"/>
+            </xs:sequence>
+            <xs:attribute name="scheme" type="xs:anyURI" use="optional"/>
+         </xs:restriction>
+      </xs:complexContent>
+   </xs:complexType>
+   <xs:element name="DC-element" type="dc:SimpleLiteral" abstract="true"/>
+   <xs:element name="title" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">A name given to the resource. Typically, Title will be a name by 
+      which the resource is formally known.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="creator" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">An entity primarily responsible for making the content of the resource.
+      Examples of Creator include a person, an organization, or a service. 
+      Typically, the name of a Creator should be used to indicate the entity.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="subject" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">A topic of the content of the resource. Typically, Subject will be 
+      expressed as keywords, key phrases, or classification codes that 
+      describe a topic of the resource. Recommended best practice is to 
+      select a value from a controlled vocabulary or formal classification 
+      scheme.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="description" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">An account of the content of the resource. Examples of Description 
+      include, but are not limited to, an abstract, table of contents, 
+      reference to a graphical representation of content, or free-text 
+      account of the content.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="publisher" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">An entity responsible for making the resource available. Examples of 
+      Publisher include a person, an organization, or a service. Typically, 
+      the name of a Publisher should be used to indicate the entity.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="contributor" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">An entity responsible for making contributions to the content of 
+      the resource. Examples of Contributor include a person, an organization, 
+      or a service. Typically, the name of a Contributor should be used to 
+      indicate the entity.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="date" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">A date of an event in the lifecycle of the resource. Typically, Date 
+      will be associated with the creation or availability of the resource. 
+      Recommended best practice for encoding the date value is defined in a 
+      profile of ISO 8601 and includes (among others) dates of the 
+      form YYYY-MM-DD.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="type" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">The nature or genre of the content of the resource. Type includes 
+      terms describing general categories, functions, genres, or aggregation 
+      levels for content. Recommended best practice is to select a value 
+      from a controlled vocabulary (for example, the DCMI Type Vocabulary). 
+      To describe the physical or digital manifestation of the resource, 
+      use the Format element.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="format" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">The physical or digital manifestation of the resource. Typically, 
+      Format will include the media-type or dimensions of the resource. 
+      Format may be used to identify the software, hardware, or other 
+      equipment needed to display or operate the resource. Examples of 
+      dimensions include size and duration. Recommended best practice is to 
+      select a value from a controlled vocabulary (for example, the list 
+      of Internet Media Types defining computer media formats).</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="identifier" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">An unambiguous reference to the resource within a given context. 
+      Recommended best practice is to identify the resource by means of a 
+      string or number conforming to a formal identification system. Formal 
+      identification systems include but are not limited to the Uniform 
+      Resource Identifier (URI) (including the Uniform Resource Locator 
+      (URL)), the Digital Object Identifier (DOI), and the International 
+      Standard Book Number (ISBN).</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="source" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">A Reference to a resource from which the present resource is derived.
+      The present resource may be derived from the Source resource in whole 
+      or in part. Recommended best practice is to identify the referenced 
+      resource by means of a string or number conforming to a formal 
+      identification system.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="language" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">A language of the intellectual content of the resource. Recommended 
+      best practice is to use RFC 3066, which, in conjunction with ISO 639, 
+      defines two- and three-letter primary language tags with optional 
+      subtags. Examples include "en" or "eng" for English, "akk" for
+      Akkadian, and "en-GB" for English used in the United Kingdom.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="relation" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">A reference to a related resource. Recommended best practice is to 
+      identify the referenced resource by means of a string or number 
+      conforming to a formal identification system.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="coverage" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">The extent or scope of the content of the resource. Typically, 
+      Coverage will include spatial location (a place name or geographic 
+      coordinates), temporal period (a period label, date, or date range), 
+      or jurisdiction (such as a named administrative entity). Recommended 
+      best practice is to select a value from a controlled vocabulary 
+      (for example, the Thesaurus of Geographic Names [TGN]) and to use, 
+      where appropriate, named places or time periods in preference to 
+      numeric identifiers such as sets of coordinates or date ranges.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:element name="rights" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">Information about rights held in and over the resource. Typically, 
+      Rights will contain a rights management statement for the resource, 
+      or reference a service providing such information. Rights information 
+      often encompasses Intellectual Property Rights (IPR), Copyright, and 
+      various Property Rights. If the Rights element is absent, no 
+      assumptions may be made about any rights held in or over the resource.</xs:documentation>
+      </xs:annotation>
+   </xs:element>
+   <xs:group name="DC-element-set">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">This group is included as a convenience for schema authors who need 
+      to refer to all the elements in the "http://purl.org/dc/elements/1.1/" 
+      namespace.</xs:documentation>
+      </xs:annotation>
+      <xs:sequence>
+         <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="dc:DC-element"/>
+         </xs:choice>
+      </xs:sequence>
+   </xs:group>
+   <xs:complexType name="elementContainer">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">This type definition is included as a convenience for schema authors 
+      who need a container element for all of the DC elements.</xs:documentation>
+      </xs:annotation>
+      <xs:choice>
+         <xs:group ref="dc:DC-element-set"/>
+      </xs:choice>
+   </xs:complexType>
+</xs:schema>
diff --git a/pycsw/schemas/ogc/csw/2.0.2/rec-dcterms.xsd b/pycsw/schemas/ogc/csw/2.0.2/rec-dcterms.xsd
new file mode 100644
index 0000000..57d15d8
--- /dev/null
+++ b/pycsw/schemas/ogc/csw/2.0.2/rec-dcterms.xsd
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xs:schema id="dcmi-terms" targetNamespace="http://purl.org/dc/terms/"
+   xmlns:xs="http://www.w3.org/2001/XMLSchema"
+   xmlns:dct="http://purl.org/dc/terms/"
+   xmlns:dc="http://purl.org/dc/elements/1.1/" elementFormDefault="qualified"
+   attributeFormDefault="unqualified" version="2.0.2 2010-01-22">
+   <xs:annotation>
+      <xs:documentation xml:lang="en"
+         source="http://dublincore.org/documents/dcmi-terms/">This schema declares additional DCMI elements and element refinements 
+    in the "http://purl.org/dc/terms/" namespace.</xs:documentation>
+   </xs:annotation>
+   <xs:import namespace="http://purl.org/dc/elements/1.1/" schemaLocation="rec-dcmes.xsd"/>
+   <xs:element name="abstract" type="dc:SimpleLiteral"
+      substitutionGroup="dc:description"/>
+   <xs:element name="accessRights" type="dc:SimpleLiteral"
+      substitutionGroup="dc:rights"/>
+   <xs:element name="alternative" type="dc:SimpleLiteral"
+      substitutionGroup="dc:title"/>
+   <xs:element name="audience" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element"/>
+   <xs:element name="available" type="dc:SimpleLiteral"
+      substitutionGroup="dc:date"/>
+   <xs:element name="bibliographicCitation" type="dc:SimpleLiteral"
+      substitutionGroup="dc:identifier"/>
+   <xs:element name="conformsTo" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="created" type="dc:SimpleLiteral"
+      substitutionGroup="dc:date"/>
+   <xs:element name="dateAccepted" type="dc:SimpleLiteral"
+      substitutionGroup="dc:date"/>
+   <xs:element name="dateCopyrighted" type="dc:SimpleLiteral"
+      substitutionGroup="dc:date"/>
+   <xs:element name="dateSubmitted" type="dc:SimpleLiteral"
+      substitutionGroup="dc:date"/>
+   <xs:element name="educationLevel" type="dc:SimpleLiteral"
+      substitutionGroup="dct:audience"/>
+   <xs:element name="extent" type="dc:SimpleLiteral"
+      substitutionGroup="dc:format"/>
+   <xs:element name="hasFormat" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="hasPart" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="hasVersion" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="isFormatOf" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="isPartOf" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="isReferencedBy" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="isReplacedBy" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="isRequiredBy" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="issued" type="dc:SimpleLiteral" substitutionGroup="dc:date"/>
+   <xs:element name="isVersionOf" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="license" type="dc:SimpleLiteral"
+      substitutionGroup="dc:rights"/>
+   <xs:element name="mediator" type="dc:SimpleLiteral"
+      substitutionGroup="dct:audience"/>
+   <xs:element name="medium" type="dc:SimpleLiteral"
+      substitutionGroup="dc:format"/>
+   <xs:element name="modified" type="dc:SimpleLiteral"
+      substitutionGroup="dc:date"/>
+   <xs:element name="provenance" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element"/>
+   <xs:element name="references" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="replaces" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="requires" type="dc:SimpleLiteral"
+      substitutionGroup="dc:relation"/>
+   <xs:element name="rightsHolder" type="dc:SimpleLiteral"
+      substitutionGroup="dc:DC-element"/>
+   <xs:element name="spatial" type="dc:SimpleLiteral"
+      substitutionGroup="dc:coverage"/>
+   <xs:element name="tableOfContents" type="dc:SimpleLiteral"
+      substitutionGroup="dc:description"/>
+   <xs:element name="temporal" type="dc:SimpleLiteral"
+      substitutionGroup="dc:coverage"/>
+   <xs:element name="valid" type="dc:SimpleLiteral" substitutionGroup="dc:date"/>
+   <xs:group name="DCMI-terms">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">This group is included as a convenience for schema authors who need 
+      to refer to the complete set of DCMI metadata terms.</xs:documentation>
+      </xs:annotation>
+      <xs:sequence>
+         <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="dc:DC-element"/>
+         </xs:choice>
+      </xs:sequence>
+   </xs:group>
+</xs:schema>
diff --git a/pycsw/schemas/ogc/csw/2.0.2/record.xsd b/pycsw/schemas/ogc/csw/2.0.2/record.xsd
new file mode 100644
index 0000000..d60e11c
--- /dev/null
+++ b/pycsw/schemas/ogc/csw/2.0.2/record.xsd
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsd:schema id="csw-record"
+   targetNamespace="http://www.opengis.net/cat/csw/2.0.2"
+   xmlns:csw="http://www.opengis.net/cat/csw/2.0.2"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows"
+   elementFormDefault="qualified" version="2.0.2 2010-01-22">
+   <xsd:annotation>
+      <xsd:appinfo>
+         <dc:identifier xmlns:dc="http://purl.org/dc/elements/1.1/">http://schemas.opengis.net/csw/2.0.2/record.xsd</dc:identifier>
+      </xsd:appinfo>
+      <xsd:documentation xml:lang="en">
+         This schema defines the basic record types that must be supported
+         by all CSW implementations. These correspond to full, summary, and
+         brief views based on DCMI metadata terms.
+         
+         CSW is an OGC Standard.
+         Copyright (c) 2004,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+         To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </xsd:documentation>
+   </xsd:annotation>
+
+   <xsd:import namespace="http://purl.org/dc/terms/" schemaLocation="rec-dcterms.xsd"/>
+   <xsd:import namespace="http://purl.org/dc/elements/1.1/" schemaLocation="rec-dcmes.xsd"/>
+   <xsd:import namespace="http://www.opengis.net/ows" schemaLocation="../../ows/1.0.0/owsAll.xsd"/>
+
+   <xsd:element name="AbstractRecord" id="AbstractRecord"
+                type="csw:AbstractRecordType" abstract="true" />
+   <xsd:complexType name="AbstractRecordType" id="AbstractRecordType"
+                    abstract="true"/>
+
+   <xsd:element name="DCMIRecord" type="csw:DCMIRecordType"
+                substitutionGroup="csw:AbstractRecord"/>
+   <xsd:complexType name="DCMIRecordType">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            This type encapsulates all of the standard DCMI metadata terms,
+            including the Dublin Core refinements; these terms may be mapped
+            to the profile-specific information model.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:AbstractRecordType">
+            <xsd:sequence>
+               <xsd:group ref="dct:DCMI-terms"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+
+   <xsd:element name="BriefRecord" type="csw:BriefRecordType"
+                substitutionGroup="csw:AbstractRecord"/>
+   <xsd:complexType name="BriefRecordType" final="#all">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            This type defines a brief representation of the common record
+            format.  It extends AbstractRecordType to include only the
+             dc:identifier and dc:type properties.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:AbstractRecordType">
+            <xsd:sequence>
+               <xsd:element ref="dc:identifier"
+                            minOccurs="1" maxOccurs="unbounded"/>
+               <xsd:element ref="dc:title"
+                            minOccurs="1" maxOccurs="unbounded"/>
+               <xsd:element ref="dc:type"
+                            minOccurs="0"/>
+               <xsd:element ref="ows:BoundingBox"
+                            minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+
+   <xsd:element name="SummaryRecord" type="csw:SummaryRecordType"
+                substitutionGroup="csw:AbstractRecord"/>
+   <xsd:complexType name="SummaryRecordType" final="#all">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            This type defines a summary representation of the common record
+            format.  It extends AbstractRecordType to include the core
+            properties.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:AbstractRecordType">
+            <xsd:sequence>
+               <xsd:element ref="dc:identifier"
+                            minOccurs="1" maxOccurs="unbounded"/>
+               <xsd:element ref="dc:title"
+                            minOccurs="1" maxOccurs="unbounded"/>
+               <xsd:element ref="dc:type"
+                            minOccurs="0"/>
+               <xsd:element ref="dc:subject"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element ref="dc:format"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element ref="dc:relation"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element ref="dct:modified"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element ref="dct:abstract"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element ref="dct:spatial"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element ref="ows:BoundingBox"
+                            minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+
+   <xsd:element name="Record" type="csw:RecordType"
+                substitutionGroup="csw:AbstractRecord"/>
+   <xsd:complexType name="RecordType" final="#all">
+      <xsd:annotation>
+         <xsd:documentation xml:lang="en">
+            This type extends DCMIRecordType to add ows:BoundingBox;
+            it may be used to specify a spatial envelope for the
+            catalogued resource.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:complexContent>
+         <xsd:extension base="csw:DCMIRecordType">
+            <xsd:sequence>
+               <xsd:element name="AnyText" type="csw:EmptyType"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element ref="ows:BoundingBox"
+                            minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="EmptyType" />
+</xsd:schema>
diff --git a/pycsw/schemas/ogc/filter/1.1.0/expr.xsd b/pycsw/schemas/ogc/filter/1.1.0/expr.xsd
new file mode 100644
index 0000000..8dfad75
--- /dev/null
+++ b/pycsw/schemas/ogc/filter/1.1.0/expr.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema targetNamespace="http://www.opengis.net/ogc"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="1.1.2">
+   <!-- 
+      filter is an OGC Standard.
+      Copyright (c) 2002,2003,2004,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+      To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      
+      Updated: 2010-01-22
+   -->
+   <xsd:element name="Add" type="ogc:BinaryOperatorType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Sub" type="ogc:BinaryOperatorType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Mul" type="ogc:BinaryOperatorType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Div" type="ogc:BinaryOperatorType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="PropertyName" type="ogc:PropertyNameType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Function" type="ogc:FunctionType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="Literal" type="ogc:LiteralType"
+      substitutionGroup="ogc:expression"/>
+   <xsd:element name="expression" type="ogc:ExpressionType" abstract="true"/>
+   <!-- <xsd:complexType name="ExpressionType" abstract="true" mixed="true"/>
+     -->
+   <xsd:complexType name="ExpressionType" abstract="true"/>
+   <xsd:complexType name="BinaryOperatorType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ExpressionType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:expression" minOccurs="2" maxOccurs="2"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="FunctionType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ExpressionType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:expression" minOccurs="0"
+                  maxOccurs="unbounded"/>
+            </xsd:sequence>
+            <xsd:attribute name="name" type="xsd:string" use="required"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="LiteralType">
+      <xsd:complexContent mixed="true">
+         <xsd:extension base="ogc:ExpressionType">
+            <xsd:sequence>
+               <xsd:any minOccurs="0"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="PropertyNameType">
+      <xsd:complexContent mixed="true">
+         <xsd:extension base="ogc:ExpressionType"/>
+      </xsd:complexContent>
+   </xsd:complexType>
+</xsd:schema>
diff --git a/pycsw/schemas/ogc/filter/1.1.0/filter.xsd b/pycsw/schemas/ogc/filter/1.1.0/filter.xsd
new file mode 100644
index 0000000..4ddc19a
--- /dev/null
+++ b/pycsw/schemas/ogc/filter/1.1.0/filter.xsd
@@ -0,0 +1,265 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema targetNamespace="http://www.opengis.net/ogc"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="1.1.2">
+
+   <xsd:annotation>
+      <xsd:documentation>
+         This XML Schema defines OGC query filter capabilities documents.
+         filter is an OGC Standard.
+
+         Copyright (c) 2002,2003,2004,2010 Open Geospatial Consortium, Inc.
+         All Rights Reserved.
+
+         To obtain additional rights of use, visit:
+         http://www.opengeospatial.org/legal/ .
+
+         Updated: 2011-02-04
+      </xsd:documentation>
+   </xsd:annotation>
+
+   <xsd:include schemaLocation="expr.xsd"/>
+   <xsd:include schemaLocation="sort.xsd"/>
+   <xsd:include schemaLocation="filterCapabilities.xsd"/>
+
+   <xsd:import namespace="http://www.opengis.net/gml"
+               schemaLocation="../../gml/3.1.1/base/geometryAggregates.xsd"/>
+
+   <xsd:element name="_Id" type="ogc:AbstractIdType" abstract="true"/>
+   <xsd:element name="FeatureId"
+                type="ogc:FeatureIdType"
+                substitutionGroup="ogc:_Id"/>
+   <xsd:element name="GmlObjectId"
+                type="ogc:GmlObjectIdType"
+                substitutionGroup="ogc:_Id"/>
+
+   <xsd:element name="Filter" type="ogc:FilterType"/>
+   <xsd:complexType name="FilterType">
+      <xsd:choice>
+         <xsd:element ref="ogc:spatialOps"/>
+         <xsd:element ref="ogc:comparisonOps"/>
+         <xsd:element ref="ogc:logicOps"/>
+         <xsd:element ref="ogc:_Id" maxOccurs="unbounded"/>
+      </xsd:choice>
+   </xsd:complexType>
+
+   <xsd:element name="comparisonOps"
+                type="ogc:ComparisonOpsType"
+                abstract="true"/>
+   <xsd:element name="PropertyIsEqualTo"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsNotEqualTo"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsLessThan"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsGreaterThan"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsLessThanOrEqualTo"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsGreaterThanOrEqualTo"
+                type="ogc:BinaryComparisonOpType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsLike"
+                type="ogc:PropertyIsLikeType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsNull"
+                type="ogc:PropertyIsNullType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:element name="PropertyIsBetween"
+                type="ogc:PropertyIsBetweenType"
+                substitutionGroup="ogc:comparisonOps"/>
+   <xsd:complexType name="ComparisonOpsType" abstract="true"/>
+   <xsd:element name="spatialOps" type="ogc:SpatialOpsType" abstract="true"/>
+   <xsd:element name="Equals"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Disjoint"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Touches"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Within"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Overlaps"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Crosses"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Intersects"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Contains"
+                type="ogc:BinarySpatialOpType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="DWithin"
+                type="ogc:DistanceBufferType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="Beyond"
+                type="ogc:DistanceBufferType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:element name="BBOX"
+                type="ogc:BBOXType"
+                substitutionGroup="ogc:spatialOps"/>
+   <xsd:complexType name="SpatialOpsType" abstract="true"/>
+   <xsd:element name="logicOps" type="ogc:LogicOpsType" abstract="true"/>
+   <xsd:element name="And"
+                type="ogc:BinaryLogicOpType"
+                substitutionGroup="ogc:logicOps"/>
+   <xsd:element name="Or"
+                type="ogc:BinaryLogicOpType"
+                substitutionGroup="ogc:logicOps"/>
+   <xsd:element name="Not"
+                type="ogc:UnaryLogicOpType"
+                substitutionGroup="ogc:logicOps"/>
+   <xsd:complexType name="LogicOpsType" abstract="true"/>
+   <xsd:complexType name="AbstractIdType" abstract="true"/>
+   <xsd:complexType name="FeatureIdType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:AbstractIdType">
+            <xsd:attribute name="fid" type="xsd:ID" use="required"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="GmlObjectIdType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:AbstractIdType">
+            <xsd:attribute ref="gml:id" use="required"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="BinaryComparisonOpType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ComparisonOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:expression" minOccurs="2" maxOccurs="2"/>
+            </xsd:sequence>
+            <xsd:attribute name="matchCase" type="xsd:boolean" use="optional"
+                           default="true"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="PropertyIsLikeType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ComparisonOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName"/>
+               <xsd:element ref="ogc:Literal"/>
+            </xsd:sequence>
+            <xsd:attribute name="wildCard" type="xsd:string" use="required"/>
+            <xsd:attribute name="singleChar" type="xsd:string" use="required"/>
+            <xsd:attribute name="escapeChar" type="xsd:string" use="required"/>
+            <xsd:attribute name="matchCase" type="xsd:boolean" use="optional"
+                           default="true"/>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="PropertyIsNullType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ComparisonOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="PropertyIsBetweenType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:ComparisonOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:expression"/>
+               <xsd:element name="LowerBoundary" type="ogc:LowerBoundaryType"/>
+               <xsd:element name="UpperBoundary" type="ogc:UpperBoundaryType"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="LowerBoundaryType">
+      <xsd:choice>
+         <xsd:element ref="ogc:expression"/>
+      </xsd:choice>
+   </xsd:complexType>
+   <xsd:complexType name="UpperBoundaryType">
+      <xsd:sequence>
+         <xsd:element ref="ogc:expression"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="BinarySpatialOpType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:SpatialOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName"/>
+               <xsd:choice>
+                  <xsd:element ref="ogc:PropertyName"/>
+                  <xsd:element ref="gml:_Geometry"/>
+                  <xsd:element ref="gml:Envelope"/>
+               </xsd:choice>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="BBOXType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:SpatialOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName" minOccurs="0"/>
+               <xsd:element ref="gml:Envelope"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="DistanceBufferType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:SpatialOpsType">
+            <xsd:sequence>
+               <xsd:element ref="ogc:PropertyName"/>
+               <xsd:element ref="gml:_Geometry"/>
+               <xsd:element name="Distance" type="ogc:DistanceType"/>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="DistanceType">
+      <xsd:simpleContent>
+         <xsd:extension base="xsd:double">
+            <xsd:attribute name="units" type="xsd:anyURI" use="required"/>
+         </xsd:extension>
+      </xsd:simpleContent>
+   </xsd:complexType>
+   <xsd:complexType name="BinaryLogicOpType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:LogicOpsType">
+            <xsd:choice minOccurs="2" maxOccurs="unbounded">
+               <xsd:element ref="ogc:comparisonOps"/>
+               <xsd:element ref="ogc:spatialOps"/>
+               <xsd:element ref="ogc:logicOps"/>
+               <xsd:element ref="ogc:Function"/>
+            </xsd:choice>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+   <xsd:complexType name="UnaryLogicOpType">
+      <xsd:complexContent>
+         <xsd:extension base="ogc:LogicOpsType">
+            <xsd:sequence>
+               <xsd:choice>
+                  <xsd:element ref="ogc:comparisonOps"/>
+                  <xsd:element ref="ogc:spatialOps"/>
+                  <xsd:element ref="ogc:logicOps"/>
+                  <xsd:element ref="ogc:Function"/>
+               </xsd:choice>
+            </xsd:sequence>
+         </xsd:extension>
+      </xsd:complexContent>
+   </xsd:complexType>
+</xsd:schema>
diff --git a/pycsw/schemas/ogc/filter/1.1.0/filterCapabilities.xsd b/pycsw/schemas/ogc/filter/1.1.0/filterCapabilities.xsd
new file mode 100644
index 0000000..6d45e2f
--- /dev/null
+++ b/pycsw/schemas/ogc/filter/1.1.0/filterCapabilities.xsd
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema
+   targetNamespace="http://www.opengis.net/ogc"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="1.1.2">
+   <xsd:annotation>
+      <xsd:documentation>
+         This XML Schema defines OGC query filter capabilities documents.
+         
+         filter is an OGC Standard.
+         Copyright (c) 2002,2003,2004,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+         To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+         
+         Updated: 2010-01-22
+      </xsd:documentation>
+   </xsd:annotation>
+   <xsd:element name="Filter_Capabilities">
+      <xsd:complexType>
+         <xsd:sequence>
+            <xsd:element name="Spatial_Capabilities"
+                         type="ogc:Spatial_CapabilitiesType"/>
+            <xsd:element name="Scalar_Capabilities"
+                         type="ogc:Scalar_CapabilitiesType"/>
+            <xsd:element name="Id_Capabilities"
+                         type="ogc:Id_CapabilitiesType"/>
+         </xsd:sequence>
+      </xsd:complexType>
+   </xsd:element>
+   <xsd:complexType name="Spatial_CapabilitiesType">
+      <xsd:sequence>
+         <xsd:element name="GeometryOperands"
+                      type="ogc:GeometryOperandsType"/>
+         <xsd:element name="SpatialOperators"
+                      type="ogc:SpatialOperatorsType"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="GeometryOperandsType">
+      <xsd:sequence>
+         <xsd:element name="GeometryOperand"
+                      type="ogc:GeometryOperandType" maxOccurs="unbounded"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:simpleType name="GeometryOperandType">
+      <xsd:restriction base="xsd:QName">
+         <xsd:enumeration value="gml:Envelope"/>
+         <xsd:enumeration value="gml:Point"/>
+         <xsd:enumeration value="gml:LineString"/>
+         <xsd:enumeration value="gml:Polygon"/>
+         <xsd:enumeration value="gml:ArcByCenterPoint"/>
+         <xsd:enumeration value="gml:CircleByCenterPoint"/>
+         <xsd:enumeration value="gml:Arc"/>
+         <xsd:enumeration value="gml:Circle"/>
+         <xsd:enumeration value="gml:ArcByBulge"/>
+         <xsd:enumeration value="gml:Bezier"/>
+         <xsd:enumeration value="gml:Clothoid"/>
+         <xsd:enumeration value="gml:CubicSpline"/>
+         <xsd:enumeration value="gml:Geodesic"/>
+         <xsd:enumeration value="gml:OffsetCurve"/>
+         <xsd:enumeration value="gml:Triangle"/>
+         <xsd:enumeration value="gml:PolyhedralSurface"/>
+         <xsd:enumeration value="gml:TriangulatedSurface"/>
+         <xsd:enumeration value="gml:Tin"/>
+         <xsd:enumeration value="gml:Solid"/>
+      </xsd:restriction>
+   </xsd:simpleType>
+   <xsd:complexType name="SpatialOperatorsType">
+      <xsd:sequence>
+         <xsd:element name="SpatialOperator"
+                      type="ogc:SpatialOperatorType"
+                      maxOccurs="unbounded"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="SpatialOperatorType">
+      <xsd:sequence>
+         <xsd:element name="GeometryOperands"
+                      type="ogc:GeometryOperandsType"
+                      minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:attribute name="name" type="ogc:SpatialOperatorNameType"/>
+   </xsd:complexType>
+   <xsd:simpleType name="SpatialOperatorNameType">
+      <xsd:restriction base="xsd:string">
+         <xsd:enumeration value="BBOX"/>
+         <xsd:enumeration value="Equals"/>
+         <xsd:enumeration value="Disjoint"/>
+         <xsd:enumeration value="Intersects"/>
+         <xsd:enumeration value="Touches"/>
+         <xsd:enumeration value="Crosses"/>
+         <xsd:enumeration value="Within"/>
+         <xsd:enumeration value="Contains"/>
+         <xsd:enumeration value="Overlaps"/>
+         <xsd:enumeration value="Beyond"/>
+         <xsd:enumeration value="DWithin"/>
+      </xsd:restriction>
+   </xsd:simpleType>
+   <xsd:complexType name="Scalar_CapabilitiesType">
+      <xsd:sequence>
+         <xsd:element ref="ogc:LogicalOperators"
+                      minOccurs="0" maxOccurs="1"/>
+         <xsd:element name="ComparisonOperators"
+                      type="ogc:ComparisonOperatorsType"
+                      minOccurs="0" maxOccurs="1"/>
+         <xsd:element name="ArithmeticOperators"
+                      type="ogc:ArithmeticOperatorsType"
+                      minOccurs="0" maxOccurs="1"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:element name="LogicalOperators">
+      <xsd:complexType/>
+   </xsd:element>
+   <xsd:complexType name="ComparisonOperatorsType">
+      <xsd:sequence maxOccurs="unbounded">
+         <xsd:element name="ComparisonOperator"
+                      type="ogc:ComparisonOperatorType"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:simpleType name="ComparisonOperatorType">
+      <xsd:restriction base="xsd:string">
+         <xsd:enumeration value="LessThan"/>
+         <xsd:enumeration value="GreaterThan"/>
+         <xsd:enumeration value="LessThanEqualTo"/>
+         <xsd:enumeration value="GreaterThanEqualTo"/>
+         <xsd:enumeration value="EqualTo"/>
+         <xsd:enumeration value="NotEqualTo"/>
+         <xsd:enumeration value="Like"/>
+         <xsd:enumeration value="Between"/>
+         <xsd:enumeration value="NullCheck"/>
+      </xsd:restriction>
+   </xsd:simpleType>
+   <xsd:complexType name="ArithmeticOperatorsType">
+      <xsd:choice maxOccurs="unbounded">
+         <xsd:element ref="ogc:SimpleArithmetic"/>
+         <xsd:element name="Functions" type="ogc:FunctionsType"/>
+      </xsd:choice>
+   </xsd:complexType>
+   <xsd:element name="SimpleArithmetic">
+      <xsd:complexType/>
+   </xsd:element>
+   <xsd:complexType name="FunctionsType">
+      <xsd:sequence>
+         <xsd:element name="FunctionNames" type="ogc:FunctionNamesType"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="FunctionNamesType">
+      <xsd:sequence maxOccurs="unbounded">
+         <xsd:element name="FunctionName" type="ogc:FunctionNameType"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="FunctionNameType">
+      <xsd:simpleContent>
+         <xsd:extension base="xsd:string">
+            <xsd:attribute name="nArgs" type="xsd:string" use="required"/>
+         </xsd:extension>
+      </xsd:simpleContent>
+   </xsd:complexType>
+   <xsd:complexType name="Id_CapabilitiesType">
+      <xsd:choice maxOccurs="unbounded">
+         <xsd:element ref="ogc:EID"/>
+         <xsd:element ref="ogc:FID"/>
+      </xsd:choice>
+   </xsd:complexType>
+   <xsd:element name="EID">
+      <xsd:complexType/>
+   </xsd:element>
+   <xsd:element name="FID">
+      <xsd:complexType/>
+   </xsd:element>
+</xsd:schema>
diff --git a/pycsw/schemas/ogc/filter/1.1.0/sort.xsd b/pycsw/schemas/ogc/filter/1.1.0/sort.xsd
new file mode 100644
index 0000000..0890182
--- /dev/null
+++ b/pycsw/schemas/ogc/filter/1.1.0/sort.xsd
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema
+   targetNamespace="http://www.opengis.net/ogc"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+   elementFormDefault="qualified"
+   version="1.1.2">
+   <!-- 
+      filter is an OGC Standard.
+      Copyright (c) 2002,2003,2004,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+      To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      
+      Updated: 2010-01-22
+   -->
+   <xsd:include schemaLocation="expr.xsd"/>
+
+   <!-- ============================================= -->
+   <!-- SORTBY EXPRESSION                             -->
+   <!-- ============================================= -->
+   <xsd:element name="SortBy" type="ogc:SortByType"/>
+
+   <!-- ============================================= -->
+   <!-- COMPLEX TYPES                                 -->
+   <!-- ============================================= -->
+   <xsd:complexType name="SortByType">
+      <xsd:sequence>
+         <xsd:element name="SortProperty"
+                      type="ogc:SortPropertyType"
+                      maxOccurs="unbounded"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:complexType name="SortPropertyType">
+      <xsd:sequence>
+         <xsd:element ref="ogc:PropertyName"/>
+         <xsd:element name="SortOrder"
+                      type="ogc:SortOrderType"
+                      minOccurs="0"/>
+      </xsd:sequence>
+   </xsd:complexType>
+   <xsd:simpleType name="SortOrderType">
+      <xsd:restriction base="xsd:string">
+         <xsd:enumeration value="DESC"/>
+         <xsd:enumeration value="ASC"/>
+      </xsd:restriction>
+   </xsd:simpleType>
+</xsd:schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/basicTypes.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/basicTypes.xsd
new file mode 100644
index 0000000..9b295ff
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/basicTypes.xsd
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+  <annotation>
+    <appinfo source="urn:opengis:specification:gml:schema-xsd:basicTypes:3.1.1">basicTypes.xsd</appinfo>
+    <documentation>
+    Generic simpleContent components for use in GML
+    
+    GML is an OGC Standard.
+    Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+    </documentation>
+  </annotation>
+  <!-- =========================================================== -->
+  <simpleType name="NullEnumeration">
+    <annotation>
+      <documentation> Some common reasons for a null value:   
+			
+        innapplicable - the object does not have a value
+        missing - The correct value is not readily available to the sender of this data.  
+                           Furthermore, a correct value may not exist.
+        template - the value will be available later
+        unknown - The correct value is not known to, and not computable by, the sender of this data. 
+                           However, a correct value probably exists.
+        withheld - the value is not divulged 
+        
+        other:reason - as indicated by "reason" string
+        
+        Specific communities may agree to assign more strict semantics when these terms are used in a particular context.  
+      </documentation>
+    </annotation>
+    <union>
+      <simpleType>
+        <restriction base="string">
+          <enumeration value="inapplicable"/>
+          <enumeration value="missing"/>
+          <enumeration value="template"/>
+          <enumeration value="unknown"/>
+          <enumeration value="withheld"/>
+        </restriction>
+      </simpleType>
+      <simpleType>
+        <restriction base="string">
+          <pattern value="other:\w{2,}"/>
+        </restriction>
+      </simpleType>
+    </union>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="NullType">
+    <annotation>
+      <documentation>Utility type for null elements.  The value may be selected from one of the enumerated tokens, or may be a URI in which case this should identify a resource which describes the reason for the null. </documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <element name="Null" type="gml:NullType"/>
+  <!-- ===================================================== -->
+  <simpleType name="SignType">
+    <annotation>
+      <documentation>Utility type used in various places 
+      - e.g. to indicate the direction of topological objects;
+      "+" for forwards, or "-" for backwards.</documentation>
+    </annotation>
+    <restriction base="string">
+      <enumeration value="-"/>
+      <enumeration value="+"/>
+    </restriction>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="booleanOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema boolean type and the GML Nulltype.  An element which uses this type may have content which is either a boolean {0,1,true,false} or a value from Nulltype</documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration boolean anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="booleanOrNullList">
+    <annotation>
+      <documentation>XML List based on the union type defined above.  An element declared with this type contains a space-separated list of boolean values {0,1,true,false} with null values interspersed as needed</documentation>
+    </annotation>
+    <list itemType="gml:booleanOrNull"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="booleanList">
+    <annotation>
+      <documentation>XML List based on XML Schema boolean type.  An element of this type contains a space-separated list of boolean values {0,1,true,false}</documentation>
+    </annotation>
+    <list itemType="boolean"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="stringOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema string type and the GML Nulltype.  An element which uses this type may have content which is either a string or a value from Nulltype.  Note that a "string" may contain whitespace.  </documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration string anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="NameOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema Name type and the GML Nulltype.  An element which uses this type may have content which is either a Name or a value from Nulltype.  Note that a "Name" may not contain whitespace.  </documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration Name anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="NameOrNullList">
+    <annotation>
+      <documentation>XML List based on the union type defined above.  An element declared with this type contains a space-separated list of Name values with null values interspersed as needed</documentation>
+    </annotation>
+    <list itemType="gml:NameOrNull"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="NameList">
+    <annotation>
+      <documentation>XML List based on XML Schema Name type.  An element of this type contains a space-separated list of Name values</documentation>
+    </annotation>
+    <list itemType="Name"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="doubleOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema double type and the GML Nulltype.  An element which uses this type may have content which is either a double or a value from Nulltype</documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration double anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="doubleOrNullList">
+    <annotation>
+      <documentation>XML List based on the union type defined above.  An element declared with this type contains a space-separated list of double values with null values interspersed as needed</documentation>
+    </annotation>
+    <list itemType="gml:doubleOrNull"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="doubleList">
+    <annotation>
+      <documentation>XML List based on XML Schema double type.  An element of this type contains a space-separated list of double values</documentation>
+    </annotation>
+    <list itemType="double"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="integerOrNull">
+    <annotation>
+      <documentation>Union of the XML Schema integer type and the GML Nulltype.  An element which uses this type may have content which is either an integer or a value from Nulltype</documentation>
+    </annotation>
+    <union memberTypes="gml:NullEnumeration integer anyURI"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="integerOrNullList">
+    <annotation>
+      <documentation>XML List based on the union type defined above.  An element declared with this type contains a space-separated list of integer values with null values interspersed as needed</documentation>
+    </annotation>
+    <list itemType="gml:integerOrNull"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <simpleType name="integerList">
+    <annotation>
+      <documentation>XML List based on XML Schema integer type.  An element of this type contains a space-separated list of integer values</documentation>
+    </annotation>
+    <list itemType="integer"/>
+  </simpleType>
+  <!-- =========================================================== -->
+  <complexType name="CodeType">
+    <annotation>
+      <documentation>Name or code with an (optional) authority.  Text token.  
+      If the codeSpace attribute is present, then its value should identify a dictionary, thesaurus 
+      or authority for the term, such as the organisation who assigned the value, 
+      or the dictionary from which it is taken.  
+      A text string with an optional codeSpace attribute. </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="string">
+        <attribute name="codeSpace" type="anyURI" use="optional"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="CodeListType">
+    <annotation>
+      <documentation>List of values on a uniform nominal scale.  List of text tokens.   
+      In a list context a token should not include any spaces, so xsd:Name is used instead of xsd:string.   
+      If a codeSpace attribute is present, then its value is a reference to 
+      a Reference System for the value, a dictionary or code list.</documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="gml:NameList">
+        <attribute name="codeSpace" type="anyURI" use="optional"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="CodeOrNullListType">
+    <annotation>
+      <documentation>List of values on a uniform nominal scale.  List of text tokens.   
+      In a list context a token should not include any spaces, so xsd:Name is used instead of xsd:string.  
+      A member of the list may be a typed null.  
+      If a codeSpace attribute is present, then its value is a reference to 
+      a Reference System for the value, a dictionary or code list.</documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="gml:NameOrNullList">
+        <attribute name="codeSpace" type="anyURI" use="optional"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="MeasureType">
+    <annotation>
+      <documentation>Number with a scale.  
+      The value of uom (Units Of Measure) attribute is a reference to a Reference System for the amount, either a ratio or position scale. </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="double">
+        <attribute name="uom" type="anyURI" use="required"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="MeasureListType">
+    <annotation>
+      <documentation>List of numbers with a uniform scale.  
+      The value of uom (Units Of Measure) attribute is a reference to 
+      a Reference System for the amount, either a ratio or position scale. </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="gml:doubleList">
+        <attribute name="uom" type="anyURI" use="required"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="MeasureOrNullListType">
+    <annotation>
+      <documentation>List of numbers with a uniform scale.  
+      A member of the list may be a typed null. 
+      The value of uom (Units Of Measure) attribute is a reference to 
+      a Reference System for the amount, either a ratio or position scale. </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="gml:doubleOrNullList">
+        <attribute name="uom" type="anyURI" use="required"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <complexType name="CoordinatesType">
+    <annotation>
+      <documentation>Tables or arrays of tuples.  
+        May be used for text-encoding of values from a table.  
+        Actually just a string, but allows the user to indicate which characters are used as separators.  
+        The value of the 'cs' attribute is the separator for coordinate values, 
+        and the value of the 'ts' attribute gives the tuple separator (a single space by default); 
+        the default values may be changed to reflect local usage.
+        Defaults to CSV within a tuple, space between tuples.  
+        However, any string content will be schema-valid.  </documentation>
+    </annotation>
+    <simpleContent>
+      <extension base="string">
+        <attribute name="decimal" type="string" default="."/>
+        <attribute name="cs" type="string" default=","/>
+        <attribute name="ts" type="string" default="&#x20;"/>
+      </extension>
+    </simpleContent>
+  </complexType>
+  <!-- =========================================================== -->
+  <simpleType name="NCNameList">
+    <annotation>
+      <documentation>A set of values, representing a list of token with the lexical value space of NCName. The tokens are seperated by whitespace.</documentation>
+    </annotation>
+    <list itemType="NCName"/>
+  </simpleType>
+  <!-- ============================================================== -->
+  <simpleType name="QNameList">
+    <annotation>
+      <documentation>A set of values, representing a list of token with the lexical value space of QName. The tokens are seperated by whitespace.</documentation>
+    </annotation>
+    <list itemType="QName"/>
+  </simpleType>
+  <!-- ============================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/coordinateOperations.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/coordinateOperations.xsd
new file mode 100644
index 0000000..7634c1d
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/coordinateOperations.xsd
@@ -0,0 +1,789 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1 2010-01-28" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:coordinateOperations:3.1.1"/>
+		<documentation>How to encode coordinate operation definitions. Builds on referenceSystems.xsd to encode the data needed to define coordinate operations, including Transformations, Conversions, and other specific subtypes of operations. 
+		
+		This schema encodes the Coordinate Operation (CC_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="referenceSystems.xsd"/>
+	<include schemaLocation="dataQuality.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_CoordinateOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractCoordinateOperationBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for coordinate operation objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:coordinateOperationName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="coordinateOperationName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this coordinate operation is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="AbstractCoordinateOperationType" abstract="true">
+		<annotation>
+			<documentation>A mathematical operation on coordinates that transforms or converts coordinates to another coordinate reference system. Many but not all coordinate operations (from CRS A to CRS B) also uniquely define the inverse operation (from CRS B to CRS A). In some cases, the operation method algorithm for the inverse operation is the same as for the forward algorithm, but the signs of some operation parameter values must be reversed. In other cases, different algorithms are requi [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationBaseType">
+				<sequence>
+					<element ref="gml:coordinateOperationID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this coordinate operation. The first coordinateOperationID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this coordinate operation, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:operationVersion" minOccurs="0"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+					<element ref="gml:_positionalAccuracy" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered set of estimates of the impact of this coordinate operation on point position accuracy. Gives position error estimates for target coordinates of this coordinate operation, assuming no errors in source coordinates. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:sourceCRS" minOccurs="0"/>
+					<element ref="gml:targetCRS" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="coordinateOperationID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationVersion" type="string">
+		<annotation>
+			<documentation>Version of the coordinate transformation (i.e., instantiation due to the stochastic nature of the parameters). Mandatory when describing a transformation, and should not be supplied for a conversion. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="sourceCRS" type="gml:CRSRefType">
+		<annotation>
+			<documentation>Association to the source CRS (coordinate reference system) of this coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="targetCRS" type="gml:CRSRefType">
+		<annotation>
+			<documentation>Association to the target CRS (coordinate reference system) of this coordinate operation. For constraints on multiplicity of "sourceCRS" and "targetCRS", see UML model of Coordinate Operation package in OGC Abstract Specification topic 2. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="coordinateOperationRef" type="gml:CoordinateOperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateOperationRefType">
+		<annotation>
+			<documentation>Association to a coordinate operation, either referencing or containing the definition of that coordinate operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_CoordinateOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ConcatenatedOperation" type="gml:ConcatenatedOperationType" substitutionGroup="gml:_CoordinateOperation"/>
+	<!-- =================================================== -->
+	<complexType name="ConcatenatedOperationType">
+		<annotation>
+			<documentation>An ordered sequence of two or more single coordinate operations. The sequence of operations is constrained by the requirement that the source coordinate reference system of step (n+1) must be the same as the target coordinate reference system of step (n). The source coordinate reference system of the first step and the target coordinate reference system of the last step are the source and target coordinate reference system associated with the concatenated operation. Ins [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:usesSingleOperation" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of associations to the two or more single operations used by this concatenated operation. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesSingleOperation" type="gml:SingleOperationRefType">
+		<annotation>
+			<documentation>Association to a single operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="concatenatedOperationRef" type="gml:ConcatenatedOperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ConcatenatedOperationRefType">
+		<annotation>
+			<documentation>Association to a concatenated operation, either referencing or containing the definition of that concatenated operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ConcatenatedOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_SingleOperation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:_CoordinateOperation">
+		<annotation>
+			<documentation>A single (not concatenated) coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="singleOperationRef" type="gml:SingleOperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="SingleOperationRefType">
+		<annotation>
+			<documentation>Association to a single operation, either referencing or containing the definition of that single operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_SingleOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="PassThroughOperation" type="gml:PassThroughOperationType" substitutionGroup="gml:_SingleOperation"/>
+	<!-- =================================================== -->
+	<complexType name="PassThroughOperationType">
+		<annotation>
+			<documentation>A pass-through operation specifies that a subset of a coordinate tuple is subject to a specific coordinate operation. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:modifiedCoordinate" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of positive integers defining the positions in a coordinate tuple of the coordinates affected by this pass-through operation. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:usesOperation"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="modifiedCoordinate" type="positiveInteger">
+		<annotation>
+			<documentation>A positive integer defining a position in a coordinate tuple. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesOperation" type="gml:OperationRefType">
+		<annotation>
+			<documentation>Association to the operation applied to the specified ordinates. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="passThroughOperationRef" type="gml:PassThroughOperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="PassThroughOperationRefType">
+		<annotation>
+			<documentation>Association to a pass through operation, either referencing or containing the definition of that pass through operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PassThroughOperation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_Operation" type="gml:AbstractCoordinateOperationType" abstract="true" substitutionGroup="gml:_SingleOperation">
+		<annotation>
+			<documentation>A parameterized mathematical operation on coordinates that transforms or converts coordinates to another coordinate reference system. This coordinate operation uses an operation method, usually with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type.
+
+This abstract complexType shall not be directly used, extended, or restricted in a compliant Application Schema. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationRef" type="gml:OperationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="OperationRefType">
+		<annotation>
+			<documentation>Association to an abstract operation, either referencing or containing the definition of that operation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Operation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="_GeneralConversion" type="gml:AbstractGeneralConversionType" abstract="true" substitutionGroup="gml:_Operation"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralConversionType" abstract="true">
+		<annotation>
+			<documentation>An abstract operation on coordinates that does not include any change of datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters.
+
+This abstract complexType is expected to be extended for well-known operation methods with many Conversion instances, in Application Schemas that define operation-method-specialized element names and contents. This conversion uses an operation method, usually with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to inclu [...]
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:coordinateOperationName"/>
+					<element ref="gml:coordinateOperationID" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+					<element ref="gml:_positionalAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="generalConversionRef" type="gml:GeneralConversionRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeneralConversionRefType">
+		<annotation>
+			<documentation>Association to a general conversion, either referencing or containing the definition of that conversion. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeneralConversion"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="Conversion" type="gml:ConversionType" substitutionGroup="gml:_GeneralConversion"/>
+	<!-- =================================================== -->
+	<complexType name="ConversionType">
+		<annotation>
+			<documentation>A concrete operation on coordinates that does not include any change of Datum. The best-known example of a coordinate conversion is a map projection. The parameters describing coordinate conversions are defined rather than empirically derived. Note that some conversions have no parameters.
+
+This concrete complexType can be used with all operation methods, without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Conversion instance. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralConversionType">
+				<sequence>
+					<element ref="gml:usesMethod"/>
+					<element ref="gml:usesValue" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of composition associations to the set of parameter values used by this conversion operation. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesMethod" type="gml:OperationMethodRefType">
+		<annotation>
+			<documentation>Association to the operation method used by this coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesValue" type="gml:ParameterValueType">
+		<annotation>
+			<documentation>Composition association to a parameter value used by this coordinate operation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="conversionRef" type="gml:ConversionRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ConversionRefType">
+		<annotation>
+			<documentation>Association to a concrete general-purpose conversion, either referencing or containing the definition of that conversion. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Conversion"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_GeneralTransformation" type="gml:AbstractGeneralTransformationType" abstract="true" substitutionGroup="gml:_Operation"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralTransformationType" abstract="true">
+		<annotation>
+			<documentation>An abstract operation on coordinates that usually includes a change of Datum. The parameters of a coordinate transformation are empirically derived from data containing the coordinates of a series of points in both coordinate reference systems. This computational process is usually "over-determined", allowing derivation of error (or accuracy) estimates for the transformation. Also, the stochastic nature of the parameters may result in multiple (different) versions of th [...]
+
+This abstract complexType is expected to be extended for well-known operation methods with many Transformation instances, in Application Schemas that define operation-method-specialized value element names and contents. This transformation uses an operation method with associated parameter values. However, operation methods and parameter values are directly associated with concrete subtypes, not with this abstract type. All concrete types derived from this type shall extend this type to  [...]
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractCoordinateOperationType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:coordinateOperationName"/>
+					<element ref="gml:coordinateOperationID" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:remarks" minOccurs="0"/>
+					<element ref="gml:operationVersion"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+					<element ref="gml:_positionalAccuracy" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:sourceCRS"/>
+					<element ref="gml:targetCRS"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="generalTransformationRef" type="gml:GeneralTransformationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeneralTransformationRefType">
+		<annotation>
+			<documentation>Association to a general transformation, either referencing or containing the definition of that transformation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeneralTransformation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="Transformation" type="gml:TransformationType" substitutionGroup="gml:_GeneralTransformation"/>
+	<!-- =================================================== -->
+	<complexType name="TransformationType">
+		<annotation>
+			<documentation>A concrete operation on coordinates that usually includes a change of datum. The parameters of a coordinate transformation are empirically derived from data containing the coordinates of a series of points in both coordinate reference systems. This computational process is usually "over-determined", allowing derivation of error (or accuracy) estimates for the transformation. Also, the stochastic nature of the parameters may result in multiple (different) versions of the [...]
+
+This concrete complexType can be used for all operation methods, without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one Transformation instance. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralTransformationType">
+				<sequence>
+					<element ref="gml:usesMethod"/>
+					<element ref="gml:usesValue" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered set of composition associations to the set of parameter values used by this transformation operation. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="transformationRef" type="gml:TransformationRefType"/>
+	<!-- =================================================== -->
+	<complexType name="TransformationRefType">
+		<annotation>
+			<documentation>Association to a transformation, either referencing or containing the definition of that transformation. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Transformation"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="_generalParameterValue" type="gml:AbstractGeneralParameterValueType" abstract="true"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralParameterValueType" abstract="true">
+		<annotation>
+			<documentation>Abstract parameter value or group of parameter values.
+			
+This abstract complexType is expected to be extended and restricted for well-known operation methods with many instances, in Application Schemas that define operation-method-specialized element names and contents. Specific parameter value elements are directly contained in concrete subtypes, not in this abstract type. All concrete types derived from this type shall extend this type to include one "...Value" element with an appropriate type, which should be one of the element types allowe [...]
+		</annotation>
+		<sequence/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="parameterValue" type="gml:ParameterValueType" substitutionGroup="gml:_generalParameterValue"/>
+	<!-- =================================================== -->
+	<complexType name="ParameterValueType">
+		<annotation>
+			<documentation>A parameter value, ordered sequence of values, or reference to a file of parameter values. This concrete complexType can be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only one instance. This complexType can be used, extended, or restricted for well-known operation methods, especially for methods with many instances. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralParameterValueType">
+				<sequence>
+					<choice>
+						<element ref="gml:value"/>
+						<element ref="gml:dmsAngleValue"/>
+						<element ref="gml:stringValue"/>
+						<element ref="gml:integerValue"/>
+						<element ref="gml:booleanValue"/>
+						<element ref="gml:valueList"/>
+						<element ref="gml:integerValueList"/>
+						<element ref="gml:valueFile"/>
+					</choice>
+					<element ref="gml:valueOfParameter"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="value" type="gml:MeasureType">
+		<annotation>
+			<documentation>Numeric value of an operation parameter, with its associated unit of measure. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="dmsAngleValue" type="gml:DMSAngleType">
+		<annotation>
+			<documentation>Value of an angle operation parameter, in either degree-minute-second format or single value format. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="stringValue" type="string">
+		<annotation>
+			<documentation>String value of an operation parameter. A string value does not have an associated unit of measure. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="integerValue" type="positiveInteger">
+		<annotation>
+			<documentation>Positive integer value of an operation parameter, usually used for a count. An integer value does not have an associated unit of measure. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="booleanValue" type="boolean">
+		<annotation>
+			<documentation>Boolean value of an operation parameter. A Boolean value does not have an associated unit of measure. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="valueList" type="gml:MeasureListType">
+		<annotation>
+			<documentation>Ordered sequence of two or more numeric values of an operation parameter list, where each value has the same associated unit of measure. An element of this type contains a space-separated sequence of double values. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="integerValueList" type="gml:integerList">
+		<annotation>
+			<documentation>Ordered sequence of two or more integer values of an operation parameter list, usually used for counts. These integer values do not have an associated unit of measure. An element of this type contains a space-separated sequence of integer values. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="valueFile" type="anyURI">
+		<annotation>
+			<documentation>Reference to a file or a part of a file containing one or more parameter values, each numeric value with its associated unit of measure. When referencing a part of a file, that file must contain multiple identified parts, such as an XML encoded document. Furthermore, the referenced file or part of a file can reference another part of the same or different files, as allowed in XML documents. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="valueOfParameter" type="gml:OperationParameterRefType">
+		<annotation>
+			<documentation>Association to the operation parameter that this is a value of. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="parameterValueGroup" type="gml:ParameterValueGroupType" substitutionGroup="gml:_generalParameterValue"/>
+	<!-- =================================================== -->
+	<complexType name="ParameterValueGroupType">
+		<annotation>
+			<documentation>A group of related parameter values. The same group can be repeated more than once in a Conversion, Transformation, or higher level parameterValueGroup, if those instances contain different values of one or more parameterValues which suitably distinquish among those groups. This concrete complexType can be used for operation methods without using an Application Schema that defines operation-method-specialized element names and contents, especially for methods with only  [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralParameterValueType">
+				<sequence>
+					<element ref="gml:includesValue" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered set of composition associations to the parameter values and groups of values included in this group. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:valuesOfGroup"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="includesValue" type="gml:AbstractGeneralParameterValueType" substitutionGroup="gml:_generalParameterValue">
+		<annotation>
+			<documentation>A composition association to a parameter value or group of values included in this group. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="valuesOfGroup" type="gml:OperationParameterGroupRefType">
+		<annotation>
+			<documentation>Association to the operation parameter group for which this element provides parameter values. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="OperationMethod" type="gml:OperationMethodType" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="OperationMethodBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for operation method objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:methodName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="methodName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this operation method is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="OperationMethodType">
+		<annotation>
+			<documentation>Definition of an algorithm used to perform a coordinate operation. Most operation methods use a number of operation parameters, although some coordinate conversions use none. Each coordinate operation using the method assigns values to these parameters. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:OperationMethodBaseType">
+				<sequence>
+					<element ref="gml:methodID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this operation method. The first methodID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this operation method, including source information.</documentation>
+						</annotation>
+					</element>
+					<element ref="gml:methodFormula"/>
+					<element ref="gml:sourceDimensions"/>
+					<element ref="gml:targetDimensions"/>
+					<element ref="gml:usesParameter" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of associations to the set of operation parameters and parameter groups used by this operation method. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="methodID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of an operation method. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="methodFormula" type="gml:CodeType">
+		<annotation>
+			<documentation>Formula(s) used by this operation method. The value may be a reference to a publication. Note that the operation method may not be analytic, in which case this element references or contains the procedure, not an analytic formula.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="sourceDimensions" type="positiveInteger">
+		<annotation>
+			<documentation>Number of dimensions in the source CRS of this operation method. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="targetDimensions" type="positiveInteger">
+		<annotation>
+			<documentation>Number of dimensions in the target CRS of this operation method. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesParameter" type="gml:AbstractGeneralOperationParameterRefType">
+		<annotation>
+			<documentation>Association to an operation parameter or parameter group used by this operation method. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationMethodRef" type="gml:OperationMethodRefType"/>
+	<!-- =================================================== -->
+	<complexType name="OperationMethodRefType">
+		<annotation>
+			<documentation>Association to a concrete general-purpose operation method, either referencing or containing the definition of that method. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationMethod"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="_GeneralOperationParameter" type="gml:AbstractGeneralOperationParameterType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralOperationParameterType" abstract="true">
+		<annotation>
+			<documentation>Abstract definition of a parameter or group of parameters used by an operation method. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:minimumOccurs" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="minimumOccurs" type="nonNegativeInteger">
+		<annotation>
+			<documentation>The minimum number of times that values for this parameter group or parameter are required. If this attribute is omitted, the minimum number is one. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="abstractGeneralOperationParameterRef" type="gml:AbstractGeneralOperationParameterRefType"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralOperationParameterRefType">
+		<annotation>
+			<documentation>Association to an operation parameter or group, either referencing or containing the definition of that parameter or group. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeneralOperationParameter"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="OperationParameter" type="gml:OperationParameterType" substitutionGroup="gml:_GeneralOperationParameter"/>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for operation parameter objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractGeneralOperationParameterType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:parameterName"/>
+					<element ref="gml:minimumOccurs" minOccurs="0"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="parameterName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this operation parameter is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterType">
+		<annotation>
+			<documentation>The definition of a parameter used by an operation method. Most parameter values are numeric, but other types of parameter values are possible. This complexType is expected to be used or extended for all operation methods, without defining operation-method-specialized element names.  </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:OperationParameterBaseType">
+				<sequence>
+					<element ref="gml:parameterID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this operation parameter. The first parameterID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this operation parameter, including source information. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="parameterID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of an operation parameter. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationParameterRef" type="gml:OperationParameterRefType"/>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterRefType">
+		<annotation>
+			<documentation>Association to an operation parameter, either referencing or containing the definition of that parameter. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationParameter"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="OperationParameterGroup" type="gml:OperationParameterGroupType" substitutionGroup="gml:_GeneralOperationParameter"/>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterGroupBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for operation parameter group objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractGeneralOperationParameterType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:groupName"/>
+					<element ref="gml:minimumOccurs" minOccurs="0"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="groupName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this operation parameter group is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterGroupType">
+		<annotation>
+			<documentation>The definition of a group of parameters used by an operation method. This complexType is expected to be used or extended for all applicable operation methods, without defining operation-method-specialized element names.  </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:OperationParameterGroupBaseType">
+				<sequence>
+					<element ref="gml:groupID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this operation parameter group. The first groupID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this operation parameter group, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:maximumOccurs" minOccurs="0"/>
+					<element ref="gml:includesParameter" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of associations to the set of operation parameters that are members of this group. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="groupID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of an operation parameter group. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="maximumOccurs" type="positiveInteger">
+		<annotation>
+			<documentation>The maximum number of times that values for this parameter group can be included. If this attribute is omitted, the maximum number is one. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="includesParameter" type="gml:AbstractGeneralOperationParameterRefType">
+		<annotation>
+			<documentation>Association to an operation parameter that is a member of a group. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="operationParameterGroupRef" type="gml:OperationParameterRefType"/>
+	<!-- =================================================== -->
+	<complexType name="OperationParameterGroupRefType">
+		<annotation>
+			<documentation>Association to an operation parameter, either referencing or containing the definition of that parameter. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:OperationParameterGroup"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/coordinateReferenceSystems.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/coordinateReferenceSystems.xsd
new file mode 100644
index 0000000..168c8b4
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/coordinateReferenceSystems.xsd
@@ -0,0 +1,429 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:coordinateReferenceSystems:3.1.1"/>
+		<documentation>How to encode coordinate reference system definitions. Builds on referenceSystems.xsd to encode the data needed to define coordinate reference systems, including the specific subtypes of coordinate reference systems. 
+		This schema encodes the Coordinate Reference System (SC_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates, with the exception of the abstract "SC_CRS" class. The "SC_CRS" class is encoded in referenceSystems.xsd, to eliminate the (circular) references from coordinateOperations.xsd to coordinateReferenceSystems.xsd. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111. 
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="coordinateSystems.xsd"/>
+	<include schemaLocation="datums.xsd"/>
+	<include schemaLocation="coordinateOperations.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_CoordinateReferenceSystem" type="gml:AbstractReferenceSystemType" abstract="true" substitutionGroup="gml:_CRS">
+		<annotation>
+			<documentation>A coordinate reference system consists of an ordered sequence of coordinate system axes that are related to the earth through a datum. A coordinate reference system is defined by one datum and by one coordinate system. Most coordinate reference system do not move relative to the earth, except for engineering coordinate reference systems defined on moving platforms such as cars, ships, aircraft, and spacecraft. For further information, see OGC Abstract Specification Topic 2.
+
+Coordinate reference systems are commonly divided into sub-types. The common classification criterion for sub-typing of coordinate reference systems is the way in which they deal with earth curvature. This has a direct effect on the portion of the earth's surface that can be covered by that type of CRS with an acceptable degree of error. The exception to the rule is the subtype "Temporal" which has been added by analogy. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="coordinateReferenceSystemRef" type="gml:CoordinateReferenceSystemRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateReferenceSystemRefType">
+		<annotation>
+			<documentation>Association to a coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_CoordinateReferenceSystem"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="CompoundCRS" type="gml:CompoundCRSType" substitutionGroup="gml:_CRS"/>
+	<!-- =================================================== -->
+	<complexType name="CompoundCRSType">
+		<annotation>
+			<documentation>A coordinate reference system describing the position of points through two or more independent coordinate reference systems. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:includesCRS" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of associations to all the component coordinate reference systems included in this compound coordinate reference system. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="includesCRS" type="gml:CoordinateReferenceSystemRefType">
+		<annotation>
+			<documentation>An association to a component coordinate reference system included in this compound coordinate reference system. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="compoundCRSRef" type="gml:CompoundCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CompoundCRSRefType">
+		<annotation>
+			<documentation>Association to a compound coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CompoundCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="GeographicCRS" type="gml:GeographicCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="GeographicCRSType">
+		<annotation>
+			<documentation>A coordinate reference system based on an ellipsoidal approximation of the geoid; this provides an accurate representation of the geometry of geographic features for a large portion of the earth's surface.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:usesEllipsoidalCS"/>
+					<element ref="gml:usesGeodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesEllipsoidalCS" type="gml:EllipsoidalCSRefType">
+		<annotation>
+			<documentation>Association to the ellipsoidal coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesGeodeticDatum" type="gml:GeodeticDatumRefType">
+		<annotation>
+			<documentation>Association to the geodetic datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="geographicCRSRef" type="gml:GeographicCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeographicCRSRefType">
+		<annotation>
+			<documentation>Association to a geographic coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeographicCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="VerticalCRS" type="gml:VerticalCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalCRSType">
+		<annotation>
+			<documentation>A 1D coordinate reference system used for recording heights or depths. Vertical CRSs make use of the direction of gravity to define the concept of height or depth, but the relationship with gravity may not be straightforward. By implication, ellipsoidal heights (h) cannot be captured in a vertical coordinate reference system. Ellipsoidal heights cannot exist independently, but only as an inseparable part of a 3D coordinate tuple defined in a geographic 3D coordinate ref [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:usesVerticalCS"/>
+					<element ref="gml:usesVerticalDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesVerticalCS" type="gml:VerticalCSRefType">
+		<annotation>
+			<documentation>Association to the vertical coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesVerticalDatum" type="gml:VerticalDatumRefType">
+		<annotation>
+			<documentation>Association to the vertical datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="verticalCRSRef" type="gml:VerticalCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalCRSRefType">
+		<annotation>
+			<documentation>Association to a vertical coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="GeocentricCRS" type="gml:GeocentricCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="GeocentricCRSType">
+		<annotation>
+			<documentation>A 3D coordinate reference system with the origin at the approximate centre of mass of the earth. A geocentric CRS deals with the earth's curvature by taking a 3D spatial view, which obviates the need to model the earth's curvature. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<choice>
+						<element ref="gml:usesCartesianCS"/>
+						<element ref="gml:usesSphericalCS"/>
+					</choice>
+					<element ref="gml:usesGeodeticDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesCartesianCS" type="gml:CartesianCSRefType">
+		<annotation>
+			<documentation>Association to the Cartesian coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesSphericalCS" type="gml:SphericalCSRefType">
+		<annotation>
+			<documentation>Association to the spherical coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="geocentricCRSRef" type="gml:GeocentricCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeocentricCRSRefType">
+		<annotation>
+			<documentation>Association to a geocentric coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeocentricCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_GeneralDerivedCRS" type="gml:AbstractGeneralDerivedCRSType" abstract="true" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractGeneralDerivedCRSType" abstract="true">
+		<annotation>
+			<documentation>A coordinate reference system that is defined by its coordinate conversion from another coordinate reference system (not by a datum). This abstract complexType shall not be used, extended, or restricted, in an Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:baseCRS"/>
+					<element ref="gml:definedByConversion"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="baseCRS" type="gml:CoordinateReferenceSystemRefType">
+		<annotation>
+			<documentation>Association to the coordinate reference system used by this derived CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="definedByConversion" type="gml:GeneralConversionRefType">
+		<annotation>
+			<documentation>Association to the coordinate conversion used to define this derived CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="ProjectedCRS" type="gml:ProjectedCRSType" substitutionGroup="gml:_GeneralDerivedCRS"/>
+	<!-- =================================================== -->
+	<complexType name="ProjectedCRSType">
+		<annotation>
+			<documentation>A 2D coordinate reference system used to approximate the shape of the earth on a planar surface, but in such a way that the distortion that is inherent to the approximation is carefully controlled and known. Distortion correction is commonly applied to calculated bearings and distances to produce values that are a close match to actual field values. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralDerivedCRSType">
+				<sequence>
+					<element ref="gml:usesCartesianCS"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="projectedCRSRef" type="gml:ProjectedCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ProjectedCRSRefType">
+		<annotation>
+			<documentation>Association to a projected coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ProjectedCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="DerivedCRS" type="gml:DerivedCRSType" substitutionGroup="gml:_GeneralDerivedCRS"/>
+	<!-- =================================================== -->
+	<complexType name="DerivedCRSType">
+		<annotation>
+			<documentation>A coordinate reference system that is defined by its coordinate conversion from another coordinate reference system but is not a projected coordinate reference system. This category includes coordinate reference systems derived from a projected coordinate reference system. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeneralDerivedCRSType">
+				<sequence>
+					<element ref="gml:derivedCRSType"/>
+					<element ref="gml:usesCS"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="derivedCRSType" type="gml:DerivedCRSTypeType"/>
+	<!-- =================================================== -->
+	<complexType name="DerivedCRSTypeType">
+		<annotation>
+			<documentation>Type of a derived coordinate reference system. </documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeType">
+				<attribute name="codeSpace" type="anyURI" use="required">
+					<annotation>
+						<documentation>Reference to a source of information specifying the values and meanings of all the allowed string values for this DerivedCRSTypeType. </documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesCS" type="gml:CoordinateSystemRefType">
+		<annotation>
+			<documentation>Association to the coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="derivedCRSRef" type="gml:DerivedCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="DerivedCRSRefType">
+		<annotation>
+			<documentation>Association to a non-projected derived coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:DerivedCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="EngineeringCRS" type="gml:EngineeringCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="EngineeringCRSType">
+		<annotation>
+			<documentation>A contextually local coordinate reference system; which can be divided into two broad categories:
+- earth-fixed systems applied to engineering activities on or near the surface of the earth;
+- CRSs on moving platforms such as road vehicles, vessels, aircraft, or spacecraft.
+For further information, see OGC Abstract Specification Topic 2. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:usesCS"/>
+					<element ref="gml:usesEngineeringDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesEngineeringDatum" type="gml:EngineeringDatumRefType">
+		<annotation>
+			<documentation>Association to the engineering datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="engineeringCRSRef" type="gml:EngineeringCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="EngineeringCRSRefType">
+		<annotation>
+			<documentation>Association to an engineering coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EngineeringCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ImageCRS" type="gml:ImageCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="ImageCRSType">
+		<annotation>
+			<documentation>An engineering coordinate reference system applied to locations in images. Image coordinate reference systems are treated as a separate sub-type because a separate user community exists for images with its own terms of reference. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<choice>
+						<element ref="gml:usesCartesianCS"/>
+						<element ref="gml:usesObliqueCartesianCS"/>
+					</choice>
+					<element ref="gml:usesImageDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesObliqueCartesianCS" type="gml:ObliqueCartesianCSRefType">
+		<annotation>
+			<documentation>Association to the oblique Cartesian coordinate system used by this CRS.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesImageDatum" type="gml:ImageDatumRefType">
+		<annotation>
+			<documentation>Association to the image datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="imageCRSRef" type="gml:ImageCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ImageCRSRefType">
+		<annotation>
+			<documentation>Association to an image coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ImageCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="TemporalCRS" type="gml:TemporalCRSType" substitutionGroup="gml:_CoordinateReferenceSystem"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalCRSType">
+		<annotation>
+			<documentation>A 1D coordinate reference system used for the recording of time. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemType">
+				<sequence>
+					<element ref="gml:usesTemporalCS"/>
+					<element ref="gml:usesTemporalDatum"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesTemporalCS" type="gml:TemporalCSRefType">
+		<annotation>
+			<documentation>Association to the temporal coordinate system used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesTemporalDatum" type="gml:TemporalDatumRefType">
+		<annotation>
+			<documentation>Association to the temporal datum used by this CRS. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="temporalCRSRef" type="gml:TemporalCRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalCRSRefType">
+		<annotation>
+			<documentation>Association to a temporal coordinate reference system, either referencing or containing the definition of that reference system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalCRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/coordinateSystems.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/coordinateSystems.xsd
new file mode 100644
index 0000000..45e5ed8
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/coordinateSystems.xsd
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1 2010-01-28" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:coordinateSystems:3.1.1"/>
+		<documentation>How to encode coordinate system definitions. Builds on referenceSystems.xsd to encode the data needed to define coordinate systems, including the specific subtypes of coordinate systems. 
+		This schema encodes the Coordinate System (CS_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="referenceSystems.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="CoordinateSystemAxis" type="gml:CoordinateSystemAxisType" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateSystemAxisBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for coordinate system axis objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:name">
+						<annotation>
+							<documentation>The name by which this coordinate system axis is identified. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<complexType name="CoordinateSystemAxisType">
+		<annotation>
+			<documentation>Definition of a coordinate system axis. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:CoordinateSystemAxisBaseType">
+				<sequence>
+					<element ref="gml:axisID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this coordinate system axis. The first axisID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this coordinate system axis, including data source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:axisAbbrev"/>
+					<element ref="gml:axisDirection"/>
+				</sequence>
+				<attribute ref="gml:uom" use="required"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="axisID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a coordinate system axis. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="axisAbbrev" type="gml:CodeType">
+		<annotation>
+			<documentation>The abbreviation used for this coordinate system axis. This abbreviation can be used to identify the ordinates in a coordinate tuple. Examples are X and Y. The codeSpace attribute can reference a source of more information on a set of standardized abbreviations, or on this abbreviation. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="axisDirection" type="gml:CodeType">
+		<annotation>
+			<documentation>Direction of this coordinate system axis (or in the case of Cartesian projected coordinates, the direction of this coordinate system axis at the origin). Examples: north or south, east or west, up or down. Within any set of coordinate system axes, only one of each pair of terms can be used. For earth-fixed CRSs, this direction is often approximate and intended to provide a human interpretable meaning to the axis. When a geodetic datum is used, the precise directions of  [...]
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<attribute name="uom" type="anyURI">
+		<annotation>
+			<documentation>Identifier of the unit of measure used for this coordinate system axis. The value of this coordinate in a coordinate tuple shall be recorded using this unit of measure, whenever those coordinates use a coordinate reference system that uses a coordinate system that uses this axis.</documentation>
+		</annotation>
+	</attribute>
+	<!-- =================================================== -->
+	<element name="coordinateSystemAxisRef" type="gml:CoordinateSystemAxisRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateSystemAxisRefType">
+		<annotation>
+			<documentation>Association to a coordinate system axis, either referencing or containing the definition of that axis. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CoordinateSystemAxis"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="_CoordinateSystem" type="gml:AbstractCoordinateSystemType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractCoordinateSystemBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for coordinate system objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:csName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="csName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this coordinate system is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="AbstractCoordinateSystemType" abstract="true">
+		<annotation>
+			<documentation>A coordinate system (CS) is the set of coordinate system axes that spans a given coordinate space. A CS is derived from a set of (mathematical) rules for specifying how coordinates in a given space are to be assigned to points. The coordinate values in a coordinate tuple shall be recorded in the order in which the coordinate system axes associations are recorded, whenever those coordinates use a coordinate reference system that uses this coordinate system. This abstract [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemBaseType">
+				<sequence>
+					<element ref="gml:csID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this coordinate system. The first csID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this coordinate system, including data source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:usesAxis" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of associations to the coordinate system axes included in this coordinate system. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="csID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a coordinate system. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesAxis" type="gml:CoordinateSystemAxisRefType">
+		<annotation>
+			<documentation>Association to a coordinate system axis. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="coordinateSystemRef" type="gml:CoordinateSystemRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CoordinateSystemRefType">
+		<annotation>
+			<documentation>Association to a coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_CoordinateSystem"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="EllipsoidalCS" type="gml:EllipsoidalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidalCSType">
+		<annotation>
+			<documentation>A two- or three-dimensional coordinate system in which position is specified by geodetic latitude, geodetic longitude, and (in the three-dimensional case) ellipsoidal height. An EllipsoidalCS shall have two or three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ellipsoidalCSRef" type="gml:EllipsoidalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidalCSRefType">
+		<annotation>
+			<documentation>Association to an ellipsoidal coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EllipsoidalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="CartesianCS" type="gml:CartesianCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="CartesianCSType">
+		<annotation>
+			<documentation>A 1-, 2-, or 3-dimensional coordinate system. Gives the position of points relative to orthogonal straight axes in the 2- and 3-dimensional cases. In the 1-dimensional case, it contains a single straight coordinate axis. In the multi-dimensional case, all axes shall have the same length unit of measure. A CartesianCS shall have one, two, or three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="cartesianCSRef" type="gml:CartesianCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CartesianCSRefType">
+		<annotation>
+			<documentation>Association to a Cartesian coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CartesianCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="VerticalCS" type="gml:VerticalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalCSType">
+		<annotation>
+			<documentation>A one-dimensional coordinate system used to record the heights (or depths) of points. Such a coordinate system is usually dependent on the Earth's gravity field, perhaps loosely as when atmospheric pressure is the basis for the vertical coordinate system axis. A VerticalCS shall have one usesAxis association. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="verticalCSRef" type="gml:VerticalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalCSRefType">
+		<annotation>
+			<documentation>Association to a vertical coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="TemporalCS" type="gml:TemporalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalCSType">
+		<annotation>
+			<documentation>A one-dimensional coordinate system containing a single time axis, used to describe the temporal position of a point in the specified time units from a specified time origin. A TemporalCS shall have one usesAxis association. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="temporalCSRef" type="gml:TemporalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalCSRefType">
+		<annotation>
+			<documentation>Association to a temporal coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="LinearCS" type="gml:LinearCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="LinearCSType">
+		<annotation>
+			<documentation>A one-dimensional coordinate system that consists of the points that lie on the single axis described. The associated ordinate is the distance from the specified origin to the point along the axis. Example: usage of the line feature representing a road to describe points on or along that road. A LinearCS shall have one usesAxis association. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="linearCSRef" type="gml:LinearCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="LinearCSRefType">
+		<annotation>
+			<documentation>Association to a linear coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:LinearCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="UserDefinedCS" type="gml:UserDefinedCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="UserDefinedCSType">
+		<annotation>
+			<documentation>A two- or three-dimensional coordinate system that consists of any combination of coordinate axes not covered by any other coordinate system type. An example is a multilinear coordinate system which contains one coordinate axis that may have any 1-D shape which has no intersections with itself. This non-straight axis is supplemented by one or two straight axes to complete a 2 or 3 dimensional coordinate system. The non-straight axis is typically incrementally straight o [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="userDefinedCSRef" type="gml:UserDefinedCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="UserDefinedCSRefType">
+		<annotation>
+			<documentation>Association to a user-defined coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:UserDefinedCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="SphericalCS" type="gml:SphericalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="SphericalCSType">
+		<annotation>
+			<documentation>A three-dimensional coordinate system with one distance measured from the origin and two angular coordinates. Not to be confused with an ellipsoidal coordinate system based on an ellipsoid "degenerated" into a sphere. A SphericalCS shall have three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="sphericalCSRef" type="gml:SphericalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="SphericalCSRefType">
+		<annotation>
+			<documentation>Association to a spherical coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:SphericalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="PolarCS" type="gml:PolarCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="PolarCSType">
+		<annotation>
+			<documentation>A two-dimensional coordinate system in which position is specified by the distance from the origin and the angle between the line from the origin to a point and a reference direction. A PolarCS shall have two usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="polarCSRef" type="gml:PolarCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="PolarCSRefType">
+		<annotation>
+			<documentation>Association to a polar coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PolarCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="CylindricalCS" type="gml:CylindricalCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="CylindricalCSType">
+		<annotation>
+			<documentation>A three-dimensional coordinate system consisting of a polar coordinate system extended by a straight coordinate axis perpendicular to the plane spanned by the polar coordinate system. A CylindricalCS shall have three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="cylindricalCSRef" type="gml:CylindricalCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CylindricalCSRefType">
+		<annotation>
+			<documentation>Association to a cylindrical coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:CylindricalCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ObliqueCartesianCS" type="gml:ObliqueCartesianCSType" substitutionGroup="gml:_CoordinateSystem"/>
+	<!-- =================================================== -->
+	<complexType name="ObliqueCartesianCSType">
+		<annotation>
+			<documentation>A two- or three-dimensional coordinate system with straight axes that are not necessarily orthogonal. An ObliqueCartesianCS shall have two or three usesAxis associations. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoordinateSystemType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="obliqueCartesianCSRef" type="gml:ObliqueCartesianCSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ObliqueCartesianCSRefType">
+		<annotation>
+			<documentation>Association to an oblique-Cartesian coordinate system, either referencing or containing the definition of that coordinate system. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ObliqueCartesianCS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/coverage.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/coverage.xsd
new file mode 100644
index 0000000..48074ba
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/coverage.xsd
@@ -0,0 +1,451 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:coverage:3.1.1">coverage.xsd</appinfo>
+		<documentation xml:lang="en">GML Coverage schema.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="valueObjects.xsd"/>
+	<include schemaLocation="grids.xsd"/>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<!-- ==============================================================
+       global types and elements
+	============================================================== -->
+	<!-- ================= Abstract coverage definition ================== -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_Coverage" type="gml:AbstractCoverageType" abstract="true" substitutionGroup="gml:_Feature"/>
+	<!-- =========================================================== -->
+	<complexType name="AbstractCoverageType" abstract="true">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group for coverages. Note that a coverage is a GML feature.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:domainSet"/>
+					<element ref="gml:rangeSet"/>
+				</sequence>
+				<attribute name="dimension" type="positiveInteger" use="optional"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="_ContinuousCoverage" type="gml:AbstractContinuousCoverageType" abstract="true" substitutionGroup="gml:_Coverage"/>
+	<!-- =========================================================== -->
+	<complexType name="AbstractContinuousCoverageType" abstract="true">
+		<annotation>
+			<documentation>A continuous coverage as defined in ISO 19123 is a coverage that can return different values for the same feature attribute at different direct positions within a single spatiotemporal object in its spatiotemporal domain</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoverageType">
+				<sequence>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="_DiscreteCoverage" type="gml:AbstractDiscreteCoverageType" abstract="true" substitutionGroup="gml:_Coverage"/>
+	<!-- =========================================================== -->
+	<complexType name="AbstractDiscreteCoverageType" abstract="true">
+		<annotation>
+			<documentation>A discrete coverage consists of a domain set, range set and optionally a coverage function. The domain set consists of either geometry or temporal objects, finite in number. The range set is comprised of a finite number of attribute values each of which is associated to every direct position within any single spatiotemporal object in the domain. In other words, the range values are constant on each spatiotemporal object in the domain. This coverage function maps each el [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCoverageType">
+				<sequence>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="domainSet" type="gml:DomainSetType"/>
+	<!-- =========================================================== -->
+	<complexType name="DomainSetType">
+		<annotation>
+			<documentation>The spatiotemporal domain of a coverage.  
+  Typically 
+  * a geometry collection, 
+  * an implicit geometry (e.g. a grid), 
+  * an explicit or implicit collection of time instances or periods, or
+
+N.B. Temporal geometric complexes and temporal grids are not yet implemented in GML.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:_Geometry"/>
+				<element ref="gml:_TimeObject"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="rangeSet" type="gml:RangeSetType"/>
+	<!-- =========================================================== -->
+	<complexType name="RangeSetType">
+		<choice>
+			<element ref="gml:ValueArray" maxOccurs="unbounded">
+				<annotation>
+					<documentation>each member _Value holds a tuple or "row" from the equivalent table</documentation>
+				</annotation>
+			</element>
+			<group ref="gml:ScalarValueList" maxOccurs="unbounded">
+				<annotation>
+					<documentation>each list holds the complete set of one scalar component from the values - i.e. a "column" from the equivalent table</documentation>
+				</annotation>
+			</group>
+			<element ref="gml:DataBlock">
+				<annotation>
+					<documentation>Its tuple list holds the values as space-separated tuples each of which contains comma-separated components, and the tuple structure is specified using the rangeParameters property.</documentation>
+				</annotation>
+			</element>
+			<element ref="gml:File">
+				<annotation>
+					<documentation>a reference to an external source for the data, together with a description of how that external source is structured</documentation>
+				</annotation>
+			</element>
+		</choice>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="coverageFunction" type="gml:CoverageFunctionType"/>
+	<!-- =========================================================== -->
+	<complexType name="CoverageFunctionType">
+		<annotation>
+			<documentation>The function or rule which defines the map from members of the domainSet to the range.  
+      More functions will be added to this list</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:MappingRule"/>
+			<element ref="gml:GridFunction"/>
+		</choice>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- ============== Components for encoding the rangeSet ============= -->
+	<!-- =========================================================== -->
+	<element name="DataBlock" type="gml:DataBlockType"/>
+	<!-- =========================================================== -->
+	<complexType name="DataBlockType">
+		<sequence>
+			<element ref="gml:rangeParameters"/>
+			<choice>
+				<element ref="gml:tupleList"/>
+				<element ref="gml:doubleOrNullTupleList"/>
+			</choice>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="tupleList" type="gml:CoordinatesType"/>
+	<!-- =========================================================== -->
+	<element name="doubleOrNullTupleList" type="gml:doubleOrNullList"/>
+	<!-- =========================================================== -->
+	<element name="File" type="gml:FileType"/>
+	<!-- =========================================================== -->
+	<complexType name="FileType">
+		<sequence>
+			<element ref="gml:rangeParameters"/>
+			<element name="fileName" type="anyURI"/>
+			<element name="fileStructure" type="gml:FileValueModelType"/>
+			<element name="mimeType" type="anyURI" minOccurs="0"/>
+			<element name="compression" type="anyURI" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="FileValueModelType">
+		<annotation>
+			<documentation>List of codes that identifies the file structure model for records stored in files.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="Record Interleaved"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="rangeParameters" type="gml:RangeParametersType"/>
+	<!-- =========================================================== -->
+	<complexType name="RangeParametersType">
+		<annotation>
+			<documentation>Metadata about the rangeSet.  Definition of record structure.   
+      This is required if the rangeSet is encoded in a DataBlock.  
+      We use a gml:_Value with empty values as a map of the composite value structure.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<group ref="gml:ValueObject"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- ============= Components for coverageFunctions ================ -->
+	<!-- =========================================================== -->
+	<element name="MappingRule" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Description of a rule for associating members from the domainSet with members of the rangeSet.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="GridFunction" type="gml:GridFunctionType"/>
+	<!-- =========================================================== -->
+	<complexType name="GridFunctionType">
+		<annotation>
+			<documentation>Defines how values in the domain are mapped to the range set. The start point and the sequencing rule are specified here.</documentation>
+		</annotation>
+		<sequence>
+			<element name="sequenceRule" type="gml:SequenceRuleType" minOccurs="0">
+				<annotation>
+					<documentation>If absent, the implied value is "Linear".</documentation>
+				</annotation>
+			</element>
+			<element name="startPoint" type="gml:integerList" minOccurs="0">
+				<annotation>
+					<documentation>Index position of the first grid post, which must lie somwhere in the GridEnvelope.  If absent, the startPoint is equal to the value of gridEnvelope::low from the grid definition.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="IndexMap" type="gml:IndexMapType" substitutionGroup="gml:GridFunction"/>
+	<!-- =========================================================== -->
+	<complexType name="IndexMapType">
+		<annotation>
+			<documentation>Exends GridFunctionType with a lookUpTable.  This contains a list of indexes of members within the rangeSet corresponding with the members of the domainSet.  The domainSet is traversed in list order if it is enumerated explicitly, or in the order specified by a SequenceRule if the domain is an implicit set.    The length of the lookUpTable corresponds with the length of the subset of the domainSet for which the coverage is defined.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:GridFunctionType">
+				<sequence>
+					<element name="lookUpTable" type="gml:integerList"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="SequenceRuleType">
+		<simpleContent>
+			<extension base="gml:SequenceRuleNames">
+				<attribute name="order" type="gml:IncrementOrder" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="SequenceRuleNames">
+		<annotation>
+			<documentation>List of codes (adopted from ISO 19123 Annex C) that identifies the rule for traversing a grid to correspond with the sequence of members of the rangeSet.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="Linear"/>
+			<enumeration value="Boustrophedonic"/>
+			<enumeration value="Cantor-diagonal"/>
+			<enumeration value="Spiral"/>
+			<enumeration value="Morton"/>
+			<enumeration value="Hilbert"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="IncrementOrder">
+		<annotation>
+			<documentation>The enumeration value here indicates the incrementation order  to be used on the first 2 axes, i.e. "+x-y" means that the points on the first axis are to be traversed from lowest to highest and  the points on the second axis are to be traversed from highest to lowest. The points on all other axes (if any) beyond the first 2 are assumed to increment from lowest to highest.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="+x+y"/>
+			<enumeration value="+y+x"/>
+			<enumeration value="+x-y"/>
+			<enumeration value="-x-y"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<!-- == Specialised Coverage types - typed by the structure of the domain set == -->
+	<!-- =========================================================== -->
+	<element name="MultiPointCoverage" type="gml:MultiPointCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiPointCoverageType">
+		<annotation>
+			<documentation>A discrete coverage type whose domain is defined by a collection of point</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiPointDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiPointDomain" type="gml:MultiPointDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiPointDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiPoint"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiCurveCoverage" type="gml:MultiCurveCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiCurveCoverageType">
+		<annotation>
+			<documentation>A discrete coverage type whose domain is defined by a collection of curves.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiCurveDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiCurveDomain" type="gml:MultiCurveDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiCurveDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiCurve"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiSurfaceCoverage" type="gml:MultiSurfaceCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiSurfaceCoverageType">
+		<annotation>
+			<documentation>A discrete coverage type whose domain is defined by a collection of surface patches (includes polygons, triangles, rectangles, etc).</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiSurfaceDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiSurfaceDomain" type="gml:MultiSurfaceDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiSurfaceDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiSurface"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiSolidCoverage" type="gml:MultiSolidCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiSolidCoverageType">
+		<annotation>
+			<documentation>A discrete coverage type whose domain is defined by a collection of Solids.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:multiSolidDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiSolidDomain" type="gml:MultiSolidDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="MultiSolidDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:MultiSolid"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="GridCoverage" type="gml:GridCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="GridCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:gridDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="gridDomain" type="gml:GridDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="GridDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:Grid"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="RectifiedGridCoverage" type="gml:RectifiedGridCoverageType" substitutionGroup="gml:_DiscreteCoverage"/>
+	<!-- =========================================================== -->
+	<complexType name="RectifiedGridCoverageType">
+		<complexContent>
+			<restriction base="gml:AbstractDiscreteCoverageType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:rectifiedGridDomain"/>
+					<element ref="gml:rangeSet"/>
+					<element ref="gml:coverageFunction" minOccurs="0"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="rectifiedGridDomain" type="gml:RectifiedGridDomainType" substitutionGroup="gml:domainSet"/>
+	<!-- =========================================================== -->
+	<complexType name="RectifiedGridDomainType">
+		<complexContent>
+			<restriction base="gml:DomainSetType">
+				<sequence minOccurs="0">
+					<element ref="gml:RectifiedGrid"/>
+				</sequence>
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/dataQuality.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/dataQuality.xsd
new file mode 100644
index 0000000..f2cb5b5
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/dataQuality.xsd
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1 2010-01-28" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:dataQuality:3.1.1"/>
+		<documentation>How to encode positional data quality information. Builds on units.xsd to encode the data needed to describe the positional accuracy of coordinate operations. 
+		This schema encodes the Data Quality (DQ) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111. 
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="units.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_positionalAccuracy" type="gml:AbstractPositionalAccuracyType" abstract="true"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractPositionalAccuracyType" abstract="true">
+		<annotation>
+			<documentation>Position error estimate (or accuracy) data. </documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:measureDescription" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="measureDescription" type="gml:CodeType">
+		<annotation>
+			<documentation>A description of the position accuracy parameter(s) provided. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="absoluteExternalPositionalAccuracy" type="gml:AbsoluteExternalPositionalAccuracyType" substitutionGroup="gml:_positionalAccuracy"/>
+	<!-- =================================================== -->
+	<complexType name="AbsoluteExternalPositionalAccuracyType">
+		<annotation>
+			<documentation>Closeness of reported coordinate values to values accepted as or being true. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractPositionalAccuracyType">
+				<sequence>
+					<element ref="gml:result"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="relativeInternalPositionalAccuracy" type="gml:RelativeInternalPositionalAccuracyType" substitutionGroup="gml:_positionalAccuracy"/>
+	<!-- =================================================== -->
+	<complexType name="RelativeInternalPositionalAccuracyType">
+		<annotation>
+			<documentation>Closeness of the relative positions of two or more positions to their respective relative positions accepted as or being true. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractPositionalAccuracyType">
+				<sequence>
+					<element ref="gml:result"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="result" type="gml:MeasureType">
+		<annotation>
+			<documentation>A quantitative result defined by the evaluation procedure used, and identified by the measureDescription. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="covarianceMatrix" type="gml:CovarianceMatrixType" substitutionGroup="gml:_positionalAccuracy"/>
+	<!-- =================================================== -->
+	<complexType name="CovarianceMatrixType">
+		<annotation>
+			<documentation>Error estimate covariance matrix. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractPositionalAccuracyType">
+				<sequence>
+					<element ref="gml:unitOfMeasure" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Ordered sequence of units of measure, corresponding to the row and column index numbers of the covariance matrix, starting with row and column 1 and ending with row/column N. Each unit of measure is for the ordinate reflected in the relevant row and column of the covariance matrix. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:includesElement" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered set of elements in this covariance matrix. Because the covariance matrix is symmetrical, only the elements in the upper or lower diagonal part (including the main diagonal) of the matrix need to be specified. Any zero valued covariance elements can be omitted. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="includesElement" type="gml:CovarianceElementType"/>
+	<!-- =================================================== -->
+	<complexType name="CovarianceElementType">
+		<annotation>
+			<documentation>An element of a covariance matrix.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:rowIndex"/>
+			<element ref="gml:columnIndex"/>
+			<element ref="gml:covariance"/>
+		</sequence>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="rowIndex" type="positiveInteger">
+		<annotation>
+			<documentation>Row number of this covariance element value. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="columnIndex" type="positiveInteger">
+		<annotation>
+			<documentation>Column number of this covariance element value. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="covariance" type="double">
+		<annotation>
+			<documentation>Value of covariance matrix element. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/datums.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/datums.xsd
new file mode 100644
index 0000000..a145e1f
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/datums.xsd
@@ -0,0 +1,484 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1 2010-01-28" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:datums:3.1.1"/>
+		<documentation>How to encode datum definitions. Builds on referenceSystems.xsd to encode the data needed to define datums, including the specific subtypes of datums. 
+		This schema encodes the Datum (CD_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. 
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="referenceSystems.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_Datum" type="gml:AbstractDatumType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractDatumBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for datum objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:datumName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="datumName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this datum is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="AbstractDatumType" abstract="true">
+		<annotation>
+			<documentation>A datum specifies the relationship of a coordinate system to the earth, thus creating a coordinate reference system. A datum uses a parameter or set of parameters that determine the location of the origin of the coordinate reference system. Each datum subtype can be associated with only specific types of coordinate systems. This abstract complexType shall not be used, extended, or restricted, in an Application Schema, to define a concrete subtype with a meaning equivale [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumBaseType">
+				<sequence>
+					<element ref="gml:datumID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this datum. The first datumID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on this reference system, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:anchorPoint" minOccurs="0"/>
+					<element ref="gml:realizationEpoch" minOccurs="0"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="datumID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a datum. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="anchorPoint" type="gml:CodeType">
+		<annotation>
+			<documentation>Description, possibly including coordinates, of the point or points used to anchor the datum to the Earth. Also known as the "origin", especially for engineering and image datums. The codeSpace attribute can be used to reference a source of more detailed on this point or surface, or on a set of such descriptions. 
+- For a geodetic datum, this point is also known as the fundamental point, which is traditionally the point where the relationship between geoid and ellipsoid is defined. In some cases, the "fundamental point" may consist of a number of points. In those cases, the parameters defining the geoid/ellipsoid relationship have been averaged for these points, and the averages adopted as the datum definition.
+- For an engineering datum, the anchor point may be a physical point, or it may be a point with defined coordinates in another CRS. When appropriate, the coordinates of this anchor point can be referenced in another document, such as referencing a GML feature that references or includes a point position.
+- For an image datum, the anchor point is usually either the centre of the image or the corner of the image.
+- For a temporal datum, this attribute is not defined. Instead of the anchor point, a temporal datum carries a separate time origin of type DateTime. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="realizationEpoch" type="date">
+		<annotation>
+			<documentation>The time after which this datum definition is valid. This time may be precise (e.g. 1997.0 for IRTF97) or merely a year (e.g. 1983 for NAD83). In the latter case, the epoch usually refers to the year in which a major recalculation of the geodetic control network, underlying the datum, was executed or initiated. An old datum can remain valid after a new datum is defined. Alternatively, a datum may be superseded by a later datum, in which case the realization epoch for th [...]
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="datumRef" type="gml:DatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="DatumRefType">
+		<annotation>
+			<documentation>Association to a datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Datum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="EngineeringDatum" type="gml:EngineeringDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="EngineeringDatumType">
+		<annotation>
+			<documentation>An engineering datum defines the origin of an engineering coordinate reference system, and is used in a region around that origin. This origin can be fixed with respect to the earth (such as a defined point at a construction site), or be a defined point on a moving vehicle (such as on a ship or satellite). </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumType"/>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="engineeringDatumRef" type="gml:EngineeringDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="EngineeringDatumRefType">
+		<annotation>
+			<documentation>Association to an engineering datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:EngineeringDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ImageDatum" type="gml:ImageDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="ImageDatumType">
+		<annotation>
+			<documentation>An image datum defines the origin of an image coordinate reference system, and is used in a local context only. For more information, see OGC Abstract Specification Topic 2. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:pixelInCell"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="pixelInCell" type="gml:PixelInCellType"/>
+	<!-- =================================================== -->
+	<complexType name="PixelInCellType">
+		<annotation>
+			<documentation>Specification of the way an image grid is associated with the image data attributes. </documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeType">
+				<attribute name="codeSpace" type="anyURI" use="required">
+					<annotation>
+						<documentation>Reference to a source of information specifying the values and meanings of all the allowed string values for this PixelInCellType. </documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="imageDatumRef" type="gml:ImageDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ImageDatumRefType">
+		<annotation>
+			<documentation>Association to an image datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:ImageDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="VerticalDatum" type="gml:VerticalDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalDatumType">
+		<annotation>
+			<documentation>A textual description and/or a set of parameters identifying a particular reference level surface used as a zero-height surface, including its position with respect to the Earth for any of the height types recognized by this standard. There are several types of Vertical Datums, and each may place constraints on the Coordinate Axis with which it is combined to create a Vertical CRS. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:verticalDatumType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="verticalDatumType" type="gml:VerticalDatumTypeType"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalDatumTypeType">
+		<annotation>
+			<documentation>Type of a vertical datum. </documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeType">
+				<attribute name="codeSpace" type="anyURI" use="required">
+					<annotation>
+						<documentation>Reference to a source of information specifying the values and meanings of all the allowed string values for this VerticalDatumTypeType. </documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="verticalDatumRef" type="gml:VerticalDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="VerticalDatumRefType">
+		<annotation>
+			<documentation>Association to a vertical datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:VerticalDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="TemporalDatum" type="gml:TemporalDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalDatumBaseType" abstract="true">
+		<annotation>
+			<documentation>Partially defines the origin of a temporal coordinate reference system. This type restricts the AbstractDatumType to remove the "anchorPoint" and "realizationEpoch" elements. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:datumName"/>
+					<element ref="gml:datumID" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<complexType name="TemporalDatumType">
+		<annotation>
+			<documentation>Defines the origin of a temporal coordinate reference system. This type extends the TemporalDatumRestrictionType to add the "origin" element with the dateTime type. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:TemporalDatumBaseType">
+				<sequence>
+					<element ref="gml:origin"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="origin" type="dateTime">
+		<annotation>
+			<documentation>The date and time origin of this temporal datum. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="temporalDatumRef" type="gml:TemporalDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="TemporalDatumRefType">
+		<annotation>
+			<documentation>Association to a temporal datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TemporalDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="GeodeticDatum" type="gml:GeodeticDatumType" substitutionGroup="gml:_Datum"/>
+	<!-- =================================================== -->
+	<complexType name="GeodeticDatumType">
+		<annotation>
+			<documentation>A geodetic datum defines the precise location and orientation in 3-dimensional space of a defined ellipsoid (or sphere) that approximates the shape of the earth, or of a Cartesian coordinate system centered in this ellipsoid (or sphere). </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractDatumType">
+				<sequence>
+					<element ref="gml:usesPrimeMeridian"/>
+					<element ref="gml:usesEllipsoid"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="usesPrimeMeridian" type="gml:PrimeMeridianRefType">
+		<annotation>
+			<documentation>Association to the prime meridian used by this geodetic datum. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="usesEllipsoid" type="gml:EllipsoidRefType">
+		<annotation>
+			<documentation>Association to the ellipsoid used by this geodetic datum. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="geodeticDatumRef" type="gml:GeodeticDatumRefType"/>
+	<!-- =================================================== -->
+	<complexType name="GeodeticDatumRefType">
+		<annotation>
+			<documentation>Association to a geodetic datum, either referencing or containing the definition of that datum. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:GeodeticDatum"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<element name="PrimeMeridian" type="gml:PrimeMeridianType" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="PrimeMeridianBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for prime meridian objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:meridianName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="meridianName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this prime meridian is identified. The meridianName most common value is Greenwich, and that value shall be used when the greenwichLongitude value is zero. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="PrimeMeridianType">
+		<annotation>
+			<documentation>A prime meridian defines the origin from which longitude values are determined.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:PrimeMeridianBaseType">
+				<sequence>
+					<element ref="gml:meridianID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this prime meridian. The first meridianID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this prime meridian, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:greenwichLongitude"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="meridianID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a prime meridian. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="greenwichLongitude" type="gml:AngleChoiceType">
+		<annotation>
+			<documentation>Longitude of the prime meridian measured from the Greenwich meridian, positive eastward. The greenwichLongitude most common value is zero, and that value shall be used when the meridianName value is Greenwich. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="primeMeridianRef" type="gml:PrimeMeridianRefType"/>
+	<!-- =================================================== -->
+	<complexType name="PrimeMeridianRefType">
+		<annotation>
+			<documentation>Association to a prime meridian, either referencing or containing the definition of that meridian. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:PrimeMeridian"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="Ellipsoid" type="gml:EllipsoidType" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for ellipsoid objects, simplifying and restricting the DefinitionType as needed. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:ellipsoidName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ellipsoidName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this ellipsoid is identified. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidType">
+		<annotation>
+			<documentation>An ellipsoid is a geometric figure that can be used to describe the approximate shape of the earth. In mathematical terms, it is a surface formed by the rotation of an ellipse about its minor axis.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:EllipsoidBaseType">
+				<sequence>
+					<element ref="gml:ellipsoidID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alternative identifications of this ellipsoid. The first ellipsoidID, if any, is normally the primary identification code, and any others are aliases. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this ellipsoid, including source information. </documentation>
+						</annotation>
+					</element>
+					<element ref="gml:semiMajorAxis"/>
+					<element ref="gml:secondDefiningParameter"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="ellipsoidID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of an ellipsoid. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="semiMajorAxis" type="gml:MeasureType">
+		<annotation>
+			<documentation>Length of the semi-major axis of the ellipsoid, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a length, such as metres or feet. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="ellipsoidRef" type="gml:EllipsoidRefType"/>
+	<!-- =================================================== -->
+	<complexType name="EllipsoidRefType">
+		<annotation>
+			<documentation>Association to an ellipsoid, either referencing or containing the definition of that ellipsoid. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Ellipsoid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="secondDefiningParameter" type="gml:SecondDefiningParameterType"/>
+	<!-- =================================================== -->
+	<complexType name="SecondDefiningParameterType">
+		<annotation>
+			<documentation>Definition of the second parameter that defines the shape of an ellipsoid. An ellipsoid requires two defining parameters: semi-major axis and inverse flattening or semi-major axis and semi-minor axis. When the reference body is a sphere rather than an ellipsoid, only a single defining parameter is required, namely the radius of the sphere; in that case, the semi-major axis "degenerates" into the radius of the sphere.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:inverseFlattening"/>
+			<element ref="gml:semiMinorAxis"/>
+			<element ref="gml:isSphere"/>
+		</choice>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="inverseFlattening" type="gml:MeasureType">
+		<annotation>
+			<documentation>Inverse flattening value of the ellipsoid. Value is a scale factor (or ratio) that has no physical unit. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a scale factor, such as percent, permil, or parts-per-million. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="semiMinorAxis" type="gml:MeasureType">
+		<annotation>
+			<documentation>Length of the semi-minor axis of the ellipsoid. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a length, such as metres or feet. </documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="isSphere">
+		<annotation>
+			<documentation>The ellipsoid is degenerate and is actually a sphere. The sphere is completely defined by the semi-major axis, which is the radius of the sphere. </documentation>
+		</annotation>
+		<simpleType>
+			<restriction base="string">
+				<enumeration value="sphere"/>
+			</restriction>
+		</simpleType>
+	</element>
+	<!-- =================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/defaultStyle.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/defaultStyle.xsd
new file mode 100644
index 0000000..08ecd8f
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/defaultStyle.xsd
@@ -0,0 +1,454 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:smil20="http://www.w3.org/2001/SMIL20/" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-defaultStyle:v3.1.0">defaultStyle.xsd</appinfo>
+		<documentation>
+			Default Style schema for GML 3.1.1
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="measures.xsd"/>
+	<import namespace="http://www.w3.org/2001/SMIL20/" schemaLocation="http://schemas.opengis.net/gml/3.1.1/smil/smil20.xsd"/>
+	<!-- ==============================================================
+      the Style property
+	============================================================== -->
+	<element name="defaultStyle" type="gml:DefaultStylePropertyType">
+		<annotation>
+			<documentation>Top-level property. Used in application schemas to "attach" the styling information to GML data. The link between the data and the style should be established through this property only.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="DefaultStylePropertyType">
+		<annotation>
+			<documentation>[complexType of] Top-level property. Used in application schemas to "attach" the styling information to GML data. The link between the data and the style should be established through this property only.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Style" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+       the Style
+	============================================================== -->
+	<element name="_Style" type="gml:AbstractStyleType" abstract="true" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The value of the top-level property. It is an abstract element. Used as the head element of the substitution group for extensibility purposes.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractStyleType" abstract="true">
+		<annotation>
+			<documentation>[complexType of] The value of the top-level property. It is an abstract element. Used as the head element of the substitution group for extensibility purposes.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Style" type="gml:StyleType" substitutionGroup="gml:_Style">
+		<annotation>
+			<documentation>Predefined concrete value of the top-level property. Encapsulates all other styling information.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="StyleType">
+		<annotation>
+			<documentation>[complexType of] Predefined concrete value of the top-level property. Encapsulates all other styling information.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractStyleType">
+				<sequence>
+					<element ref="gml:featureStyle" maxOccurs="unbounded"/>
+					<element ref="gml:graphStyle" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+      Feature Style Property
+	============================================================== -->
+	<element name="featureStyle" type="gml:FeatureStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="FeatureStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:FeatureStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+      Feature Style
+	============================================================== -->
+	<element name="FeatureStyle" type="gml:FeatureStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for features.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="FeatureStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for features.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element name="featureConstraint" type="string" minOccurs="0"/>
+					<element ref="gml:geometryStyle" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:topologyStyle" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:labelStyle" minOccurs="0"/>
+				</sequence>
+				<attribute name="featureType" type="string" use="optional"/>
+				<attribute name="baseType" type="string" use="optional"/>
+				<attribute name="queryGrammar" type="gml:QueryGrammarEnumeration"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="QueryGrammarEnumeration">
+		<annotation>
+			<documentation>Used to specify the grammar of the feature query mechanism.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="xpath"/>
+			<enumeration value="xquery"/>
+			<enumeration value="other"/>
+		</restriction>
+	</simpleType>
+	<!-- ==============================================================
+       Base style descriptor type (for geometry, topology, label, graph)
+	============================================================== -->
+	<complexType name="BaseStyleDescriptorType">
+		<annotation>
+			<documentation>Base complex type for geometry, topology, label and graph styles.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element name="spatialResolution" type="gml:ScaleType" minOccurs="0"/>
+					<element name="styleVariation" type="gml:StyleVariationType" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="smil20:animate" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="smil20:animateMotion" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="smil20:animateColor" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="smil20:set" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+       Geometry Style Property
+	============================================================== -->
+	<element name="geometryStyle" type="gml:GeometryStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GeometryStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:GeometryStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+       Geometry Style
+	============================================================== -->
+	<element name="GeometryStyle" type="gml:GeometryStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for geometries of a feature.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GeometryStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for geometries of a feature.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:BaseStyleDescriptorType">
+				<sequence>
+					<choice>
+						<element ref="gml:symbol"/>
+						<element name="style" type="string">
+							<annotation>
+								<appinfo>deprecated</appinfo>
+								<documentation>Deprecated in GML version 3.1.0. Use symbol with inline content instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element ref="gml:labelStyle" minOccurs="0"/>
+				</sequence>
+				<attribute name="geometryProperty" type="string"/>
+				<attribute name="geometryType" type="string"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+       Topology Style Property
+	============================================================== -->
+	<element name="topologyStyle" type="gml:TopologyStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="TopologyStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:TopologyStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+       Topology Style
+	============================================================== -->
+	<element name="TopologyStyle" type="gml:TopologyStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for topologies of a feature. Describes individual topology elements styles.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="TopologyStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for topologies of a feature. Describes individual topology elements styles.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:BaseStyleDescriptorType">
+				<sequence>
+					<choice>
+						<element ref="gml:symbol"/>
+						<element name="style" type="string">
+							<annotation>
+								<appinfo>deprecated</appinfo>
+								<documentation>Deprecated in GML version 3.1.0. Use symbol with inline content instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element ref="gml:labelStyle" minOccurs="0"/>
+				</sequence>
+				<attribute name="topologyProperty" type="string"/>
+				<attribute name="topologyType" type="string"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+       Label Style Property
+	============================================================== -->
+	<element name="labelStyle" type="gml:LabelStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="LabelStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:LabelStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+       Label Style
+	============================================================== -->
+	<element name="LabelStyle" type="gml:LabelStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for labels of a feature, geometry or topology.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="LabelStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for labels of a feature, geometry or topology.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:BaseStyleDescriptorType">
+				<sequence>
+					<element name="style" type="string"/>
+					<element name="label" type="gml:LabelType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+      Graph Style Property
+	============================================================== -->
+	<element name="graphStyle" type="gml:GraphStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GraphStylePropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<sequence>
+			<element ref="gml:GraphStyle" minOccurs="0"/>
+		</sequence>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ==============================================================
+      Graph Style
+	============================================================== -->
+	<element name="GraphStyle" type="gml:GraphStyleType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The style descriptor for a graph consisting of a number of features. Describes graph-specific style attributes.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GraphStyleType">
+		<annotation>
+			<documentation>[complexType of] The style descriptor for a graph consisting of a number of features. Describes graph-specific style attributes.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:BaseStyleDescriptorType">
+				<sequence>
+					<element name="planar" type="boolean" minOccurs="0"/>
+					<element name="directed" type="boolean" minOccurs="0"/>
+					<element name="grid" type="boolean" minOccurs="0"/>
+					<element name="minDistance" type="double" minOccurs="0"/>
+					<element name="minAngle" type="double" minOccurs="0"/>
+					<element name="graphType" type="gml:GraphTypeType" minOccurs="0"/>
+					<element name="drawingType" type="gml:DrawingTypeType" minOccurs="0"/>
+					<element name="lineType" type="gml:LineTypeType" minOccurs="0"/>
+					<element name="aestheticCriteria" type="gml:AesheticCriteriaType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ==============================================================
+      Common elements
+	============================================================== -->
+	<element name="symbol" type="gml:SymbolType">
+		<annotation>
+			<documentation>The symbol property. Extends the gml:AssociationType to allow for remote referencing of symbols.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="SymbolType">
+		<annotation>
+			<documentation>[complexType of] The symbol property. Allows for remote referencing of symbols.</documentation>
+		</annotation>
+		<sequence>
+			<any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+		<attribute name="symbolType" type="gml:SymbolTypeEnumeration" use="required"/>
+		<attribute ref="gml:transform" use="optional"/>
+		<attribute name="about" type="anyURI" use="optional"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="SymbolTypeEnumeration">
+		<annotation>
+			<documentation>Used to specify the type of the symbol used.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="svg"/>
+			<enumeration value="xpath"/>
+			<enumeration value="other"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<complexType name="LabelType" mixed="true">
+		<annotation>
+			<documentation>Label is mixed -- composed of text and XPath expressions used to extract the useful information from the feature.</documentation>
+		</annotation>
+		<sequence>
+			<element name="LabelExpression" type="string" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+		<attribute ref="gml:transform" use="optional"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<attribute name="transform" type="string">
+		<annotation>
+			<documentation>Defines the geometric transformation of entities. There is no particular grammar defined for this value.</documentation>
+		</annotation>
+	</attribute>
+	<!-- =========================================================== -->
+	<complexType name="StyleVariationType">
+		<annotation>
+			<documentation>Used to vary individual graphic parameters and attributes of the style, symbol or text.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attribute name="styleProperty" type="string" use="required"/>
+				<attribute name="featurePropertyRange" type="string" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ==============================================================
+       Graph parameters types
+	============================================================== -->
+	<simpleType name="GraphTypeType">
+		<annotation>
+			<documentation>Graph-specific styling property.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="TREE"/>
+			<enumeration value="BICONNECTED"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="DrawingTypeType">
+		<annotation>
+			<documentation>Graph-specific styling property.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="POLYLINE"/>
+			<enumeration value="ORTHOGONAL"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="LineTypeType">
+		<annotation>
+			<documentation>Graph-specific styling property.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="STRAIGHT"/>
+			<enumeration value="BENT"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="AesheticCriteriaType">
+		<annotation>
+			<documentation>Graph-specific styling property.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="MIN_CROSSINGS"/>
+			<enumeration value="MIN_AREA"/>
+			<enumeration value="MIN_BENDS"/>
+			<enumeration value="MAX_BENDS"/>
+			<enumeration value="UNIFORM_BENDS"/>
+			<enumeration value="MIN_SLOPES"/>
+			<enumeration value="MIN_EDGE_LENGTH"/>
+			<enumeration value="MAX_EDGE_LENGTH"/>
+			<enumeration value="UNIFORM_EDGE_LENGTH"/>
+			<enumeration value="MAX_ANGULAR_RESOLUTION"/>
+			<enumeration value="MIN_ASPECT_RATIO"/>
+			<enumeration value="MAX_SYMMETRIES"/>
+		</restriction>
+	</simpleType>
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/dictionary.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/dictionary.xsd
new file mode 100644
index 0000000..1948672
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/dictionary.xsd
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:dictionary:3.1.1"/>
+		<documentation>
+			Dictionary schema for GML 3.1.1 
+			Components to support the lists of definitions.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ========================================================
+       includes and imports
+	======================================================== -->
+	<include schemaLocation="gmlBase.xsd"/>
+	<!-- ===================================================== -->
+	<!-- ===================================================== -->
+	<!-- === Dictionary and Definition components === -->
+	<!-- ===================================================== -->
+	<group name="StandardDefinitionProperties">
+		<annotation>
+			<documentation>This content model group makes it easier to construct types that 
+      derive from DefinitionType and its descendents "by restriction".  
+      A reference to the group saves having to enumerate the standard definition properties. 
+      See definition of StandardObjectProperties for more documentation</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+			<element ref="gml:description" minOccurs="0"/>
+			<element ref="gml:name" maxOccurs="unbounded"/>
+		</sequence>
+	</group>
+	<!-- ===================================================== -->
+	<element name="Definition" type="gml:DefinitionType" substitutionGroup="gml:_GML"/>
+	<!-- ===================================================== -->
+	<complexType name="DefinitionType">
+		<annotation>
+			<documentation>A definition, which can be included in or referenced by a dictionary. In this extended type, the inherited "description" optional element can hold the definition whenever only text is needed. The inherited "name" elements can provide one or more brief terms for which this is the definition. The inherited "metaDataProperty" elements can be used to reference or include more information about this definition.  
+The gml:id attribute is required - it must be possible to reference this definition using this handle.  </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:description" minOccurs="0"/>
+					<element ref="gml:name" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="Dictionary" type="gml:DictionaryType" substitutionGroup="gml:Definition"/>
+	<element name="DefinitionCollection" type="gml:DictionaryType" substitutionGroup="gml:Definition"/>
+	<!-- ===================================================== -->
+	<complexType name="DictionaryType">
+		<annotation>
+			<documentation>A non-abstract bag that is specialized for use as a dictionary which contains a set of definitions. These definitions are referenced from other places, in the same and different XML documents. In this restricted type, the inherited optional "description" element can be used for a description of this dictionary. The inherited optional "name" element can be used for the name(s) of this dictionary. The inherited "metaDataProperty" elements can be used to reference or conta [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence minOccurs="0" maxOccurs="unbounded">
+					<choice>
+						<element ref="gml:dictionaryEntry">
+							<annotation>
+								<documentation>An entry in this dictionary. The content of an entry can itself be a lower level dictionary or definition collection. This element follows the standard GML property model, so the value may be provided directly or by reference. Note that if the value is provided by reference, this definition does not carry a handle (gml:id) in this context, so does not allow external references to this specific entry in this context. When used in this way the referenced definition w [...]
+							</annotation>
+						</element>
+						<element ref="gml:indirectEntry">
+							<annotation>
+								<documentation>An identified reference to a remote entry in this dictionary, to be used when this entry should be identified to allow external references to this specific entry. </documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="dictionaryEntry" type="gml:DictionaryEntryType"/>
+	<element name="definitionMember" type="gml:DictionaryEntryType" substitutionGroup="gml:dictionaryEntry"/>
+	<!-- ===================================================== -->
+	<complexType name="DictionaryEntryType">
+		<annotation>
+			<documentation>An entry in a dictionary of definitions. An instance of this type contains or refers to a definition object.  
+
+The number of definitions contained in this dictionaryEntry is restricted to one, but a DefinitionCollection or Dictionary that contains multiple definitions can be substituted if needed. Specialized descendents of this dictionaryEntry might be restricted in an application schema to allow only including specified types of definitions as valid entries in a dictionary. </documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Definition">
+				<annotation>
+					<documentation>This element in a dictionary entry contains the actual definition. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>A non-identified reference to a remote entry in this dictionary, to be used when this entry need not be identified to allow external references to this specific entry. The remote entry referenced will usually be in a dictionary in the same XML document. This element will usually be used in dictionaries that are inside of another dictionary. </documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="indirectEntry" type="gml:IndirectEntryType"/>
+	<!-- ===================================================== -->
+	<complexType name="IndirectEntryType">
+		<annotation>
+			<documentation>An entry in a dictionary of definitions that contains a GML object which references a remote definition object. This entry is expected to be convenient in allowing multiple elements in one XML document to contain short (abbreviated XPointer) references, which are resolved to an external definition provided in a Dictionary element in the same XML document. Specialized descendents of this dictionaryEntry might be restricted in an application schema to allow only including [...]
+		</annotation>
+		<sequence>
+			<element ref="gml:DefinitionProxy"/>
+		</sequence>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="DefinitionProxy" type="gml:DefinitionProxyType" substitutionGroup="gml:Definition"/>
+	<!-- ===================================================== -->
+	<complexType name="DefinitionProxyType">
+		<annotation>
+			<documentation>A proxy entry in a dictionary of definitions. An element of this type contains a reference to a remote definition object. This entry is expected to be convenient in allowing multiple elements in one XML document to contain short (abbreviated XPointer) references, which are resolved to an external definition provided in a Dictionary element in the same XML document. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:definitionRef">
+						<annotation>
+							<documentation>A reference to a remote entry in this dictionary, used when this dictionary entry is identified to allow external references to this specific entry. The remote entry referenced can be in a dictionary in the same or different XML document. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===================================================== -->
+	<element name="definitionRef" type="gml:ReferenceType"/>
+	<!-- =========================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/direction.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/direction.xsd
new file mode 100644
index 0000000..dc60efb
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/direction.xsd
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified"
+        version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:direction:3.1.1">direction.xsd</appinfo>
+		<documentation>This schema defines "direction" element and type.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<!-- ============================================================== -->
+	<!--===================================================================  -->
+	<element name="direction" type="gml:DirectionPropertyType"/>
+	<!--===================================================================  -->
+	<complexType name="DirectionPropertyType">
+		<annotation>
+			<documentation/>
+		</annotation>
+		<choice>
+			<element ref="gml:DirectionVector"/>
+			<element ref="gml:CompassPoint"/>
+			<element name="DirectionKeyword" type="gml:CodeType"/>
+			<element name="DirectionString" type="gml:StringOrRefType"/>
+		</choice>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!--===================================================================  -->
+	<element name="DirectionVector" type="gml:DirectionVectorType"/>
+	<!--===================================================================  -->
+	<complexType name="DirectionVectorType">
+		<annotation>
+			<documentation>Direction expressed as a vector, either using components, or using angles.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:vector"/>
+			<sequence>
+				<element name="horizontalAngle" type="gml:AngleType"/>
+				<element name="verticalAngle" type="gml:AngleType"/>
+			</sequence>
+		</choice>
+	</complexType>
+	<!--===================================================================  -->
+	<element name="CompassPoint" type="gml:CompassPointEnumeration"/>
+	<!--===================================================================  -->
+	<simpleType name="CompassPointEnumeration">
+		<restriction base="string">
+			<enumeration value="N"/>
+			<enumeration value="NNE"/>
+			<enumeration value="NE"/>
+			<enumeration value="ENE"/>
+			<enumeration value="E"/>
+			<enumeration value="ESE"/>
+			<enumeration value="SE"/>
+			<enumeration value="SSE"/>
+			<enumeration value="S"/>
+			<enumeration value="SSW"/>
+			<enumeration value="SW"/>
+			<enumeration value="WSW"/>
+			<enumeration value="W"/>
+			<enumeration value="WNW"/>
+			<enumeration value="NW"/>
+			<enumeration value="NNW"/>
+		</restriction>
+	</simpleType>
+	<!--===================================================================  -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/dynamicFeature.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/dynamicFeature.xsd
new file mode 100644
index 0000000..47b05a5
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/dynamicFeature.xsd
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:dynamicFeature:3.1.1"/>
+		<documentation xml:lang="en">Basic support for tracking moving objects and objects with changing state.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ================================================================== -->
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="direction.xsd"/>
+	<!-- ================================================================== -->
+	<element name="dataSource" type="gml:StringOrRefType"/>
+	<element name="status" type="gml:StringOrRefType"/>
+	<!-- ================================================================== -->
+	<element name="_TimeSlice" type="gml:AbstractTimeSliceType" abstract="true" substitutionGroup="gml:_GML"/>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimeSliceType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">A timeslice encapsulates the time-varying properties of a dynamic feature--it 
+        must be extended to represent a timestamped projection of a feature. The dataSource 
+        property describes how the temporal data was acquired.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:validTime"/>
+					<element ref="gml:dataSource" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="MovingObjectStatus" type="gml:MovingObjectStatusType" substitutionGroup="gml:_TimeSlice"/>
+	<!-- ===================================== -->
+	<complexType name="MovingObjectStatusType">
+		<annotation>
+			<documentation xml:lang="en">This type encapsulates various dynamic properties of moving objects        
+             (points, lines, regions). It is useful for dealing with features whose        
+             geometry or topology changes over time.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeSliceType">
+				<sequence>
+					<element ref="gml:location"/>
+					<element name="speed" type="gml:MeasureType" minOccurs="0"/>
+					<element name="bearing" type="gml:DirectionPropertyType" minOccurs="0"/>
+					<element name="acceleration" type="gml:MeasureType" minOccurs="0"/>
+					<element name="elevation" type="gml:MeasureType" minOccurs="0"/>
+					<element ref="gml:status" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="history" type="gml:HistoryPropertyType"/>
+	<!-- ===================================== -->
+	<complexType name="HistoryPropertyType">
+		<annotation>
+			<documentation xml:lang="en">The history relationship associates a feature with a sequence of TimeSlice instances.</documentation>
+		</annotation>
+		<sequence maxOccurs="unbounded">
+			<element ref="gml:_TimeSlice"/>
+		</sequence>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="track" type="gml:TrackType" substitutionGroup="gml:history"/>
+	<!-- ===================================== -->
+	<complexType name="TrackType">
+		<annotation>
+			<documentation xml:lang="en">The track of a moving object is a sequence of specialized timeslices        that indicate the status of the object.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:HistoryPropertyType">
+				<sequence maxOccurs="unbounded">
+					<element ref="gml:MovingObjectStatus"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<group name="dynamicProperties">
+		<sequence>
+			<element ref="gml:validTime" minOccurs="0"/>
+			<element ref="gml:history" minOccurs="0"/>
+			<element ref="gml:dataSource" minOccurs="0"/>
+		</sequence>
+	</group>
+	<!-- ================================================================== -->
+	<complexType name="DynamicFeatureType">
+		<annotation>
+			<documentation>A dynamic feature may possess a history and/or a timestamp.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<group ref="gml:dynamicProperties"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===================================== -->
+	<complexType name="DynamicFeatureCollectionType">
+		<annotation>
+			<documentation>A dynamic feature collection may possess a history and/or a timestamp.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:FeatureCollectionType">
+				<group ref="gml:dynamicProperties"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/feature.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/feature.xsd
new file mode 100644
index 0000000..114f6e4
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/feature.xsd
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:feature:v3.1.1"/>
+		<documentation>GML Feature schema.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ============================================================== -->
+	<!-- ==================        includes and imports  ======================= -->
+	<!-- ============================================================== -->
+	<include schemaLocation="geometryBasic2d.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<!-- ============================================================== -->
+	<element name="_Feature" type="gml:AbstractFeatureType" abstract="true" substitutionGroup="gml:_GML"/>
+	<!-- =========================================================== -->
+	<complexType name="AbstractFeatureType" abstract="true">
+		<annotation>
+			<documentation>An abstract feature provides a set of common properties, including id, metaDataProperty, name and description inherited from AbstractGMLType, plus boundedBy.    A concrete feature type must derive from this type and specify additional  properties in an application schema. A feature must possess an identifying attribute ('id' - 'fid' has been deprecated).</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:boundedBy" minOccurs="0"/>
+					<element ref="gml:location" minOccurs="0">
+						<annotation>
+							<appinfo>deprecated</appinfo>
+							<documentation>deprecated in GML version 3.1</documentation>
+						</annotation>
+					</element>
+					<!-- additional properties must be specified in an application schema -->
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- =========================================================== -->
+	<element name="boundedBy" type="gml:BoundingShapeType"/>
+	<!-- ====================================================================== -->
+	<complexType name="BoundingShapeType">
+		<annotation>
+			<documentation>Bounding shape.</documentation>
+		</annotation>
+		<sequence>
+			<choice>
+				<element ref="gml:Envelope"/>
+				<element ref="gml:Null"/>
+			</choice>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="EnvelopeWithTimePeriod" type="gml:EnvelopeWithTimePeriodType" substitutionGroup="gml:Envelope"/>
+	<!-- ====================================================================== -->
+	<complexType name="EnvelopeWithTimePeriodType">
+		<annotation>
+			<documentation>Envelope that includes also a temporal extent.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:EnvelopeType">
+				<sequence>
+					<element ref="gml:timePosition" minOccurs="2" maxOccurs="2"/>
+				</sequence>
+				<attribute name="frame" type="anyURI" use="optional" default="#ISO-8601"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- ===== property for feature association ==== -->
+	<element name="featureMember" type="gml:FeaturePropertyType"/>
+	<element name="featureProperty" type="gml:FeaturePropertyType"/>
+	<!-- ============================================================== -->
+	<complexType name="FeaturePropertyType">
+		<annotation>
+			<documentation>Container for a feature - follow gml:AssociationType pattern.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Feature"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- ===== property for association of an array of features ===== -->
+	<element name="featureMembers" type="gml:FeatureArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="FeatureArrayPropertyType">
+		<annotation>
+			<documentation>Container for features - follow gml:ArrayAssociationType pattern.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Feature" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- =========================================================== -->
+	<element name="_FeatureCollection" type="gml:AbstractFeatureCollectionType" abstract="true" substitutionGroup="gml:_Feature"/>
+	<!-- ===========================================================   -->
+	<complexType name="AbstractFeatureCollectionType" abstract="true">
+		<annotation>
+			<documentation>A feature collection contains zero or more features.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:featureMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:featureMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="FeatureCollection" type="gml:FeatureCollectionType" substitutionGroup="gml:_Feature"/>
+	<!-- =========================================================== -->
+	<complexType name="FeatureCollectionType">
+		<annotation>
+			<documentation>Concrete generic feature collection.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractFeatureCollectionType"/>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- ============================================================== -->
+	<element name="LocationKeyWord" type="gml:CodeType"/>
+	<element name="LocationString" type="gml:StringOrRefType"/>
+	<!-- =========================================================== -->
+	<!-- ============= common aliases for geometry properties =============== -->
+	<element name="centerOf" type="gml:PointPropertyType"/>
+	<element name="position" type="gml:PointPropertyType"/>
+	<element name="edgeOf" type="gml:CurvePropertyType"/>
+	<element name="centerLineOf" type="gml:CurvePropertyType"/>
+	<element name="extentOf" type="gml:SurfacePropertyType"/>
+	<!-- =========================================================== -->
+	<!-- ================= deprecated components  =========================== -->
+	<complexType name="BoundedFeatureType" abstract="true">
+		<annotation>
+			<documentation>Makes boundedBy mandatory</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:AbstractFeatureType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:boundedBy"/>
+					<element ref="gml:location" minOccurs="0">
+						<annotation>
+							<appinfo>deprecated</appinfo>
+							<documentation>deprecated in GML version 3.1</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="location" type="gml:LocationPropertyType">
+		<annotation>
+			<documentation>Deprecated in GML 3.1.0</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="LocationPropertyType">
+		<annotation>
+			<documentation>Convenience property for generalised location.  
+      A representative location for plotting or analysis.  
+      Often augmented by one or more additional geometry properties with more specific semantics.</documentation>
+			<documentation>Deprecated in GML 3.1.0</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:_Geometry"/>
+				<element ref="gml:LocationKeyWord"/>
+				<element ref="gml:LocationString"/>
+				<element ref="gml:Null"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="priorityLocation" type="gml:PriorityLocationPropertyType" substitutionGroup="gml:location">
+		<annotation>
+			<documentation>Deprecated in GML 3.1.0</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="PriorityLocationPropertyType">
+		<annotation>
+			<documentation>G-XML component</documentation>
+			<documentation>Deprecated in GML 3.1.0</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:LocationPropertyType">
+				<attribute name="priority" type="string" use="optional"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/geometryAggregates.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/geometryAggregates.xsd
new file mode 100644
index 0000000..2078e2f
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/geometryAggregates.xsd
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified"
+        version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryAggregates:3.1.1">geometryAggregates.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="geometryPrimitives.xsd"/>
+	<!-- =========================================================== -->
+	<!-- aggregate geometry objects -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_GeometricAggregate" type="gml:AbstractGeometricAggregateType" abstract="true" substitutionGroup="gml:_Geometry">
+		<annotation>
+			<documentation>The "_GeometricAggregate" element is the abstract head of the substituition group for all geometric aggremates.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractGeometricAggregateType" abstract="true">
+		<annotation>
+			<documentation>This is the abstract root type of the geometric aggregates.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiGeometry" type="gml:MultiGeometryType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiGeometryType">
+		<annotation>
+			<documentation>A geometry collection must include one or more geometries, referenced through geometryMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:geometryMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:geometryMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiGeometryProperty" type="gml:MultiGeometryPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiGeometryProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a geometric aggregate via the XLink-attributes or contains the "multi geometry" element. multiGeometryProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for _GeometricAggregate.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiGeometryPropertyType">
+		<annotation>
+			<documentation>A property that has a geometric aggregate as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeometricAggregate"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiPoint" type="gml:MultiPointType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiPointType">
+		<annotation>
+			<documentation>A MultiPoint is defined by one or more Points, referenced through pointMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:pointMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:pointMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiPointProperty" type="gml:MultiPointPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiPointProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a point aggregate via the XLink-attributes or contains the "multi point" element. multiPointProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for MultiPoint.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiPointPropertyType">
+		<annotation>
+			<documentation>A property that has a collection of points as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiPoint"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiCurve" type="gml:MultiCurveType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiCurveType">
+		<annotation>
+			<documentation>A MultiCurve is defined by one or more Curves, referenced through curveMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:curveMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:curveMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiCurveProperty" type="gml:MultiCurvePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiCurveProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a curve aggregate via the XLink-attributes or contains the "multi curve" element. multiCurveProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for MultiCurve.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiCurvePropertyType">
+		<annotation>
+			<documentation>A property that has a collection of curves as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="MultiSurface" type="gml:MultiSurfaceType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiSurfaceType">
+		<annotation>
+			<documentation>A MultiSurface is defined by one or more Surfaces, referenced through surfaceMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:surfaceMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:surfaceMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiSurfaceProperty" type="gml:MultiSurfacePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiSurfaceProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a surface aggregate via the XLink-attributes or contains the "multi surface" element. multiSurfaceProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for MultiSurface.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiSurfacePropertyType">
+		<annotation>
+			<documentation>A property that has a collection of surfaces as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ============================================================ -->
+	<element name="MultiSolid" type="gml:MultiSolidType" substitutionGroup="gml:_GeometricAggregate"/>
+	<!-- ======================================================= -->
+	<complexType name="MultiSolidType">
+		<annotation>
+			<documentation>A MultiSolid is defined by one or more Solids, referenced through solidMember elements.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<annotation>
+						<documentation>The members of the geometric aggregate can be specified either using the "standard" property or the array property style. It is also valid to use both the "standard" and the array property style in the same collection.
+NOTE: Array properties cannot reference remote geometry elements.</documentation>
+					</annotation>
+					<element ref="gml:solidMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:solidMembers" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="multiSolidProperty" type="gml:MultiSolidPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:multiSolidProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a solid aggregate via the XLink-attributes or contains the "multi solid" element. multiSolidProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for MultiSolid.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiSolidPropertyType">
+		<annotation>
+			<documentation>A property that has a collection of solids as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- 
+	
+	The following types and elements are deprecated and should not be used !
+	For backward compatibility with GML2 only
+	
+	-->
+	<!-- =========================================================== -->
+	<element name="MultiPolygon" type="gml:MultiPolygonType" substitutionGroup="gml:_GeometricAggregate">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included for backwards compatibility with GML 2. Use the "MultiSurface" element instead.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="MultiLineString" type="gml:MultiLineStringType" substitutionGroup="gml:_GeometricAggregate">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included for backwards compatibility with GML 2. Use the "MultiCurve" element instead.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MultiLineStringType">
+		<annotation>
+			<documentation>A MultiLineString is defined by one or more LineStrings, referenced through lineStringMember elements. Deprecated with GML version 3.0. Use MultiCurveType instead.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:lineStringMember" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="MultiLineStringPropertyType">
+		<annotation>
+			<documentation>This type is deprecated with GML 3 and shall not be used. It is included for backwards compatibility with GML 2. Use MultiCurvePropertyType instead.
+A property that has a collection of line strings as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiLineString"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="MultiPolygonType">
+		<annotation>
+			<documentation>A MultiPolygon is defined by one or more Polygons, referenced through polygonMember elements. Deprecated with GML version 3.0. Use MultiSurfaceType instead.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricAggregateType">
+				<sequence>
+					<element ref="gml:polygonMember" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="MultiPolygonPropertyType">
+		<annotation>
+			<documentation>This type is deprecated with GML 3 and shall not be used. It is included for backwards compatibility with GML 2. Use MultiSurfacePropertyType instead.
+
+A property that has a collection of polygons as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:MultiPolygon"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="geometryMember" type="gml:GeometryPropertyType">
+		<annotation>
+			<documentation>This property element either references a geometry element via the XLink-attributes or contains the geometry element.</documentation>
+		</annotation>
+	</element>
+	<element name="geometryMembers" type="gml:GeometryArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of geometry elements. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<element name="pointMember" type="gml:PointPropertyType">
+		<annotation>
+			<documentation>This property element either references a Point via the XLink-attributes or contains the Point element.</documentation>
+		</annotation>
+	</element>
+	<element name="pointMembers" type="gml:PointArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of points. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<element name="curveMembers" type="gml:CurveArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of curves. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<element name="surfaceMember" type="gml:SurfacePropertyType">
+		<annotation>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. A surface element is any element which is substitutable for "_Surface".</documentation>
+		</annotation>
+	</element>
+	<element name="surfaceMembers" type="gml:SurfaceArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of surfaces. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<element name="solidMember" type="gml:SolidPropertyType">
+		<annotation>
+			<documentation>This property element either references a solid via the XLink-attributes or contains the solid element. A solid element is any element which is substitutable for "_Solid".</documentation>
+		</annotation>
+	</element>
+	<element name="solidMembers" type="gml:SolidArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of solids. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<!-- some named geometry properties - for backward compatibility with GML2 -->
+	<element name="multiCenterOf" type="gml:MultiPointPropertyType"/>
+	<element name="multiPosition" type="gml:MultiPointPropertyType"/>
+	<element name="multiCenterLineOf" type="gml:MultiCurvePropertyType"/>
+	<element name="multiEdgeOf" type="gml:MultiCurvePropertyType"/>
+	<element name="multiCoverage" type="gml:MultiSurfacePropertyType"/>
+	<element name="multiExtentOf" type="gml:MultiSurfacePropertyType"/>
+	<!-- 
+	
+	The following types and elements are deprecated and should not be used !
+	
+	-->
+	<element name="multiLocation" type="gml:MultiPointPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "curveMember" instead.
+This property element either references a line string via the XLink-attributes or contains the line string element.</documentation>
+		</annotation>
+	</element>
+	<element name="lineStringMember" type="gml:LineStringPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "curveMember" instead.
+This property element either references a line string via the XLink-attributes or contains the line string element.</documentation>
+		</annotation>
+	</element>
+	<element name="polygonMember" type="gml:PolygonPropertyType">
+		<annotation>
+			<appinfo>deprecated</appinfo>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "surfaceMember" instead.
+This property element either references a polygon via the XLink-attributes or contains the polygon element.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/geometryBasic0d1d.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/geometryBasic0d1d.xsd
new file mode 100644
index 0000000..724ce89
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/geometryBasic0d1d.xsd
@@ -0,0 +1,602 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by David Burggraf (Galdos Systems Inc) -->
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron"
+        xmlns="http://www.w3.org/2001/XMLSchema">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryBasic0d1d:v3.1.1">geometryBasic0d1d.xsd</appinfo>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryBasic0d1d:v3.1.1">
+			<sch:title>Schematron validation</sch:title>
+			<sch:pattern name="Check SRS tags">
+				<sch:rule abstract="true" id="CRSLabels">
+					<sch:report test="not(@srsDimension) or @srsName">The presence of a dimension attribute implies the presence of the srsName attribute.</sch:report>
+					<sch:report test="not(@axisLabels) or @srsName">The presence of an axisLabels attribute implies the presence of the srsName attribute.</sch:report>
+					<sch:report test="not(@uomLabels) or @srsName">The presence of an uomLabels attribute implies the presence of the srsName attribute.</sch:report>
+					<sch:report test="(not(@uomLabels) and not(@axisLabels)) or (@uomLabels and @axisLabels)">The presence of an uomLabels attribute implies the presence of the axisLabels attribute and vice versa.</sch:report>
+				</sch:rule>
+			</sch:pattern>
+			<sch:pattern name="Check Dimension">
+				<sch:rule abstract="true" id="Count">
+					<sch:report test="not(@count) or @srsDimension">The presence of a count attribute implies the presence of the dimension attribute.</sch:report>
+				</sch:rule>
+			</sch:pattern>
+		</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ============================================================== -->
+	<include schemaLocation="measures.xsd">
+		<annotation>
+			<documentation>This includes not only measures.xsd, but also units.xsd, gmlBase.xsd and basicTypes.xsd.</documentation>
+		</annotation>
+	</include>
+	<!-- ============================================================== -->
+	<!-- ===========  abstract supertype for geometry objects =================== -->
+	<!-- ============================================================== -->
+	<element name="_Geometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>The "_Geometry" element is the abstract head of the substituition group for all geometry elements of GML 3. This 
+			includes pre-defined and user-defined geometry elements. Any geometry element must be a direct or indirect extension/restriction 
+			of AbstractGeometryType and must be directly or indirectly in the substitution group of "_Geometry".</documentation>
+			<appinfo>
+				<sch:pattern name="Check SRS tags">
+					<sch:rule context="gml:_Geometry">
+						<sch:extends rule="CRSLabels"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="GeometryPropertyType">
+		<annotation>
+			<documentation>A geometric property can either be any geometry element encapsulated in an element of this type or an XLink reference 
+			to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Note that either 
+			the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Geometry"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference 
+				remote resources (including those elsewhere in the same document). A simple link element can be constructed by 
+				including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation 
+				of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create 
+				sophisticated links between resources; such links can be used to reference remote properties. A simple link element 
+				can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by 
+				including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="GeometryArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of geometry elements. The elements are always contained in the array property, 
+			referencing geometry elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Geometry" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="AbstractGeometryType" abstract="true">
+		<annotation>
+			<documentation>All geometry elements are derived directly or indirectly from this abstract supertype. A geometry element may 
+			have an identifying attribute ("gml:id"), a name (attribute "name") and a description (attribute "description"). It may be associated 
+			with a spatial reference system (attribute "srsName"). The following rules shall be adhered: - Every geometry type shall derive 
+			from this abstract type. - Every geometry element (i.e. an element of a geometry type) shall be directly or indirectly in the 
+			substitution group of _Geometry.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<attribute name="gid" type="string" use="optional">
+					<annotation>
+						<documentation>This attribute is included for backward compatibility with GML 2 and is deprecated with GML 3. 
+						This identifer is superceded by "gml:id" inherited from AbstractGMLType. The attribute "gid" should not be used 
+						anymore and may be deleted in future versions of GML without further notice.</documentation>
+					</annotation>
+				</attribute>
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<attributeGroup name="SRSReferenceGroup">
+		<annotation>
+			<documentation>Optional reference to the CRS used by this geometry, with optional additional information to simplify use when 
+			a more complete definition of the CRS is not needed.</documentation>
+		</annotation>
+		<attribute name="srsName" type="anyURI" use="optional">
+			<annotation>
+				<documentation>In general this reference points to a CRS instance of gml:CoordinateReferenceSystemType 
+				(see coordinateReferenceSystems.xsd). For well known references it is not required that the CRS description exists at the 
+				location the URI points to. If no srsName attribute is given, the CRS must be specified as part of the larger context this 
+				geometry element is part of, e.g. a geometric element like point, curve, etc. It is expected that this attribute will be specified 
+				at the direct position level only in rare cases.</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="srsDimension" type="positiveInteger" use="optional">
+			<annotation>
+				<documentation>The "srsDimension" is the length of coordinate sequence (the number of entries in the list). This dimension is 
+				specified by the coordinate reference system. When the srsName attribute is omitted, this attribute shall be omitted.</documentation>
+			</annotation>
+		</attribute>
+		<attributeGroup ref="gml:SRSInformationGroup"/>
+	</attributeGroup>
+	<!-- =================================================== -->
+	<attributeGroup name="SRSInformationGroup">
+		<annotation>
+			<documentation>Optional additional and redundant information for a CRS to simplify use when a more complete definition of the 
+			CRS is not needed. This information shall be the same as included in the more complete definition of the CRS, referenced by the 
+			srsName attribute. When the srsName attribute is included, either both or neither of the axisLabels and uomLabels attributes 
+			shall be included. When the srsName attribute is omitted, both of these attributes shall be omitted.</documentation>
+		</annotation>
+		<attribute name="axisLabels" type="gml:NCNameList" use="optional">
+			<annotation>
+				<documentation>Ordered list of labels for all the axes of this CRS. The gml:axisAbbrev value should be used for these axis 
+				labels, after spaces and forbiddden characters are removed. When the srsName attribute is included, this attribute is optional. 
+				When the srsName attribute is omitted, this attribute shall also be omitted.</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="uomLabels" type="gml:NCNameList" use="optional">
+			<annotation>
+				<documentation>Ordered list of unit of measure (uom) labels for all the axes of this CRS. The value of the string in the 
+				gml:catalogSymbol should be used for this uom labels, after spaces and forbiddden characters are removed. When the 
+				axisLabels attribute is included, this attribute shall also be included. When the axisLabels attribute is omitted, this attribute 
+				shall also be omitted.</documentation>
+			</annotation>
+		</attribute>
+	</attributeGroup>
+	<!-- ============================================================== -->
+	<element name="_GeometricPrimitive" type="gml:AbstractGeometricPrimitiveType" abstract="true" substitutionGroup="gml:_Geometry">
+		<annotation>
+			<documentation>The "_GeometricPrimitive" element is the abstract head of the substituition group for all (pre- and user-defined) 
+			geometric primitives.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="AbstractGeometricPrimitiveType" abstract="true">
+		<annotation>
+			<documentation>This is the abstract root type of the geometric primitives. A geometric primitive is a geometric object that is not 
+			decomposed further into other primitives in the system. All primitives are oriented in the direction implied by the sequence of their 
+			coordinate tuples.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType"/>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="GeometricPrimitivePropertyType">
+		<annotation>
+			<documentation>A property that has a geometric primitive as its value domain can either be an appropriate geometry element 
+			encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry 
+			elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither 
+			both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_GeometricPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote 
+				resources (including those elsewhere in the same document). A simple link element can be constructed by including a 
+				specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide 
+				Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between 
+				resources; such links can be used to reference remote properties. A simple link element can be used to implement pointer 
+				functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- primitive geometry objects (0-dimensional) -->
+	<!-- ============================================================== -->
+	<element name="Point" type="gml:PointType" substitutionGroup="gml:_GeometricPrimitive"/>
+	<!-- ============================================================== -->
+	<complexType name="PointType">
+		<annotation>
+			<documentation>A Point is defined by a single coordinate tuple.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the direct poisiton of a point. 1. The "pos" element is of type 
+							DirectPositionType.</documentation>
+						</annotation>
+						<element ref="gml:pos"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0 for coordinates with ordinate values that are numbers. Use "pos" 
+								instead. The "coordinates" element shall only be used for coordinates with ordinates that require a string 
+								representation, e.g. DMS representations.</documentation>
+							</annotation>
+						</element>
+						<element ref="gml:coord">
+							<annotation>
+								<documentation>Deprecated with GML version 3.0. Use "pos" instead. The "coord" element is included for 
+								backwards compatibility with GML 2.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="pointProperty" type="gml:PointPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:pointProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a point via the XLink-attributes or contains the point element. pointProperty 
+			is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that 
+			is substitutable for Point.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<element name="pointRep" type="gml:PointPropertyType">
+		<annotation>
+			<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="PointPropertyType">
+		<annotation>
+			<documentation>A property that has a point as its value domain can either be an appropriate geometry element encapsulated in an 
+			element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located 
+			elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Point"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote 
+				resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific 
+				set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. 
+				XLink allows elements to be inserted into XML documents so as to create sophisticated links between resources; such links can be 
+				used to reference remote properties. A simple link element can be used to implement pointer functionality, and this functionality has 
+				been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="pointArrayProperty" type="gml:PointArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="PointArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of points. The elements are always contained in the array property, referencing geometry 
+			elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:Point" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- primitive geometry objects (1-dimensional) -->
+	<!-- ============================================================== -->
+	<element name="_Curve" type="gml:AbstractCurveType" abstract="true" substitutionGroup="gml:_GeometricPrimitive">
+		<annotation>
+			<documentation>The "_Curve" element is the abstract head of the substituition group for all (continuous) curve elements.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="AbstractCurveType" abstract="true">
+		<annotation>
+			<documentation>An abstraction of a curve to support the different levels of complexity. The curve can always be viewed as a geometric 
+			primitive, i.e. is continuous.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="curveProperty" type="gml:CurvePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:curveProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a curve via the XLink-attributes or contains the curve element. curveProperty is the 
+			predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is 
+			substitutable for _Curve.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="CurvePropertyType">
+		<annotation>
+			<documentation>A property that has a curve as its value domain can either be an appropriate geometry element encapsulated in an 
+			element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere 
+			in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Curve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote 
+				resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific 
+				set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. 
+				XLink allows elements to be inserted into XML documents so as to create sophisticated links between resources; such links can be used 
+				to reference remote properties. A simple link element can be used to implement pointer functionality, and this functionality has been built 
+				into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="curveArrayProperty" type="gml:CurveArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="CurveArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of curves. The elements are always contained in the array property, referencing geometry elements 
+			or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Curve" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="LineString" type="gml:LineStringType" substitutionGroup="gml:_Curve"/>
+	<!-- =========================================================== -->
+	<complexType name="LineStringType">
+		<annotation>
+			<documentation>A LineString is a special curve that consists of a single segment with linear interpolation. It is defined by two or more coordinate 
+			tuples, with linear interpolation between them. It is backwards compatible with the LineString of GML 2, GM_LineString of ISO 19107 is 
+			implemented by LineStringSegment.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a line string. 1. A sequence of "pos" 
+							(DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part 
+							of this curve, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference 
+							another point defined outside of this curve (reuse of existing points). 2. The "posList" element allows for a compact way to 
+							specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong 
+							to this curve only. The number of direct positions in the list must be at least two.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility 
+									with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+							<element ref="gml:coord">
+								<annotation>
+									<documentation>Deprecated with GML version 3.0. Use "pos" instead. The "coord" element is included for backwards 
+									compatibility with GML 2.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<!-- positions -->
+	<!-- =========================================================== -->
+	<element name="pos" type="gml:DirectPositionType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check SRS tags">
+					<sch:rule context="gml:pos">
+						<sch:extends rule="CRSLabels"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="DirectPositionType">
+		<annotation>
+			<documentation>DirectPosition instances hold the coordinates for a position within some coordinate reference system (CRS). Since 
+			DirectPositions, as data types, will often be included in larger objects (such as geometry elements) that have references to CRS, the 
+			"srsName" attribute will in general be missing, if this particular DirectPosition is included in a larger element with such a reference to a 
+			CRS. In this case, the CRS is implicitly assumed to take on the value of the containing object's CRS.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="posList" type="gml:DirectPositionListType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check SRS tags">
+					<sch:rule context="gml:posList">
+						<sch:extends rule="CRSLabels"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<appinfo>
+				<sch:pattern name="Check Dimension">
+					<sch:rule context="gml:posList">
+						<sch:extends rule="Count"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="DirectPositionListType">
+		<annotation>
+			<documentation>DirectPositionList instances hold the coordinates for a sequence of direct positions within the same coordinate 
+			reference system (CRS).</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+				<attribute name="count" type="positiveInteger" use="optional">
+					<annotation>
+						<documentation>"count" allows to specify the number of direct positions in the list. If the attribute count is present then 
+						the attribute srsDimension shall be present, too.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<element name="vector" type="gml:VectorType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check SRS tags">
+					<sch:rule context="gml:vector">
+						<sch:extends rule="CRSLabels"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================== -->
+	<complexType name="VectorType">
+		<annotation>
+			<documentation>Vector instances hold the compoents for a (usually spatial) vector within some coordinate reference system (CRS). 
+			Since Vectors will often be included in larger objects that have references to CRS, the "srsName" attribute may be missing. 
+			In this case, the CRS is implicitly assumed to take on the value of the containing object's CRS.
+
+			Note that this content model is the same as DirectPositionType, but is defined separately to reflect the distinct semantics, and to avoid validation problems. SJDC 2004-12-02</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:doubleList">
+				<attributeGroup ref="gml:SRSReferenceGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<group name="geometricPositionGroup">
+		<annotation>
+			<documentation>A geometric position represented either by a DirectPosition or a Point.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:pos"/>
+			<element ref="gml:pointProperty"/>
+		</choice>
+	</group>
+	<!-- ============================================================== -->
+	<group name="geometricPositionListGroup">
+		<annotation>
+			<documentation>A list of geometric positions represented either by a DirectPosition or a Point.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:posList"/>
+			<group ref="gml:geometricPositionGroup" maxOccurs="unbounded"/>
+		</choice>
+	</group>
+	<!-- ============================================================== -->
+	<element name="coordinates" type="gml:CoordinatesType">
+		<annotation>
+			<documentation>Deprecated with GML version 3.1.0.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<!-- Envelope -->
+	<!-- =========================================================== -->
+	<element name="Envelope" type="gml:EnvelopeType"/>
+	<!-- =========================================================== -->
+	<complexType name="EnvelopeType">
+		<annotation>
+			<documentation>Envelope defines an extent using a pair of positions defining opposite corners in arbitrary dimensions. The first direct 
+			position is the "lower corner" (a coordinate position consisting of all the minimal ordinates for each dimension for all points within the envelope), 
+			the second one the "upper corner" (a coordinate position consisting of all the maximal ordinates for each dimension for all points within the 
+			envelope).</documentation>
+		</annotation>
+		<choice>
+			<sequence>
+				<element name="lowerCorner" type="gml:DirectPositionType"/>
+				<element name="upperCorner" type="gml:DirectPositionType"/>
+			</sequence>
+			<element ref="gml:coord" minOccurs="2" maxOccurs="2">
+				<annotation>
+					<appinfo>deprecated</appinfo>
+					<documentation>deprecated with GML version 3.0</documentation>
+				</annotation>
+			</element>
+			<element ref="gml:pos" minOccurs="2" maxOccurs="2">
+				<annotation>
+					<appinfo>deprecated</appinfo>
+					<documentation>Deprecated with GML version 3.1. Use the explicit properties "lowerCorner" and "upperCorner" instead.</documentation>
+				</annotation>
+			</element>
+			<element ref="gml:coordinates">
+				<annotation>
+					<documentation>Deprecated with GML version 3.1.0. Use the explicit properties "lowerCorner" and "upperCorner" instead.</documentation>
+				</annotation>
+			</element>
+		</choice>
+		<attributeGroup ref="gml:SRSReferenceGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<!--  	 	The following types and elements are deprecated and should not be used ! 	 	-->
+	<element name="coord" type="gml:CoordType">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included for backwards compatibility with GML 2. Use the "pos" element instead.</documentation>
+		</annotation>
+	</element>
+	<complexType name="CoordType">
+		<annotation>
+			<documentation>Represents a coordinate tuple in one, two, or three dimensions. Deprecated with GML 3.0 and replaced by 
+			DirectPositionType.</documentation>
+		</annotation>
+		<sequence>
+			<element name="X" type="decimal"/>
+			<element name="Y" type="decimal" minOccurs="0"/>
+			<element name="Z" type="decimal" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="lineStringProperty" type="gml:LineStringPropertyType">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "curveProperty" instead. This 
+			property element either references a line string via the XLink-attributes or contains the line string element.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="LineStringPropertyType">
+		<annotation>
+			<documentation>This type is deprecated with GML 3 and shall not be used. It is included for backwards compatibility with GML 2. Use 
+			CurvePropertyType instead. A property that has a line string as its value domain can either be an appropriate geometry element encapsulated 
+			in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere 
+			in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:LineString"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources 
+				(including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. 
+				The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to 
+				be inserted into XML documents so as to create sophisticated links between resources; such links can be used to reference remote properties. 
+				A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by 
+				including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/geometryBasic2d.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/geometryBasic2d.xsd
new file mode 100644
index 0000000..f2eb80d
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/geometryBasic2d.xsd
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Clemens Portele (interactive instruments) -->
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+        version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryBasic2d:3.1.1">geometryBasic2d.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<!-- =========================================================== -->
+	<!-- primitive geometry objects (2-dimensional) -->
+	<!-- =========================================================== -->
+	<element name="_Surface" type="gml:AbstractSurfaceType" abstract="true" substitutionGroup="gml:_GeometricPrimitive">
+		<annotation>
+			<documentation>The "_Surface" element is the abstract head of the substituition group for all (continuous) surface elements.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractSurfaceType">
+		<annotation>
+			<documentation>An abstraction of a surface to support the different levels of complexity. A surface is always a continuous region of a plane.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="surfaceProperty" type="gml:SurfacePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:surfaceProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. surfaceProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for _Surface.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="SurfacePropertyType">
+		<annotation>
+			<documentation>A property that has a surface as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Surface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="surfaceArrayProperty" type="gml:SurfaceArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="SurfaceArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of surfaces. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Surface" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:_Surface"/>
+	<!-- =========================================================== -->
+	<complexType name="PolygonType">
+		<annotation>
+			<documentation>A Polygon is a special surface that is defined by a single surface patch. The boundary of this patch is coplanar and the polygon uses planar interpolation in its interior. It is backwards compatible with the Polygon of GML 2, GM_Polygon of ISO 19107 is implemented by PolygonPatch.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:exterior" minOccurs="0"/>
+					<element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- rings (closed curves for surface boundaries) -->
+	<!-- =========================================================== -->
+	<element name="_Ring" type="gml:AbstractRingType" abstract="true" substitutionGroup="gml:_Geometry">
+		<annotation>
+			<documentation>The "_Ring" element is the abstract head of the substituition group for all closed boundaries of a surface patch.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractRingType" abstract="true">
+		<annotation>
+			<documentation>An abstraction of a ring to support surface boundaries of different complexity.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="exterior" type="gml:AbstractRingPropertyType">
+		<annotation>
+			<documentation>A boundary of a surface consists of a number of rings. In the normal 2D case, one of these rings is distinguished as being the exterior boundary. In a general manifold this is not always possible, in which case all boundaries shall be listed as interior boundaries, and the exterior will be empty.</documentation>
+		</annotation>
+	</element>
+	<element name="interior" type="gml:AbstractRingPropertyType">
+		<annotation>
+			<documentation>A boundary of a surface consists of a number of rings. The "interior" rings seperate the surface / surface patch from the area enclosed by the rings.</documentation>
+		</annotation>
+	</element>
+	<element name="outerBoundaryIs" type="gml:AbstractRingPropertyType" substitutionGroup="gml:exterior">
+		<annotation>
+			<documentation>Deprecated with GML 3.0, included only for backwards compatibility with GML 2. Use "exterior" instead.</documentation>
+		</annotation>
+	</element>
+	<element name="innerBoundaryIs" type="gml:AbstractRingPropertyType" substitutionGroup="gml:interior">
+		<annotation>
+			<documentation>Deprecated with GML 3.0, included only for backwards compatibility with GML 2. Use "interior" instead.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractRingPropertyType">
+		<annotation>
+			<documentation>Encapsulates a ring to represent the surface boundary property of a surface.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Ring"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="LinearRing" type="gml:LinearRingType" substitutionGroup="gml:_Ring"/>
+	<!-- =========================================================== -->
+	<complexType name="LinearRingType">
+		<annotation>
+			<documentation>A LinearRing is defined by four or more coordinate tuples, with linear interpolation between them; the first and last coordinates must be coincident.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractRingType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a linear ring.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this ring, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this ring (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this ring only. The number of direct positions in the list must be at least four.</documentation>
+						</annotation>
+						<choice minOccurs="4" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+						<element ref="gml:coord" minOccurs="4" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Deprecated with GML version 3.0 and included for backwards compatibility with GML 2. Use "pos" elements instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="LinearRingPropertyType">
+		<annotation>
+			<documentation>Encapsulates a ring to represent properties in features or geometry collections.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:LinearRing"/>
+		</choice>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- 
+	
+	The following types and elements are deprecated and should not be used !
+	
+	-->
+	<!-- =========================================================== -->
+	<element name="polygonProperty" type="gml:PolygonPropertyType">
+		<annotation>
+			<documentation>Deprecated with GML 3.0 and included only for backwards compatibility with GML 2.0. Use "surfaceProperty" instead.
+This property element either references a polygon via the XLink-attributes or contains the polygon element.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="PolygonPropertyType">
+		<annotation>
+			<documentation>This type is deprecated with GML 3 and shall not be used. It is included for backwards compatibility with GML 2. Use SurfacePropertyType instead.
+A property that has a polygon as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:Polygon"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/geometryComplexes.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/geometryComplexes.xsd
new file mode 100644
index 0000000..724577b
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/geometryComplexes.xsd
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+        version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryComplexes:v3.1.1">geometryComplexes.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="geometryAggregates.xsd"/>
+	<!-- =========================================================== -->
+	<element name="CompositeCurve" type="gml:CompositeCurveType" substitutionGroup="gml:_Curve"/>
+	<!-- =========================================================== -->
+	<complexType name="CompositeCurveType">
+		<annotation>
+			<documentation>A CompositeCurve is defined by a sequence of (orientable) curves such that the each curve in the sequence terminates at the start point of the subsequent curve in the list.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:curveMember" maxOccurs="unbounded">
+						<annotation>
+							<documentation>This element references or contains one curve in the composite curve. The curves are contiguous, the collection of curves is ordered.
+NOTE: This definition allows for a nested structure, i.e. a CompositeCurve may use, for example, another CompositeCurve as a curve member.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="CompositeCurvePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:CompositeCurve"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="CompositeSurface" type="gml:CompositeSurfaceType" substitutionGroup="gml:_Surface"/>
+	<!-- =========================================================== -->
+	<complexType name="CompositeSurfaceType">
+		<annotation>
+			<documentation>A CompositeSurface is defined by a set of orientable surfaces. A composite surface is geometry type with all the geometric properties of a (primitive) surface. Essentially, a composite surface is a collection of surfaces that join in pairs on common boundary curves and which, when considered as a whole, form a single surface.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:surfaceMember" maxOccurs="unbounded">
+						<annotation>
+							<documentation>This element references or contains one surface in the composite surface. The surfaces are contiguous.
+NOTE: This definition allows for a nested structure, i.e. a CompositeSurface may use, for example, another CompositeSurface as a member.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="CompositeSurfacePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:CompositeSurface"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="CompositeSolid" type="gml:CompositeSolidType" substitutionGroup="gml:_Solid"/>
+	<!-- =========================================================== -->
+	<complexType name="CompositeSolidType">
+		<annotation>
+			<documentation>A composite solid is a geometry type with all the geometric properties of a (primitive) solid. 
+				Essentially, a composite solid is a collection of solids that join in pairs on common boundary surfaces and which, when considered as a whole, form a single solid.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSolidType">
+				<sequence>
+					<element ref="gml:solidMember" maxOccurs="unbounded">
+						<annotation>
+							<appinfo>
+								<sch:pattern name="Check either href or content not both">
+									<sch:rule context="gml:solidMember">
+										<sch:extends rule="hrefOrContent"/>
+									</sch:rule>
+								</sch:pattern>
+							</appinfo>
+							<documentation>This element references or contains one solid in the composite solid. The solids are contiguous.
+NOTE: This definition allows for a nested structure, i.e. a CompositeSolid may use, for example, another CompositeSolid as a member.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ============================================================== -->
+	<complexType name="CompositeSolidPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:CompositeSolid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- complex/composite geometry objects -->
+	<!-- =========================================================== -->
+	<element name="GeometricComplex" type="gml:GeometricComplexType" substitutionGroup="gml:_Geometry"/>
+	<!-- =========================================================== -->
+	<complexType name="GeometricComplexType">
+		<annotation>
+			<documentation>A geometric complex.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<sequence>
+					<element name="element" type="gml:GeometricPrimitivePropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="GeometricComplexPropertyType">
+		<annotation>
+			<documentation>A property that has a geometric complex as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.
+NOTE: The allowed geometry elements contained in such a property (or referenced by it) have to be modelled by an XML Schema choice element since the composites inherit both from geometric complex *and* geometric primitive and are already part of the _GeometricPrimitive substitution group.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:GeometricComplex"/>
+				<element ref="gml:CompositeCurve"/>
+				<element ref="gml:CompositeSurface"/>
+				<element ref="gml:CompositeSolid"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/geometryPrimitives.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/geometryPrimitives.xsd
new file mode 100644
index 0000000..d3abf00
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/geometryPrimitives.xsd
@@ -0,0 +1,1609 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Clemens Portele (interactive instruments) -->
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified"
+        version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:geometryPrimitives:3.1.1">geometryPrimitives.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- =========================================================== -->
+	<include schemaLocation="geometryBasic2d.xsd"/>
+	<!-- =========================================================== -->
+	<element name="Curve" type="gml:CurveType" substitutionGroup="gml:_Curve"/>
+	<!-- =========================================================== -->
+	<complexType name="CurveType">
+		<annotation>
+			<documentation>Curve is a 1-dimensional primitive. Curves are continuous, connected, and have a measurable length in terms of the coordinate system. 
+				A curve is composed of one or more curve segments. Each curve segment within a curve may be defined using a different interpolation method. The curve segments are connected to one another, with the end point of each segment except the last being the start point of the next segment in the segment list.
+				The orientation of the curve is positive.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:segments">
+						<annotation>
+							<documentation>This element encapsulates the segments of the curve.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="baseCurve" type="gml:CurvePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:baseCurve">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a curve via the XLink-attributes or contains the curve element. A curve element is any element which is substitutable for "_Curve".</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="OrientableCurve" type="gml:OrientableCurveType" substitutionGroup="gml:_Curve"/>
+	<!-- =========================================================== -->
+	<complexType name="OrientableCurveType">
+		<annotation>
+			<documentation>OrientableCurve consists of a curve and an orientation. If the orientation is "+", then the OrientableCurve is identical to the baseCurve. If the orientation is "-", then the OrientableCurve is related to another _Curve with a parameterization that reverses the sense of the curve traversal.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveType">
+				<sequence>
+					<element ref="gml:baseCurve">
+						<annotation>
+							<documentation>References or contains the base curve (positive orientation).
+NOTE: This definition allows for a nested structure, i.e. an OrientableCurve may use another OrientableCurve as its base curve.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="orientation" type="gml:SignType" default="+">
+					<annotation>
+						<documentation>If the orientation is "+", then the OrientableCurve is identical to the baseCurve. If the orientation is "-", then the OrientableCurve is related to another _Curve with a parameterization that reverses the sense of the curve traversal. "+" is the default value.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- curve segments (1-dimensional) -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_CurveSegment" type="gml:AbstractCurveSegmentType" abstract="true">
+		<annotation>
+			<documentation>The "_CurveSegment" element is the abstract head of the substituition group for all curve segment elements, i.e. continuous segments of the same interpolation mechanism.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractCurveSegmentType" abstract="true">
+		<annotation>
+			<documentation>Curve segment defines a homogeneous segment of a curve.</documentation>
+		</annotation>
+		<sequence/>
+		<attribute name="numDerivativesAtStart" type="integer" use="optional" default="0">
+			<annotation>
+				<documentation>The attribute "numDerivativesAtStart" specifies the type of continuity between this curve segment and its predecessor. If this is the first curve segment in the curve, one of these values, as appropriate, is ignored. The default value of "0" means simple continuity, which is a mandatory minimum level of continuity. This level is referred to as "C 0 " in mathematical texts. A value of 1 means that the function and its first derivative are continuous at the appropriate e [...]
+NOTE: Use of these values is only appropriate when the basic curve definition is an underdetermined system. For example, line string segments cannot support continuity above C 0 , since there is no spare control parameter to adjust the incoming angle at the end points of the segment. Spline functions on the other hand often have extra degrees of freedom on end segments that allow them to adjust the values of the derivatives to support C 1 or higher continuity.</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="numDerivativesAtEnd" type="integer" use="optional" default="0">
+			<annotation>
+				<documentation>The attribute "numDerivativesAtEnd" specifies the type of continuity between this curve segment and its successor. If this is the last curve segment in the curve, one of these values, as appropriate, is ignored. The default value of "0" means simple continuity, which is a mandatory minimum level of continuity. This level is referred to as "C 0 " in mathematical texts. A value of 1 means that the function and its first derivative are continuous at the appropriate end po [...]
+NOTE: Use of these values is only appropriate when the basic curve definition is an underdetermined system. For example, line string segments cannot support continuity above C 0 , since there is no spare control parameter to adjust the incoming angle at the end points of the segment. Spline functions on the other hand often have extra degrees of freedom on end segments that allow them to adjust the values of the derivatives to support C 1 or higher continuity.</documentation>
+			</annotation>
+		</attribute>
+		<attribute name="numDerivativeInterior" type="integer" use="optional" default="0">
+			<annotation>
+				<documentation>The attribute "numDerivativesInterior" specifies the type of continuity that is guaranteed interior to the curve. The default value of "0" means simple continuity, which is a mandatory minimum level of continuity. This level is referred to as "C 0 " in mathematical texts. A value of 1 means that the function and its first derivative are continuous at the appropriate end point: "C 1 " continuity. A value of "n" for any integer means the function and its first n derivati [...]
+NOTE: Use of these values is only appropriate when the basic curve definition is an underdetermined system. For example, line string segments cannot support continuity above C 0 , since there is no spare control parameter to adjust the incoming angle at the end points of the segment. Spline functions on the other hand often have extra degrees of freedom on end segments that allow them to adjust the values of the derivatives to support C 1 or higher continuity.</documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="segments" type="gml:CurveSegmentArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of curve segments. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="CurveSegmentArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of curve segments.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_CurveSegment" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="LineStringSegment" type="gml:LineStringSegmentType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="LineStringSegmentType">
+		<annotation>
+			<documentation>A LineStringSegment is a curve segment that is defined by two or more coordinate tuples, with linear interpolation between them.
+				Note: LineStringSegment implements GM_LineString of ISO 19107.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be at least two.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="linear">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For a LineStringSegment the interpolation is fixed as "linear".</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="ArcString" type="gml:ArcStringType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcStringType">
+		<annotation>
+			<documentation>An ArcString is a curve segment that uses three-point circular arc interpolation.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be at least three.</documentation>
+						</annotation>
+						<choice minOccurs="3" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc3Points">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For an ArcString the interpolation is fixed as "circularArc3Points".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="numArc" type="integer" use="optional">
+					<annotation>
+						<documentation>The number of arcs in the arc string can be explicitly stated in this attribute. The number of control points in the arc string must be 2 * numArc + 1.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="Arc" type="gml:ArcType" substitutionGroup="gml:ArcString"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcType">
+		<annotation>
+			<documentation>An Arc is an arc string with only one arc unit, i.e. three control points.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ArcStringType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be three.</documentation>
+						</annotation>
+						<choice minOccurs="3" maxOccurs="3">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+				</sequence>
+				<attribute name="numArc" type="integer" use="optional" fixed="1">
+					<annotation>
+						<documentation>An arc is an arc string consiting of a single arc, the attribute is fixed to "1".</documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="Circle" type="gml:CircleType" substitutionGroup="gml:Arc"/>
+	<!-- =========================================================== -->
+	<complexType name="CircleType">
+		<annotation>
+			<documentation>A Circle is an arc whose ends coincide to form a simple closed loop. The "start" and "end" bearing are equal and shall be the bearing for the first controlPoint listed. The three control points must be distinct non-co-linear points for the Circle to be unambiguously defined. The arc is simply extended past the third control point until the first control point is encountered.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:ArcType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="ArcStringByBulge" type="gml:ArcStringByBulgeType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcStringByBulgeType">
+		<annotation>
+			<documentation>This variant of the arc computes the mid points of the arcs instead of storing the coordinates directly. The control point sequence consists of the start and end points of each arc plus the bulge.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be at least two.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="bulge" type="double" maxOccurs="unbounded">
+						<annotation>
+							<documentation>The bulge controls the offset of each arc's midpoint. The "bulge" is the real number multiplier for the normal that determines the offset direction of the midpoint of each arc. The length of the bulge sequence is exactly 1 less than the length of the control point array, since a bulge is needed for each pair of adjacent points in the control point array. The bulge is not given by a distance, since it is simply a multiplier for the normal.
+The midpoint of the resulting arc is given by: midPoint = ((startPoint + endPoint)/2.0) + bulge*normal</documentation>
+						</annotation>
+					</element>
+					<element name="normal" type="gml:VectorType" maxOccurs="unbounded">
+						<annotation>
+							<documentation>The attribute "normal" is a vector normal (perpendicular) to the chord of the arc, the line joining the first and last
+point of the arc. In a 2D coordinate system, there are only two possible directions for the normal, and it is often given as a signed real, indicating its length, with a positive sign indicating a left turn angle from the chord line, and a negative sign indicating a right turn from the chord. In 3D, the normal determines the plane of the arc, along with the start and endPoint of the arc.
+The normal is usually a unit vector, but this is not absolutely necessary. If the normal is a zero vector, the geometric object becomes equivalent to the straight line between the two end points. The length of the normal sequence is exactly the same as for the bulge sequence, 1 less than the control point sequence length.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArc2PointWithBulge">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For an ArcStringByBulge the interpolation is fixed as "circularArc2PointWithBulge".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="numArc" type="integer" use="optional">
+					<annotation>
+						<documentation>The number of arcs in the arc string can be explicitly stated in this attribute. The number of control points in the arc string must be numArc + 1.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="ArcByBulge" type="gml:ArcByBulgeType" substitutionGroup="gml:ArcStringByBulge"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcByBulgeType">
+		<annotation>
+			<documentation>An ArcByBulge is an arc string with only one arc unit, i.e. two control points and one bulge.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ArcStringByBulgeType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be two.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="2">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="bulge" type="double">
+						<annotation>
+							<documentation>The bulge controls the offset of each arc's midpoint. The "bulge" is the real number multiplier for the normal that determines the offset direction of the midpoint of each arc. The length of the bulge sequence is exactly 1 less than the length of the control point array, since a bulge is needed for each pair of adjacent points in the control point array. The bulge is not given by a distance, since it is simply a multiplier for the normal.
+The midpoint of the resulting arc is given by: midPoint = ((startPoint + endPoint)/2.0) + bulge*normal</documentation>
+						</annotation>
+					</element>
+					<element name="normal" type="gml:VectorType">
+						<annotation>
+							<documentation>The attribute "normal" is a vector normal (perpendicular) to the chord of the arc, the line joining the first and last
+point of the arc. In a 2D coordinate system, there are only two possible directions for the normal, and it is often given as a signed real, indicating its length, with a positive sign indicating a left turn angle from the chord line, and a negative sign indicating a right turn from the chord. In 3D, the normal determines the plane of the arc, along with the start and endPoint of the arc.
+The normal is usually a unit vector, but this is not absolutely necessary. If the normal is a zero vector, the geometric object becomes equivalent to the straight line between the two end points. The length of the normal sequence is exactly the same as for the bulge sequence, 1 less than the control point sequence length.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="numArc" type="integer" use="optional" fixed="1">
+					<annotation>
+						<documentation>An arc is an arc string consiting of a single arc, the attribute is fixed to "1".</documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="ArcByCenterPoint" type="gml:ArcByCenterPointType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="ArcByCenterPointType">
+		<annotation>
+			<documentation>This variant of the arc requires that the points on the arc have to be computed instead of storing the coordinates directly. The control point is the center point of the arc plus the radius and the bearing at start and end. This represenation can be used only in 2D.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) element. The "pos" element contains a center point that is only part of this curve segment, a "pointProperty" element contains a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element can be used to specifiy the coordinates of the center point, too. The number of direct positions in the list must be one.</documentation>
+						</annotation>
+						<choice>
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="radius" type="gml:LengthType">
+						<annotation>
+							<documentation>The radius of the arc.</documentation>
+						</annotation>
+					</element>
+					<element name="startAngle" type="gml:AngleType" minOccurs="0">
+						<annotation>
+							<documentation>The bearing of the arc at the start.</documentation>
+						</annotation>
+					</element>
+					<element name="endAngle" type="gml:AngleType" minOccurs="0">
+						<annotation>
+							<documentation>The bearing of the arc at the end.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="circularArcCenterPointWithRadius">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For an ArcByCenterPoint the interpolation is fixed as "circularArcCenterPointWithRadius".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="numArc" type="integer" use="required" fixed="1">
+					<annotation>
+						<documentation>Since this type describes always a single arc, the attribute is fixed to "1".</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="CircleByCenterPoint" type="gml:CircleByCenterPointType" substitutionGroup="gml:ArcByCenterPoint"/>
+	<!-- =========================================================== -->
+	<complexType name="CircleByCenterPointType">
+		<annotation>
+			<documentation>A CircleByCenterPoint is an ArcByCenterPoint with identical start and end angle to form a full circle. Again, this represenation can be used only in 2D.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:ArcByCenterPointType"/>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================================ -->
+	<element name="OffsetCurve" type="gml:OffsetCurveType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- ================================================================================ -->
+	<complexType name="OffsetCurveType">
+		<annotation>
+			<documentation>An offset curve is a curve at a constant
+		 distance from the basis curve. They can be useful as a cheap
+		 and simple alternative to constructing curves that are offsets	
+		 by definition.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<element name="offsetBase" type="gml:CurvePropertyType">
+						<annotation>
+							<documentation>offsetBase is a reference to thecurve from which this
+							 curve is define	as an offset.</documentation>
+						</annotation>
+					</element>
+					<element name="distance" type="gml:LengthType">
+						<annotation>
+							<documentation>distance is the distance at which the
+							 offset curve is generated from the basis curve. In 2D systems, positive distances
+							 are to be to the left of the basis curve, and the negative distances are to be to the 
+							 right of the basis curve.</documentation>
+						</annotation>
+					</element>
+					<element name="refDirection" type="gml:VectorType" minOccurs="0">
+						<annotation>
+							<documentation>refDistance is used to define the vector
+       direction of the offset curve from the basis curve. It can
+       be omitted in the 2D case, where the distance can be 
+       positive or negative. In that case, distance defines left
+       side (positive distance) or right side (negative distance)
+       with respect to the tangent to the basis curve.
+
+       In 3D the basis curve shall have a well defined tangent 
+       direction for every point. The offset curve at any point 
+       in 3D, the basis curve shall have a well-defined tangent
+       direction for every point. The offset curve at any point
+       (parameter) on the basis curve c is in the direction
+       -   -   -         -               
+       s = v x t  where  v = c.refDirection()  
+       and
+       -
+       t = c.tangent()
+                                                    -
+       For the offset direction to be well-defined, v shall not
+       on any point of the curve be in the same, or opposite, 
+       direction as
+       - 
+       t.
+
+       The default value of the refDirection shall be the local
+       co-ordinate axis vector for elevation, which indicates up for
+       the curve in a geographic sense.
+
+       NOTE! If the refDirection is the positive tangent to the
+       local elevation axis ("points upward"), then the offset
+       vector points to the left of the curve when viewed from
+       above.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ====================================================== -->
+	<element name="AffinePlacement" type="gml:AffinePlacementType"/>
+	<!-- ====================================================== -->
+	<complexType name="AffinePlacementType">
+		<annotation>
+			<documentation>A placement takes a standard geometric
+   construction and places it in geographic space. It defines a
+   transformation from a constructive parameter space to the 
+   co-ordinate space of the co-ordinate reference system being used.  
+   Parameter spaces in formulae in this International Standard are 
+   given as (u, v) in 2D and(u, v, w) in 3D. Co-ordinate reference 
+   systems positions are given in formulae, in this International 
+   Standard, by either (x, y) in 2D, or (x, y, z) in 3D.
+
+   Affine placements are defined by linear transformations from 
+   parameter space to the target co-ordiante space. 2-dimensional 
+   Cartesian parameter space,(u,v) transforms into 3-dimensional co-
+   ordinate reference systems,(x,y,z) by using an affine 
+   transformation,(u,v)->(x,y,z) which is defined :
+
+	x	ux vx  	x0
+			 u	  
+	y =	uy vy   + y0
+			 v		
+	x	uz vz	z0
+	
+   Then, given this equation, the location element of the 
+   AffinePlacement is the direct position (x0, y0, z0), which is the
+   target position of the origin in (u, v). The two reference
+   directions (ux, uy, uz) and (vx, vy, vz) are the target     
+   directions of the unit vectors at the origin in (u, v).</documentation>
+		</annotation>
+		<sequence>
+			<element name="location" type="gml:DirectPositionType">
+				<annotation>
+					<documentation>The location property gives 
+     the target of the parameter space origin. This is the vector  
+    (x0, y0, z0) in the formulae above.</documentation>
+				</annotation>
+			</element>
+			<element name="refDirection" type="gml:VectorType" maxOccurs="unbounded">
+				<annotation>
+					<documentation>The attribute refDirection gives the    
+target directions for the co-ordinate basis vectors of the  
+parameter space. These are the columns of the matrix in the 
+formulae given above. The number of directions given shall be 
+inDimension. The dimension of the directions shall be 
+outDimension.</documentation>
+				</annotation>
+			</element>
+			<element name="inDimension" type="positiveInteger">
+				<annotation>
+					<documentation>Dimension of the constructive parameter 
+     space.</documentation>
+				</annotation>
+			</element>
+			<element name="outDimension" type="positiveInteger">
+				<annotation>
+					<documentation>Dimension of the co-ordinate space.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- = global element in "_CurveSegment" substitution group ========================== -->
+	<element name="Clothoid" type="gml:ClothoidType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- ======================================================================= -->
+	<complexType name="ClothoidType">
+		<annotation>
+			<documentation>A clothoid, or Cornu's spiral, is plane
+   curve whose curvature is a fixed function of its length.
+   In suitably chosen co-ordinates it is given by Fresnel's
+   integrals.
+
+    x(t) = 0-integral-t cos(AT*T/2)dT    
+    
+    y(t) = 0-integral-t sin(AT*T/2)dT
+   
+   This geometry is mainly used as a transition curve between
+   curves of type straight line to circular arc or circular arc
+   to circular arc. With this curve type it is possible to 
+   achieve a C2-continous transition between the above mentioned
+   curve types. One formula for the Clothoid is A*A = R*t where
+   A is constant, R is the varying radius of curvature along the
+   the curve and t is the length along and given in the Fresnel 
+   integrals.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<element name="refLocation">
+						<complexType>
+							<sequence>
+								<element ref="gml:AffinePlacement">
+									<annotation>
+										<documentation>The "refLocation" is an affine mapping 
+          that places  the curve defined by the Fresnel Integrals  
+          into the co-ordinate reference system of this object.</documentation>
+									</annotation>
+								</element>
+							</sequence>
+						</complexType>
+					</element>
+					<element name="scaleFactor" type="decimal">
+						<annotation>
+							<documentation>The element gives the value for the
+       constant in the Fresnel's integrals.</documentation>
+						</annotation>
+					</element>
+					<element name="startParameter" type="double">
+						<annotation>
+							<documentation>The startParameter is the arc length
+       distance from the inflection point that will be the start
+       point for this curve segment. This shall be lower limit
+       used in the Fresnel integral and is the value of the
+       constructive parameter of this curve segment at its start
+       point. The startParameter can either be positive or
+       negative. 
+       NOTE! If 0.0 (zero), lies between the startParameter and
+       the endParameter of the clothoid, then the curve goes
+       through the clothoid's inflection point, and the direction
+       of its radius of curvature, given by the second
+       derivative vector, changes sides with respect to the
+       tangent vector. The term length distance for the</documentation>
+						</annotation>
+					</element>
+					<element name="endParameter" type="double">
+						<annotation>
+							<documentation>The endParameter is the arc length
+       distance from the inflection point that will be the end
+       point for this curve segment. This shall be upper limit
+       used in the Fresnel integral and is the value of the
+       constructive parameter of this curve segment at its
+       start point. The startParameter can either be positive
+       or negative.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- = global element in "_CurveSegment" substitution group = -->
+	<element name="GeodesicString" type="gml:GeodesicStringType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- ======================================================== -->
+	<complexType name="GeodesicStringType">
+		<annotation>
+			<documentation>A GeodesicString consists of sequence of
+   geodesic segments. The type essentially combines a sequence of
+   Geodesic into a single object.
+   The GeodesicString is computed from two or more positions and an
+   interpolation using geodesics defined from the geoid (or 
+   ellipsoid) of the co-ordinate reference system being used.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<choice>
+					<element ref="gml:posList"/>
+					<group ref="gml:geometricPositionGroup" minOccurs="2" maxOccurs="unbounded"/>
+				</choice>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="geodesic">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the
+     curve interpolation mechanism used for this segment. This
+     mechanism uses the control points and control parameters to
+     determine the position of this curve segment. For an 
+     GeodesicString the interpolation is fixed as "geodesic".</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- = global element in "_CurveSegment" substitution group = -->
+	<element name="Geodesic" type="gml:GeodesicType" substitutionGroup="gml:GeodesicString"/>
+	<!-- ======================================================== -->
+	<complexType name="GeodesicType">
+		<annotation>
+			<documentation>A Geodesic consists of two distinct
+   positions joined by a geodesic curve. The control points of
+   a Geodesic shall lie on the geodesic between its start
+   point and end points. Between these two points, a geodesic
+   curve defined from ellipsoid or geoid model used by the
+   co-ordinate reference systems may be used to interpolate
+   other positions. Any other point in the controlPoint array
+   must fall on this geodesic.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:GeodesicStringType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="CubicSpline" type="gml:CubicSplineType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="CubicSplineType">
+		<annotation>
+			<documentation>Cubic splines are similar to line strings in that they are a sequence of segments each with its own defining function. A cubic spline uses the control points and a set of derivative parameters to define a piecewise 3rd degree polynomial interpolation. Unlike line-strings, the parameterization by arc length is not necessarily still a polynomial. 
+				The function describing the curve must be C2, that is, have a continuous 1st and 2nd derivative at all points, and pass through the controlPoints in the order given. Between the control points, the curve segment is defined by a cubic polynomial. At each control point, the polynomial changes in such a manner that the 1st and 2nd derivative vectors are the same from either side. The control parameters record must contain vectorAtStart, and vectorAtEnd which are the unit tangent vectors [...]
+				Note: only the direction of the vectors is relevant, not their length.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only. The number of direct positions in the list must be at least three.</documentation>
+						</annotation>
+						<choice minOccurs="2" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="vectorAtStart" type="gml:VectorType">
+						<annotation>
+							<documentation>"vectorAtStart" is the unit tangent vector at the start point of the spline.</documentation>
+						</annotation>
+					</element>
+					<element name="vectorAtEnd" type="gml:VectorType">
+						<annotation>
+							<documentation>"vectorAtEnd" is the unit tangent vector at the end point of the spline.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="cubicSpline">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For a CubicSpline the interpolation is fixed as "cubicSpline".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="degree" type="integer" fixed="3">
+					<annotation>
+						<documentation>The degree for a cubic spline is "3".</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="KnotType">
+		<annotation>
+			<documentation>A knot is a breakpoint on a piecewise spline curve.</documentation>
+		</annotation>
+		<sequence>
+			<element name="value" type="double">
+				<annotation>
+					<documentation>The property "value" is the value of the parameter at the knot of the spline. The sequence of knots shall be a non-decreasing sequence. That is, each knot's value in the sequence shall be equal to or greater than the previous knot's value. The use of equal consecutive knots is normally handled using the multiplicity.</documentation>
+				</annotation>
+			</element>
+			<element name="multiplicity" type="nonNegativeInteger">
+				<annotation>
+					<documentation>The property "multiplicity" is the multiplicity of this knot used in the definition of the spline (with the same weight).</documentation>
+				</annotation>
+			</element>
+			<element name="weight" type="double">
+				<annotation>
+					<documentation>The property "weight" is the value of the averaging weight used for this knot of the spline.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="KnotPropertyType">
+		<annotation>
+			<documentation>Encapsulates a knot to use it in a geometric type.</documentation>
+		</annotation>
+		<sequence>
+			<element name="Knot" type="gml:KnotType"/>
+		</sequence>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="BSpline" type="gml:BSplineType" substitutionGroup="gml:_CurveSegment"/>
+	<!-- =========================================================== -->
+	<complexType name="BSplineType">
+		<annotation>
+			<documentation>A B-Spline is a piecewise parametric polynomial or rational curve described in terms of control points and basis functions. Knots are breakpoints on the curve that connect its pieces. They are given as a non-decreasing sequence of real numbers. If the weights in the knots are equal then it is a polynomial spline. The degree is the algebraic degree of the basis functions.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractCurveSegmentType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only.</documentation>
+						</annotation>
+						<choice minOccurs="0" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="degree" type="nonNegativeInteger">
+						<annotation>
+							<documentation>The attribute "degree" shall be the degree of the polynomial used for interpolation in this spline.</documentation>
+						</annotation>
+					</element>
+					<element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="unbounded">
+						<annotation>
+							<documentation>The property "knot" shall be the sequence of distinct knots used to define the spline basis functions.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" default="polynomialSpline">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For a BSpline the interpolation can be either "polynomialSpline" or "rationalSpline", default is "polynomialSpline".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="isPolynomial" type="boolean" use="optional">
+					<annotation>
+						<documentation>The attribute isPolynomial is set to true if this is a polynomial spline.</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="knotType" type="gml:KnotTypesType" use="optional">
+					<annotation>
+						<documentation>The attribute "knotType" gives the type of knot distribution used in defining this spline. This is for information only
+and is set according to the different construction-functions.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========== global element in "_CurveSegment" substitution group ================ -->
+	<element name="Bezier" type="gml:BezierType" substitutionGroup="gml:BSpline"/>
+	<!-- =========================================================== -->
+	<complexType name="BezierType">
+		<annotation>
+			<documentation>Bezier curves are polynomial splines that use Bezier or Bernstein polynomials for interpolation purposes. It is a special case of the B-Spline curve with two knots.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:BSplineType">
+				<sequence>
+					<choice>
+						<annotation>
+							<documentation>GML supports two different ways to specify the control points of a curve segment.
+1. A sequence of "pos" (DirectPositionType) or "pointProperty" (PointPropertyType) elements. "pos" elements are control points that are only part of this curve segment, "pointProperty" elements contain a point that may be referenced from other geometry elements or reference another point defined outside of this curve segment (reuse of existing points).
+2. The "posList" element allows for a compact way to specifiy the coordinates of the control points, if all control points are in the same coordinate reference systems and belong to this curve segment only.</documentation>
+						</annotation>
+						<choice minOccurs="0" maxOccurs="unbounded">
+							<element ref="gml:pos"/>
+							<element ref="gml:pointProperty"/>
+							<element ref="gml:pointRep">
+								<annotation>
+									<documentation>Deprecated with GML version 3.1.0. Use "pointProperty" instead. Included for backwards compatibility with GML 3.0.0.</documentation>
+								</annotation>
+							</element>
+						</choice>
+						<element ref="gml:posList"/>
+						<element ref="gml:coordinates">
+							<annotation>
+								<documentation>Deprecated with GML version 3.1.0. Use "posList" instead.</documentation>
+							</annotation>
+						</element>
+					</choice>
+					<element name="degree" type="nonNegativeInteger">
+						<annotation>
+							<documentation>The attribute "degree" shall be the degree of the polynomial used for interpolation in this spline.</documentation>
+						</annotation>
+					</element>
+					<element name="knot" type="gml:KnotPropertyType" minOccurs="2" maxOccurs="2">
+						<annotation>
+							<documentation>The property "knot" shall be the sequence of distinct knots used to define the spline basis functions.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:CurveInterpolationType" fixed="polynomialSpline">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the curve interpolation mechanism used for this segment. This mechanism
+uses the control points and control parameters to determine the position of this curve segment. For a Bezier the interpolation is fixed as "polynomialSpline".</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="isPolynomial" type="boolean" fixed="true">
+					<annotation>
+						<documentation>The attribute isPolynomial is set to true as this is a polynomial spline.</documentation>
+					</annotation>
+				</attribute>
+				<attribute name="knotType" type="gml:KnotTypesType" use="prohibited">
+					<annotation>
+						<documentation>The property "knotType" is not relevant for Bezier curve segments.</documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Surface" type="gml:SurfaceType" substitutionGroup="gml:_Surface"/>
+	<!-- =========================================================== -->
+	<complexType name="SurfaceType">
+		<annotation>
+			<documentation>A Surface is a 2-dimensional primitive and is composed of one or more surface patches. The surface patches are connected to one another.
+				The orientation of the surface is positive ("up"). The orientation of a surface chooses an "up" direction through the choice of the upward normal, which, if the surface is not a cycle, is the side of the surface from which the exterior boundary appears counterclockwise. Reversal of the surface orientation reverses the curve orientation of each boundary component, and interchanges the conceptual "up" and "down" direction of the surface. If the surface is the boundary of a solid, the " [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:patches">
+						<annotation>
+							<documentation>This element encapsulates the patches of the surface.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="baseSurface" type="gml:SurfacePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:baseSurface">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a surface via the XLink-attributes or contains the surface element. A surface element is any element which is substitutable for "_Surface".</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="OrientableSurface" type="gml:OrientableSurfaceType" substitutionGroup="gml:_Surface"/>
+	<!-- =========================================================== -->
+	<complexType name="OrientableSurfaceType">
+		<annotation>
+			<documentation>OrientableSurface consists of a surface and an orientation. If the orientation is "+", then the OrientableSurface is identical to the baseSurface. If the orientation is "-", then the OrientableSurface is a reference to a Surface with an up-normal that reverses the direction for this OrientableSurface, the sense of "the top of the surface".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfaceType">
+				<sequence>
+					<element ref="gml:baseSurface">
+						<annotation>
+							<documentation>References or contains the base surface (positive orientation).</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="orientation" type="gml:SignType" default="+">
+					<annotation>
+						<documentation>If the orientation is "+", then the OrientableSurface is identical to the baseSurface. If the orientation is "-", then the OrientableSurface is a reference to a Surface with an up-normal that reverses the direction for this OrientableSurface, the sense of "the top of the surface". "+" is the default value.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- surface patches (2-dimensional) -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_SurfacePatch" type="gml:AbstractSurfacePatchType" abstract="true">
+		<annotation>
+			<documentation>The "_SurfacePatch" element is the abstract head of the substituition group for all surface pach elements describing a continuous portion of a surface.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractSurfacePatchType" abstract="true">
+		<annotation>
+			<documentation>A surface patch defines a homogenuous portion of a surface.</documentation>
+		</annotation>
+		<sequence/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="patches" type="gml:SurfacePatchArrayPropertyType">
+		<annotation>
+			<documentation>This property element contains a list of surface patches. The order of the elements is significant and shall be preserved when processing the array.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="SurfacePatchArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of surface patches.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:_SurfacePatch"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="PolygonPatch" type="gml:PolygonPatchType" substitutionGroup="gml:_SurfacePatch"/>
+	<!-- =========================================================== -->
+	<complexType name="PolygonPatchType">
+		<annotation>
+			<documentation>A PolygonPatch is a surface patch that is defined by a set of boundary curves and an underlying surface to which these curves adhere. The curves are coplanar and the polygon uses planar interpolation in its interior. Implements GM_Polygon of ISO 19107.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior" minOccurs="0"/>
+					<element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the interpolation mechanism used for this surface patch. Currently only planar surface patches are defined in GML 3, the attribute is fixed to "planar", i.e. the interpolation method shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Triangle" type="gml:TriangleType" substitutionGroup="gml:_SurfacePatch"/>
+	<!-- =========================================================== -->
+	<complexType name="TriangleType">
+		<annotation>
+			<documentation>Represents a triangle as a surface with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring must be four.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior">
+						<annotation>
+							<documentation>Constraint: The Ring shall be a LinearRing and must form a triangle, the first and the last position must be co-incident.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the interpolation mechanism used for this surface patch. Currently only planar surface patches are defined in GML 3, the attribute is fixed to "planar", i.e. the interpolation method shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Rectangle" type="gml:RectangleType" substitutionGroup="gml:_SurfacePatch"/>
+	<!-- =========================================================== -->
+	<complexType name="RectangleType">
+		<annotation>
+			<documentation>Represents a rectangle as a surface with an outer boundary consisting of a linear ring. Note that this is a polygon (subtype) with no inner boundaries. The number of points in the linear ring must be five.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType">
+				<sequence>
+					<element ref="gml:exterior">
+						<annotation>
+							<documentation>Constraint: The Ring shall be a LinearRing and must form a rectangle; the first and the last position must be co-incident.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="interpolation" type="gml:SurfaceInterpolationType" fixed="planar">
+					<annotation>
+						<documentation>The attribute "interpolation" specifies the interpolation mechanism used for this surface patch. Currently only planar surface patches are defined in GML 3, the attribute is fixed to "planar", i.e. the interpolation method shall return points on a single plane. The boundary of the patch shall be contained within that plane.</documentation>
+					</annotation>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="curveMember" type="gml:CurvePropertyType">
+		<annotation>
+			<documentation>This property element either references a curve via the XLink-attributes or contains the curve element. A curve element is any element which is substitutable for "_Curve".</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="Ring" type="gml:RingType" substitutionGroup="gml:_Ring"/>
+	<!-- =========================================================== -->
+	<complexType name="RingType">
+		<annotation>
+			<documentation>A Ring is used to represent a single connected component of a surface boundary. It consists of a sequence of curves connected in a cycle (an object whose boundary is empty).
+A Ring is structurally similar to a composite curve in that the endPoint of each curve in the sequence is the startPoint of the next curve in the Sequence. Since the sequence is circular, there is no exception to this rule. Each ring, like all boundaries, is a cycle and each ring is simple.
+NOTE: Even though each Ring is simple, the boundary need not be simple. The easiest case of this is where one of the interior rings of a surface is tangent to its exterior ring.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractRingType">
+				<sequence>
+					<element ref="gml:curveMember" maxOccurs="unbounded">
+						<annotation>
+							<documentation>This element references or contains one curve in the composite curve. The curves are contiguous, the collection of curves is ordered.
+NOTE: This definition allows for a nested structure, i.e. a CompositeCurve may use, for example, another CompositeCurve as a curve member.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="RingPropertyType">
+		<annotation>
+			<documentation>Encapsulates a ring to represent properties in features or geometry collections.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:Ring"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<group name="PointGrid">
+		<annotation>
+			<documentation>Reference points which are organised
+   into sequences or grids(sequences of equal length sequences).</documentation>
+		</annotation>
+		<sequence>
+			<element name="row" maxOccurs="unbounded">
+				<complexType>
+					<sequence>
+						<group ref="gml:geometricPositionListGroup"/>
+					</sequence>
+				</complexType>
+			</element>
+		</sequence>
+	</group>
+	<!-- ====================================================== -->
+	<element name="_ParametricCurveSurface" type="gml:AbstractParametricCurveSurfaceType" abstract="true" substitutionGroup="gml:_SurfacePatch"/>
+	<!-- ====================================================== -->
+	<complexType name="AbstractParametricCurveSurfaceType">
+		<annotation>
+			<documentation>
+			</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSurfacePatchType"/>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="_GriddedSurface" type="gml:AbstractGriddedSurfaceType" abstract="true" substitutionGroup="gml:_ParametricCurveSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="AbstractGriddedSurfaceType">
+		<annotation>
+			<documentation>A gridded surface is a parametric curve
+   surface derived from a rectangular grid in the parameter
+   space. The rows from this grid are control points for
+   horizontal surface curves; the columns are control points
+   for vertical surface curves. The working assumption is that
+   for a pair of parametric co-ordinates (s, t) that the
+   horizontal curves for each integer offset are calculated
+   and evaluated at "s". The defines a sequence of control
+   points:
+   
+   cn(s) : s  1 .....columns 
+
+   From this sequence a vertical curve is calculated for "s",
+   and evaluated at "t". In most cases, the order of
+   calculation (horizontal-vertical vs. vertical-horizontal)
+   does not make a difference. Where it does, the horizontal-   
+   vertical order shall be the one used.
+
+   Logically, any pair of curve interpolation types can lead
+   to a subtype of GriddedSurface. The following clauses
+   define some most commonly encountered surfaces that can
+   be represented in this manner.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractParametricCurveSurfaceType">
+				<sequence>
+					<group ref="gml:PointGrid">
+						<annotation>
+							<documentation>This is the double indexed sequence
+       of control points, given in row major form. 
+       NOTE! There in no assumption made about the shape
+       of the grid. 
+       For example, the positions need not effect a "21/2D"
+       surface, consecutive points may be equal in any or all
+       of the ordinates. Further, the curves in either or both
+       directions may close.</documentation>
+						</annotation>
+					</group>
+					<element name="rows" type="integer" minOccurs="0">
+						<annotation>
+							<documentation>The attribute rows gives the number
+         of rows in the parameter grid.</documentation>
+						</annotation>
+					</element>
+					<element name="columns" type="integer" minOccurs="0">
+						<annotation>
+							<documentation>The attribute columns gives the number
+        of columns in the parameter grid.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="Cone" type="gml:ConeType" substitutionGroup="gml:_GriddedSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="ConeType">
+		<annotation>
+			<documentation>A cone is a gridded surface given as a
+   family of conic sections whose control points vary linearly.
+   NOTE! A 5-point ellipse with all defining positions identical
+   is a point. Thus, a truncated elliptical cone can be given as a
+   2x5 set of control points
+   ((P1, P1, P1, P1, P1), (P2, P3, P4, P5, P6)). P1 is the apex 
+   of the cone. P2, P3,P4, P5 and P6 are any five distinct points
+   around the base ellipse of the cone. If the horizontal curves
+   are circles as opposed to ellipses, the a circular cone can
+   be constructed using ((P1, P1, P1),(P2, P3, P4)). The apex most     
+   not coinside with the other plane.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="Cylinder" type="gml:CylinderType" substitutionGroup="gml:_GriddedSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="CylinderType">
+		<annotation>
+			<documentation>A cylinder is a gridded surface given as a
+   family of circles whose positions vary along a set of parallel
+   lines, keeping the cross sectional horizontal curves of a
+   constant shape.
+   NOTE! Given the same working assumptions as in the previous
+   note, a Cylinder can be given by two circles, giving us the
+   control points of the form ((P1, P2, P3),(P4, P5, P6)).</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="linear"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="Sphere" type="gml:SphereType" substitutionGroup="gml:_GriddedSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="SphereType">
+		<annotation>
+			<documentation>A sphere is a gridded surface given as a
+   family of circles whose positions vary linearly along the
+   axis of the sphere, and whise radius varies in proportions to
+   the cosine function of the central angle. The horizontal 
+   circles resemble lines of constant latitude, and the vertical
+   arcs resemble lines of constant longitude. 
+   NOTE! If the control points are sorted in terms of increasing
+   longitude, and increasing latitude, the upNormal of a sphere
+   is the outward normal.
+   EXAMPLE If we take a gridded set of latitudes and longitudes
+   in degrees,(u,v) such as
+
+	(-90,-180)  (-90,-90)  (-90,0)  (-90,  90) (-90, 180) 
+	(-45,-180)  (-45,-90)  (-45,0)  (-45,  90) (-45, 180) 
+	(  0,-180)  (  0,-90)  (  0,0)  (  0,  90) (  0, 180)
+	( 45,-180)  ( 45,-90)  ( 45,0)  ( 45, -90) ( 45, 180)
+	( 90,-180)  ( 90,-90)  ( 90,0)  ( 90, -90) ( 90, 180)
+   
+   And map these points to 3D using the usual equations (where R
+   is the radius of the required sphere).
+
+    z = R sin u
+    x = (R cos u)(sin v)
+    y = (R cos u)(cos v)
+
+   We have a sphere of Radius R, centred at (0,0), as a gridded
+   surface. Notice that the entire first row and the entire last
+   row of the control points map to a single point in each 3D
+   Euclidean space, North and South poles respectively, and that
+   each horizontal curve closes back on itself forming a 
+   geometric cycle. This gives us a metrically bounded (of finite
+   size), topologically unbounded (not having a boundary, a
+   cycle) surface.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGriddedSurfaceType">
+				<attribute name="horizontalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+				<attribute name="verticalCurveType" type="gml:CurveInterpolationType" fixed="circularArc3Points"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="PolyhedralSurface" type="gml:PolyhedralSurfaceType" substitutionGroup="gml:Surface"/>
+	<!-- ======================================================== -->
+	<complexType name="PolyhedralSurfaceType">
+		<annotation>
+			<documentation>A polyhedral surface is a surface composed
+   of polygon surfaces connected along their common boundary 
+   curves. This differs from the surface type only in the
+   restriction on the types of surface patches acceptable.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfaceType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:polygonPatches">
+						<annotation>
+							<documentation>This property encapsulates the patches of 
+      the polyhedral surface.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="polygonPatches" type="gml:PolygonPatchArrayPropertyType" substitutionGroup="gml:patches">
+		<annotation>
+			<documentation>This property element contains a list of
+   polygon patches. The order of the patches is significant and 
+   shall be preserved when processing the list.</documentation>
+		</annotation>
+	</element>
+	<!-- ======================================================== -->
+	<complexType name="PolygonPatchArrayPropertyType">
+		<annotation>
+			<documentation>This type defines a container for an array of 
+   polygon patches.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfacePatchArrayPropertyType">
+				<sequence minOccurs="0" maxOccurs="unbounded">
+					<element ref="gml:PolygonPatch"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="trianglePatches" type="gml:TrianglePatchArrayPropertyType" substitutionGroup="gml:patches">
+		<annotation>
+			<documentation>This property element contains a list of
+   triangle patches. The order of the patches is significant and 
+   shall be preserved when processing the list.</documentation>
+		</annotation>
+	</element>
+	<!-- ======================================================== -->
+	<complexType name="TrianglePatchArrayPropertyType">
+		<annotation>
+			<documentation>This type defines a container for an array of 
+     triangle patches.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfacePatchArrayPropertyType">
+				<sequence minOccurs="0" maxOccurs="unbounded">
+					<element ref="gml:Triangle"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="TriangulatedSurface" type="gml:TriangulatedSurfaceType" substitutionGroup="gml:Surface"/>
+	<!-- ======================================================== -->
+	<complexType name="TriangulatedSurfaceType">
+		<annotation>
+			<documentation>A triangulated surface is a polyhedral 
+   surface that is composed only of triangles. There is no
+   restriction on how the triangulation is derived.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:SurfaceType">
+				<sequence>
+					<group ref="gml:StandardObjectProperties"/>
+					<element ref="gml:trianglePatches">
+						<annotation>
+							<documentation>This property encapsulates the patches of 
+      the triangulated surface.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ======================================================== -->
+	<element name="Tin" type="gml:TinType" substitutionGroup="gml:TriangulatedSurface"/>
+	<!-- ======================================================== -->
+	<complexType name="TinType">
+		<annotation>
+			<documentation>A tin is a triangulated surface that uses
+   the Delauny algorithm or a similar algorithm complemented with
+   consideration of breaklines, stoplines, and maximum length of 
+   triangle sides. These networks satisfy the Delauny's criterion
+   away from the modifications: Fore each triangle in the 
+   network, the circle passing through its vertices does not
+   contain, in its interior, the vertex of any other triangle.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:TriangulatedSurfaceType">
+				<sequence>
+					<element name="stopLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Stoplines are lines where the local
+       continuity or regularity of the surface is questionable.
+       In the area of these pathologies, triangles intersecting
+       a stopline shall be removed from the tin surface, leaving
+       holes in the surface. If coincidence occurs on surface
+       boundary triangles, the result shall be a change of the 
+       surface boundary. Stoplines contains all these
+       pathological segments as a set of line strings.</documentation>
+						</annotation>
+					</element>
+					<element name="breakLines" type="gml:LineStringSegmentArrayPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Breaklines are lines of a critical
+       nature to the shape of the surface, representing local
+       ridges, or depressions (such as drainage lines) in the
+       surface. As such their constituent segments must be
+       included in the tin eve if doing so
+       violates the Delauny criterion. Break lines contains these
+       critical segments as a set of line strings.</documentation>
+						</annotation>
+					</element>
+					<element name="maxLength" type="gml:LengthType">
+						<annotation>
+							<documentation>Areas of the surface where data is not 
+       sufficiently dense to assure reasonable calculation shall be    
+       removed by adding a retention criterion for triangles based 
+       on the length of their sides. For many triangle sides  
+       exceeding maximum length, the adjacent triangles to that 
+       triangle side shall be removed from the surface.</documentation>
+						</annotation>
+					</element>
+					<element name="controlPoint">
+						<annotation>
+							<documentation>The corners of the triangles in the TIN 
+  are often referred to as pots. ControlPoint shall contain a 
+  set of the GM_Position used as posts for this TIN. Since each  
+  TIN contains triangles, there must be at least 3 posts. The 
+       order in which these points are given does not affect the 
+       surface that is represented. Application schemas may add 
+       information based on ordering of control points to facilitate 
+       the reconstruction of the TIN from the control points.</documentation>
+						</annotation>
+						<complexType>
+							<choice>
+								<element ref="gml:posList"/>
+								<group ref="gml:geometricPositionGroup" minOccurs="3" maxOccurs="unbounded"/>
+							</choice>
+						</complexType>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<complexType name="LineStringSegmentArrayPropertyType">
+		<sequence>
+			<element ref="gml:LineStringSegment" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- primitive geometry objects (3-dimensional) -->
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<element name="_Solid" type="gml:AbstractSolidType" abstract="true" substitutionGroup="gml:_GeometricPrimitive">
+		<annotation>
+			<documentation>The "_Solid" element is the abstract head of the substituition group for all (continuous) solid elements.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractSolidType">
+		<annotation>
+			<documentation>An abstraction of a solid to support the different levels of complexity. A solid is always contiguous.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometricPrimitiveType"/>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="solidProperty" type="gml:SolidPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either href or content not both">
+					<sch:rule context="gml:solidProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>This property element either references a solid via the XLink-attributes or contains the solid element. solidProperty is the predefined property which can be used by GML Application Schemas whenever a GML Feature has a property with a value that is substitutable for _Solid.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="SolidPropertyType">
+		<annotation>
+			<documentation>A property that has a solid as its value domain can either be an appropriate geometry element encapsulated in an element of this type or an XLink reference to a remote geometry element (where remote includes geometry elements located elsewhere in the same document). Either the reference or the contained element must be given, but neither both nor none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Solid"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup">
+			<annotation>
+				<documentation>This attribute group includes the XLink attributes (see xlinks.xsd). XLink is used in GML to reference remote resources (including those elsewhere in the same document). A simple link element can be constructed by including a specific set of XLink attributes. The XML Linking Language (XLink) is currently a Proposed Recommendation of the World Wide Web Consortium. XLink allows elements to be inserted into XML documents so as to create sophisticated links between resourc [...]
+A simple link element can be used to implement pointer functionality, and this functionality has been built into various GML 3 elements by including the gml:AssociationAttributeGroup.</documentation>
+			</annotation>
+		</attributeGroup>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="solidArrayProperty" type="gml:SolidArrayPropertyType"/>
+	<!-- =========================================================== -->
+	<complexType name="SolidArrayPropertyType">
+		<annotation>
+			<documentation>A container for an array of solids. The elements are always contained in the array property, referencing geometry elements or arrays of geometry elements is not supported.</documentation>
+		</annotation>
+		<sequence minOccurs="0" maxOccurs="unbounded">
+			<element ref="gml:_Solid"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="Solid" type="gml:SolidType" substitutionGroup="gml:_Solid"/>
+	<!-- =========================================================== -->
+	<complexType name="SolidType">
+		<annotation>
+			<documentation>A solid is the basis for 3-dimensional geometry. The extent of a solid is defined by the boundary surfaces (shells). A shell is represented by a composite surface, where every  shell is used to represent a single connected component of the boundary of a solid. It consists of a composite surface (a list of orientable surfaces) connected in a topological cycle (an object whose boundary is empty). Unlike a Ring, a Shell's elements have no natural sort order. Like Rings, Sh [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractSolidType">
+				<sequence>
+					<element name="exterior" type="gml:SurfacePropertyType" minOccurs="0">
+						<annotation>
+							<appinfo>
+								<sch:pattern name="Check either href or content not both">
+									<sch:rule context="gml:exterior">
+										<sch:extends rule="hrefOrContent"/>
+									</sch:rule>
+								</sch:pattern>
+							</appinfo>
+							<documentation>Boundaries of solids are similar to surface boundaries. In normal 3-dimensional Euclidean space, one (composite) surface is distinguished as the exterior. In the more general case, this is not always possible.</documentation>
+						</annotation>
+					</element>
+					<element name="interior" type="gml:SurfacePropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<appinfo>
+								<sch:pattern name="Check either href or content not both">
+									<sch:rule context="gml:interior">
+										<sch:extends rule="hrefOrContent"/>
+									</sch:rule>
+								</sch:pattern>
+							</appinfo>
+							<documentation>Boundaries of solids are similar to surface boundaries.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- predefined simple types (enumerations, simple typed arrays) -->
+	<!-- =========================================================== -->
+	<simpleType name="CurveInterpolationType">
+		<annotation>
+			<documentation>CurveInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an
+application schema.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="linear"/>
+			<enumeration value="geodesic"/>
+			<enumeration value="circularArc3Points"/>
+			<enumeration value="circularArc2PointWithBulge"/>
+			<enumeration value="circularArcCenterPointWithRadius"/>
+			<enumeration value="elliptical"/>
+			<enumeration value="clothoid"/>
+			<enumeration value="conic"/>
+			<enumeration value="polynomialSpline"/>
+			<enumeration value="cubicSpline"/>
+			<enumeration value="rationalSpline"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="SurfaceInterpolationType">
+		<annotation>
+			<documentation>SurfaceInterpolationType is a list of codes that may be used to identify the interpolation mechanisms specified by an
+application schema.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="none"/>
+			<enumeration value="planar"/>
+			<enumeration value="spherical"/>
+			<enumeration value="elliptical"/>
+			<enumeration value="conic"/>
+			<enumeration value="tin"/>
+			<enumeration value="parametricCurve"/>
+			<enumeration value="polynomialSpline"/>
+			<enumeration value="rationalSpline"/>
+			<enumeration value="triangulatedSpline"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<simpleType name="KnotTypesType">
+		<annotation>
+			<documentation>Defines allowed values for the knots` type. Uniform knots implies that all knots are of multiplicity 1 and they differ by a positive constant from the preceding knot. Knots are quasi-uniform iff they are of multiplicity (degree + 1) at the ends, of multiplicity 1 elsewhere, and they differ by a positive constant from the preceding knot.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="uniform"/>
+			<enumeration value="quasiUniform"/>
+			<enumeration value="piecewiseBezier"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/gml.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/gml.xsd
new file mode 100644
index 0000000..47e4c78
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/gml.xsd
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml"
+        xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:gml:3.1.1">gml.xsd</appinfo>
+		<documentation>Top level GML schema
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<include schemaLocation="dynamicFeature.xsd"/>
+	<include schemaLocation="topology.xsd"/>
+	<include schemaLocation="coverage.xsd"/>
+	<include schemaLocation="coordinateReferenceSystems.xsd"/>
+	<include schemaLocation="observation.xsd"/>
+	<include schemaLocation="defaultStyle.xsd"/>
+	<include schemaLocation="temporalReferenceSystems.xsd"/>
+	<!-- ====================================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/gmlBase.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/gmlBase.xsd
new file mode 100644
index 0000000..74d8308
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/gmlBase.xsd
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:gmlBase:3.1.1">
+			<sch:title>Schematron validation</sch:title>
+			<sch:ns prefix="gml" uri="http://www.opengis.net/gml"/>
+			<sch:ns prefix="xlink" uri="http://www.w3.org/1999/xlink"/>
+			<sch:pattern name="Check either href or content not both">
+				<sch:rule abstract="true" id="hrefOrContent">
+					<sch:report test="@xlink:href and (*|text())">Property element may not carry both a reference to an object and contain an object.</sch:report>
+					<sch:assert test="@xlink:href | (*|text())">Property element must either carry a reference to an object or contain an object.</sch:assert>
+				</sch:rule>
+			</sch:pattern>
+		</appinfo>
+		<documentation>GML base schema for GML 3
+			Components to support the GML encoding model.
+			The abstract Schematron rules can be used by any schema that includes gmlBase.
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="basicTypes.xsd"/>
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="../../../../w3c/1999/xlink.xsd"/>
+	<!-- =========================================================== -->
+	<!-- ==================== Objects ================================ -->
+	<!-- =========================================================== -->
+	<!-- =========== Abstract "Object" is "anyType" ============= -->
+	<!-- ===== Global element at the head of the "Object" substitution group ======== -->
+	<element name="_Object" abstract="true">
+		<annotation>
+			<documentation>This abstract element is the head of a substitutionGroup hierararchy which may contain either simpleContent or complexContent elements.  It is used to assert the model position of "class" elements declared in other GML schemas.</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================= -->
+	<!-- =========== Abstract "GMLobject" supertype ========================= -->
+	<element name="_GML" type="gml:AbstractGMLType" abstract="true" substitutionGroup="gml:_Object">
+		<annotation>
+			<documentation>Global element which acts as the head of a substitution group that may include any element which is a GML feature, object, geometry or complex value</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<group name="StandardObjectProperties">
+		<annotation>
+			<documentation>This content model group makes it easier to construct types that 
+      derive from AbstractGMLType and its descendents "by restriction".  
+      A reference to the group saves having to enumerate the standard object properties.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+			<element ref="gml:description" minOccurs="0"/>
+			<element ref="gml:name" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Multiple names may be provided.  These will often be distinguished by being assigned by different authorities, as indicated by the value of the codeSpace attribute.  In an instance document there will usually only be one name per authority.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</group>
+	<!-- =========================================================== -->
+	<complexType name="AbstractGMLType" abstract="true">
+		<annotation>
+			<documentation>All complexContent GML elements are directly or indirectly derived from this abstract supertype 
+	to establish a hierarchy of GML types that may be distinguished from other XML types by their ancestry. 
+	Elements in this hierarchy may have an ID and are thus referenceable.</documentation>
+		</annotation>
+		<sequence>
+			<group ref="gml:StandardObjectProperties"/>
+		</sequence>
+		<attribute ref="gml:id" use="optional"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Concrete "Collection" supertype ========================= -->
+	<element name="Bag" type="gml:BagType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>Generic GML element to contain a heterogeneous collection of GML _Objects</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="BagType">
+		<annotation>
+			<documentation>A non-abstract generic collection type that can be used as a document element for a collection of any GML types - Geometries, Topologies, Features ...
+
+FeatureCollections may only contain Features.  GeometryCollections may only contain Geometrys.  Bags are less constrained  they must contain objects that are substitutable for gml:_Object.  This may mix several levels, including Features, Definitions, Dictionaries, Geometries etc.  
+
+The content model would ideally be 
+   member 0..*
+   members 0..1
+   member 0..*
+for maximum flexibility in building a collection from both homogeneous and distinct components: 
+included "member" elements each contain a single Object
+an included "members" element contains a set of Objects 
+
+However, this is non-deterministic, thus prohibited by XSD.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:member" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:members" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Concrete "Array" supertype ========================= -->
+	<element name="Array" type="gml:ArrayType" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation>Generic GML element to contain a homogeneous array of GML _Objects</documentation>
+		</annotation>
+	</element>
+	<!-- ======================================================================= -->
+	<complexType name="ArrayType">
+		<annotation>
+			<documentation>A non-abstract generic collection type that can be used as a document element for a homogeneous collection of any GML types - Geometries, Topologies, Features ...</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:members" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Abstract Metadata supertype ========================= -->
+	<element name="_MetaData" type="gml:AbstractMetaDataType" abstract="true" substitutionGroup="gml:_Object">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group for packages of MetaData properties.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="AbstractMetaDataType" abstract="true" mixed="true">
+		<annotation>
+			<documentation>An abstract base type for complex metadata types.</documentation>
+		</annotation>
+		<attribute ref="gml:id" use="optional"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Container for Generic Metadata ========================= -->
+	<element name="GenericMetaData" type="gml:GenericMetaDataType" substitutionGroup="gml:_MetaData">
+		<annotation>
+			<documentation>Concrete element in the _MetaData substitution group, which permits any well-formed XML content.  Intended to act as a container for metadata defined in external schemas, for which it is not possible to add the concrete components to the GML _MetaData substitution group directly. Deprecated with GML version 3.1.0.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="GenericMetaDataType" mixed="true">
+		<annotation>
+			<documentation>Deprecated with GML version 3.1.0.</documentation>
+		</annotation>
+		<complexContent mixed="true">
+			<extension base="gml:AbstractMetaDataType">
+				<sequence>
+					<any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ================== Base Property Types ============================== -->
+	<!-- ================================================================== -->
+	<!-- ==== property types for unspecified association - by Value or by Reference ==== -->
+	<!-- ====== single Objects - by Value or by Reference ======== -->
+	<element name="_association" type="gml:AssociationType" abstract="true"/>
+	<!-- =========================================================== -->
+	<element name="_strictAssociation" type="gml:AssociationType" abstract="true">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:_strictAssociation">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>must carry a reference to an object or contain an object but not both</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="member" type="gml:AssociationType"/>
+	<!-- =========================================================== -->
+	<complexType name="AssociationType">
+		<annotation>
+			<documentation>A pattern or base for derived types used to specify complex types corresponding to an  unspecified UML association - either composition or aggregation.  Restricts the cardinality of Objects contained in the association to a maximum of one.  An instance of this type can contain an element representing an Object, or serve as a pointer to a remote Object.  
+
+Descendents of this type can be restricted in an application schema to 
+* allow only specified classes as valid participants in the aggregation
+* allow only association by reference (i.e. empty the content model) or by value (i.e. remove the xlinks).    
+
+When used for association by reference, the value of the gml:remoteSchema attribute can be used to locate a schema fragment that constrains the target instance.   
+
+In many cases it is desirable to impose the constraint prohibiting the occurence of both reference and value in the same instance, as that would be ambiguous.  This is accomplished by adding a directive in the annotation element of the element declaration.  This directive can be in the form of normative prose, or can use a Schematron pattern to automatically constrain co-occurrence - see the declaration for _strictAssociation below.   
+
+If co-occurence is not prohibited, then both a link and content may be present.  If this occurs in an instance, then the rule for interpretation is that the instance found by traversing the href provides the normative value of the property, and should be used when possible.  The value(s) included as content may be used if the remote instance cannot be resolved.  This may be considered to be a "cached" version of the value(s).</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_Object"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="_reference" type="gml:ReferenceType" abstract="true"/>
+	<!-- =========================================================== -->
+	<complexType name="ReferenceType">
+		<annotation>
+			<documentation>A pattern or base for derived types used to specify complex types corresponding to a UML aggregation association.  An instance of this type serves as a pointer to a remote Object.</documentation>
+		</annotation>
+		<sequence/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- ========= multiple objects  - by Value or by Reference ================== -->
+	<element name="members" type="gml:ArrayAssociationType"/>
+	<!-- =========================================================== -->
+	<complexType name="ArrayAssociationType">
+		<annotation>
+			<documentation>A base for derived types used to specify complex types containing an array of objects, by unspecified UML association - either composition or aggregation.  An instance of this type contains elements representing Objects.
+
+Ideally this type would be derived by extension of AssociationType.  
+However, this leads to a non-deterministic content model, since both the base and the extension have minOccurs="0", and is thus prohibited in XML Schema.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_Object" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========== Abstract "property" supertype ========================= -->
+	<element name="metaDataProperty" type="gml:MetaDataPropertyType">
+		<annotation>
+			<documentation>Contains or refers to a metadata package that contains metadata properties.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="MetaDataPropertyType">
+		<annotation>
+			<documentation>Base type for complex metadata property types.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<any processContents="lax"/>
+			<!-- <element ref="gml:_MetaData"/> -->
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+		<attribute name="about" type="anyURI" use="optional"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- ==========================================================
+	global attribute, attribute group and element declarations 
+	============================================================  -->
+	<attribute name="id" type="ID">
+		<annotation>
+			<documentation>Database handle for the object.  It is of XML type ID, so is constrained to be unique in the XML document within which it occurs.  An external identifier for the object in the form of a URI may be constructed using standard XML and XPointer methods.  This is done by concatenating the URI for the document, a fragment separator, and the value of the id attribute.</documentation>
+		</annotation>
+	</attribute>
+	<!-- =========================================================== -->
+	<attribute name="remoteSchema" type="anyURI">
+		<annotation>
+			<documentation>Reference to an XML Schema fragment that specifies the content model of the propertys value. This is in conformance with the XML Schema Section 4.14 Referencing Schemas from Elsewhere.</documentation>
+		</annotation>
+	</attribute>
+	<!-- =========================================================== -->
+	<attributeGroup name="AssociationAttributeGroup">
+		<annotation>
+			<documentation>Attribute group used to enable property elements to refer to their value remotely. It contains the simple link components from xlinks.xsd, with all members optional, and the remoteSchema attribute, which is also optional.  These attributes can be attached to any element, thus allowing it to act as a pointer. The 'remoteSchema' attribute allows an element  that carries link attributes to indicate that the element is declared  in a remote schema rather than by the schema  [...]
+		</annotation>
+		<attributeGroup ref="xlink:simpleAttrs"/>
+		<attribute ref="gml:remoteSchema" use="optional"/>
+	</attributeGroup>
+	<!-- =========================================================== -->
+	<element name="name" type="gml:CodeType">
+		<annotation>
+			<documentation>Label for the object, normally a descriptive name. An object may have several names, typically assigned by different authorities.  The authority for a name is indicated by the value of its (optional) codeSpace attribute.  The name may or may not be unique, as determined by the rules of the organization responsible for the codeSpace.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="description" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Contains a simple text description of the object, or refers to an external description.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================================== -->
+	<complexType name="StringOrRefType">
+		<annotation>
+			<documentation>This type is available wherever there is a need for a "text" type property. It is of string type, so the text can be included inline, but the value can also be referenced remotely via xlinks from the AssociationAttributeGroup. If the remote reference is present, then the value obtained by traversing the link should be used, and the string content of the element can be used for an annotation.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attributeGroup ref="gml:AssociationAttributeGroup"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ===================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/grids.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/grids.xsd
new file mode 100644
index 0000000..b4e5f35
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/grids.xsd
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:grids:3.1.1">grids.xsd</appinfo>
+		<documentation xml:lang="en">Grid geometries
+    A subset of implicit geometries
+    Designed for use with GML Coverage schema, but maybe useful elsewhere as well.
+    
+    GML is an OGC Standard.
+    Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<!-- ==============================================================
+       global elements
+	============================================================== -->
+	<element name="_ImplicitGeometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:_Geometry"/>
+	<!-- =========================================================== -->
+	<element name="Grid" type="gml:GridType" substitutionGroup="gml:_ImplicitGeometry"/>
+	<!-- =========================================================== -->
+	<complexType name="GridType">
+		<annotation>
+			<documentation>An unrectified grid, which is a network composed of two or more sets of equally spaced parallel lines in which the members of each set intersect the members of the other sets at right angles.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGeometryType">
+				<sequence>
+					<element name="limits" type="gml:GridLimitsType"/>
+					<element name="axisName" type="string" maxOccurs="unbounded"/>
+				</sequence>
+				<attribute name="dimension" type="positiveInteger" use="required"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="GridLimitsType">
+		<sequence>
+			<element name="GridEnvelope" type="gml:GridEnvelopeType"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="GridEnvelopeType">
+		<annotation>
+			<documentation>Provides grid coordinate values for the diametrically opposed corners of an envelope that bounds a section of grid. The value of a single coordinate is the number of offsets from the origin of the grid in the direction of a specific axis.</documentation>
+		</annotation>
+		<sequence>
+			<element name="low" type="gml:integerList"/>
+			<element name="high" type="gml:integerList"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="RectifiedGrid" type="gml:RectifiedGridType" substitutionGroup="gml:_ImplicitGeometry">
+		<annotation>
+			<documentation>Should be substitutionGroup="gml:Grid" but changed in order to accomplish Xerces-J schema validation</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="RectifiedGridType">
+		<annotation>
+			<documentation>A rectified grid has an origin and vectors that define its post locations.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:GridType">
+				<sequence>
+					<element name="origin" type="gml:PointPropertyType"/>
+					<element name="offsetVector" type="gml:VectorType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/measures.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/measures.xsd
new file mode 100644
index 0000000..33170fa
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/measures.xsd
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.1.1 2010-01-28" xml:lang="en" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-measures:3.1.1"/>
+		<documentation>Extends the units.xsd and basicTypes.xsd schemas with types for recording measures using specific types of units, especially the measures and units needed for coordinate reference systems and coordinate operations. The specific unit types encoded are length, angle, scale factor, time, area, volume, speed, and grid length. This schema allows angle values to be recorded as single numbers or in degree-minute-second format. 
+		Parts of this schema are based on Subclause 6.5.7 of ISO/CD 19103 Geographic information - Conceptual schema language, on Subclause A.5.2.2.3 of ISO/CD 19118 Geographic information - Encoding, and on Subclause 4.7 of OpenGIS Recommendation Paper OGC 02-007r4 Units of Measure Use and Definition Recommendations.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="units.xsd"/>
+	<!-- ==============================================================
+       elements and types
+	============================================================== -->
+	<!-- This schema uses the gml:MeasureType defined in basicTypes.xsd with the modified meaning:
+			<documentation>Value of a quantity, with its units. This element uses the XML Schema primitive data type "double" because it supports both decimal and scientific notation, and thus offers flexibility and precision. However, there is no requirement to store values using any particular format, and applications receiving elements of this type may choose to coerce the data to any other type as convenient. The XML attribute uom references the units or scale by which the amount should be mu [...]
+	<!-- =========================================================== -->
+	<element name="measure" type="gml:MeasureType"/>
+	<!-- =========================================================== -->
+	<complexType name="LengthType">
+		<annotation>
+			<documentation>Value of a length (or distance) quantity, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a length, such as metres or feet.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="ScaleType">
+		<annotation>
+			<documentation>Value of a scale factor (or ratio) that has no physical unit. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a scale factor, such as percent, permil, or parts-per-million.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="TimeType">
+		<annotation>
+			<documentation>Value of a time or temporal quantity, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a time value, such as seconds or weeks.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="GridLengthType">
+		<annotation>
+			<documentation>Value of a length (or distance) quantity in a grid, where the grid spacing does not have any associated physical units, or does not have a constant physical spacing. This grid length will often be used in a digital image grid, where the base units are likely to be pixel spacings. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for length along the axes of a grid, such as pixel spacings or grid spacings.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="AreaType">
+		<annotation>
+			<documentation>Value of a spatial area quantity, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for an area, such as square metres or square miles.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="VolumeType">
+		<annotation>
+			<documentation>Value of a spatial volume quantity, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a volume, such as cubic metres or cubic feet.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="SpeedType">
+		<annotation>
+			<documentation>Value of a speed, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for a velocity, such as metres per second or miles per hour.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="AngleChoiceType">
+		<annotation>
+			<documentation>Value of an angle quantity provided in either degree-minute-second format or single value format.</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:angle"/>
+			<element ref="gml:dmsAngle"/>
+		</choice>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="angle" type="gml:MeasureType"/>
+	<!-- =========================================================== -->
+	<complexType name="AngleType">
+		<annotation>
+			<documentation>Value of an angle quantity recorded as a single number, with its units. Uses the MeasureType with the restriction that the unit of measure referenced by uom must be suitable for an angle, such as degrees or radians.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureType"/>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="dmsAngle" type="gml:DMSAngleType"/>
+	<!-- =========================================================== -->
+	<complexType name="DMSAngleType">
+		<annotation>
+			<documentation>Angle value provided in degree-minute-second or degree-minute format.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:degrees"/>
+			<choice minOccurs="0">
+				<element ref="gml:decimalMinutes"/>
+				<sequence>
+					<element ref="gml:minutes"/>
+					<element ref="gml:seconds" minOccurs="0"/>
+				</sequence>
+			</choice>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="degrees" type="gml:DegreesType"/>
+	<!-- =========================================================== -->
+	<complexType name="DegreesType">
+		<annotation>
+			<documentation>Integer number of degrees, plus the angle direction. This element can be used for geographic Latitude and Longitude. For Latitude, the XML attribute direction can take the values "N" or "S", meaning North or South of the equator. For Longitude, direction can take the values "E" or "W", meaning East or West of the prime meridian. This element can also be used for other angles. In that case, the direction can take the values "+" or "-" (of SignType), in the specified rota [...]
+		</annotation>
+		<simpleContent>
+			<extension base="gml:DegreeValueType">
+				<attribute name="direction">
+					<simpleType>
+						<union>
+							<simpleType>
+								<restriction base="string">
+									<enumeration value="N"/>
+									<enumeration value="E"/>
+									<enumeration value="S"/>
+									<enumeration value="W"/>
+								</restriction>
+							</simpleType>
+							<simpleType>
+								<restriction base="gml:SignType"/>
+							</simpleType>
+						</union>
+					</simpleType>
+				</attribute>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="DegreeValueType">
+		<annotation>
+			<documentation>Integer number of degrees in a degree-minute-second or degree-minute angular value, without indication of direction.</documentation>
+		</annotation>
+		<restriction base="nonNegativeInteger">
+			<maxInclusive value="359"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="decimalMinutes" type="gml:DecimalMinutesType"/>
+	<!-- =========================================================== -->
+	<simpleType name="DecimalMinutesType">
+		<annotation>
+			<documentation>Decimal number of arc-minutes in a degree-minute angular value.</documentation>
+		</annotation>
+		<restriction base="decimal">
+			<minInclusive value="0.00"/>
+			<maxExclusive value="60.00"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="minutes" type="gml:ArcMinutesType"/>
+	<!-- =========================================================== -->
+	<simpleType name="ArcMinutesType">
+		<annotation>
+			<documentation>Integer number of arc-minutes in a degree-minute-second angular value.</documentation>
+		</annotation>
+		<restriction base="nonNegativeInteger">
+			<maxInclusive value="59"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="seconds" type="gml:ArcSecondsType"/>
+	<!-- =========================================================== -->
+	<simpleType name="ArcSecondsType">
+		<annotation>
+			<documentation>Number of arc-seconds in a degree-minute-second angular value.</documentation>
+		</annotation>
+		<restriction base="decimal">
+			<minInclusive value="0.00"/>
+			<maxExclusive value="60.00"/>
+		</restriction>
+	</simpleType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/observation.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/observation.xsd
new file mode 100644
index 0000000..15a1e3c
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/observation.xsd
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:observation:3.1.1">observation.xsd</appinfo>
+		<documentation>Observation schema for GML 3.1
+			
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- =================================================================== -->
+	<!-- ===       includes and imports ============================================ -->
+	<include schemaLocation="feature.xsd"/>
+	<include schemaLocation="direction.xsd"/>
+	<include schemaLocation="valueObjects.xsd"/>
+	<!-- =================================================================== -->
+	<!-- =================== properties =================================== -->
+	<element name="using" type="gml:FeaturePropertyType">
+		<annotation>
+			<documentation>This element contains or points to a description of a sensor, instrument or procedure used for the observation</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================================== -->
+	<element name="target" type="gml:TargetPropertyType">
+		<annotation>
+			<documentation>This element contains or points to the specimen, region or station which is the object of the observation</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================================== -->
+	<element name="subject" type="gml:TargetPropertyType" substitutionGroup="gml:target">
+		<annotation>
+			<documentation>Synonym for target - common word used for photographs</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================================== -->
+	<complexType name="TargetPropertyType">
+		<annotation>
+			<documentation>Container for an object representing the target or subject of an observation.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:_Feature"/>
+				<element ref="gml:_Geometry"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================================== -->
+	<element name="resultOf" type="gml:AssociationType">
+		<annotation>
+			<documentation>The result of the observation: an image, external object, etc</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================================== -->
+	<!-- ===================== Features =========================== -->
+	<element name="Observation" type="gml:ObservationType" substitutionGroup="gml:_Feature"/>
+	<!-- =========================================================== -->
+	<complexType name="ObservationType">
+		<complexContent>
+			<extension base="gml:AbstractFeatureType">
+				<sequence>
+					<element ref="gml:validTime"/>
+					<element ref="gml:using" minOccurs="0"/>
+					<element ref="gml:target" minOccurs="0"/>
+					<element ref="gml:resultOf"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="DirectedObservation" type="gml:DirectedObservationType" substitutionGroup="gml:Observation"/>
+	<!-- =========================================================== -->
+	<complexType name="DirectedObservationType">
+		<complexContent>
+			<extension base="gml:ObservationType">
+				<sequence>
+					<element ref="gml:direction"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="DirectedObservationAtDistance" type="gml:DirectedObservationAtDistanceType" substitutionGroup="gml:DirectedObservation"/>
+	<!-- =========================================================== -->
+	<complexType name="DirectedObservationAtDistanceType">
+		<complexContent>
+			<extension base="gml:DirectedObservationType">
+				<sequence>
+					<element name="distance" type="gml:MeasureType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/referenceSystems.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/referenceSystems.xsd
new file mode 100644
index 0000000..23d9a6e
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/referenceSystems.xsd
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:referenceSystems:3.1.1"/>
+		<documentation>How to encode reference system definitions. Builds on several other parts of GML 3 to encode the data needed to define reference systems.
+		This schema encodes the Reference System (RS_) package of the extended UML Model for OGC Abstract Specification Topic 2: Spatial Referencing by Coordinates. That UML model is adapted from ISO 19111 - Spatial referencing by coordinates, as described in Annex C of Topic 2. The SC_CRS class is also encoded here, to eliminate the (circular) references from coordinateOperations.xsd to coordinateReferenceSystems.xsd. The RS_SpatialReferenceSystemUsingGeographicIdentifier class is not encoded [...]
+		Caution: The CRS package in GML 3.1 and GML 3.1.1 is preliminary, and is expected to undergo some modifications that are not backward compatible during the development of GML 3.2 (ISO 19136). The GML 3.2 package will implement the model described in the revised version of ISO 19111.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ======================================================
+       includes and imports
+	====================================================== -->
+	<include schemaLocation="geometryBasic2d.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<!-- ======================================================
+       elements and types
+	====================================================== -->
+	<element name="_ReferenceSystem" type="gml:AbstractReferenceSystemType" abstract="true" substitutionGroup="gml:Definition"/>
+	<!-- =================================================== -->
+	<complexType name="AbstractReferenceSystemBaseType" abstract="true">
+		<annotation>
+			<documentation>Basic encoding for reference system objects, simplifying and restricting the DefinitionType as needed.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:metaDataProperty" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:srsName"/>
+				</sequence>
+				<attribute ref="gml:id" use="required"/>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="srsName" type="gml:CodeType" substitutionGroup="gml:name">
+		<annotation>
+			<documentation>The name by which this reference system is identified.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="AbstractReferenceSystemType" abstract="true">
+		<annotation>
+			<documentation>Description of a spatial and/or temporal reference system used by a dataset.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractReferenceSystemBaseType">
+				<sequence>
+					<element ref="gml:srsID" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Set of alterative identifications of this reference system. The first srsID, if any, is normally the primary identification code, and any others are aliases.</documentation>
+						</annotation>
+					</element>
+					<element ref="gml:remarks" minOccurs="0">
+						<annotation>
+							<documentation>Comments on or information about this reference system, including source information.</documentation>
+						</annotation>
+					</element>
+					<element ref="gml:validArea" minOccurs="0"/>
+					<element ref="gml:scope" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="srsID" type="gml:IdentifierType">
+		<annotation>
+			<documentation>An identification of a reference system.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="referenceSystemRef" type="gml:ReferenceSystemRefType"/>
+	<!-- =================================================== -->
+	<complexType name="ReferenceSystemRefType">
+		<annotation>
+			<documentation>Association to a reference system, either referencing or containing the definition of that reference system.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_ReferenceSystem"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="_CRS" type="gml:AbstractReferenceSystemType" abstract="true" substitutionGroup="gml:_ReferenceSystem">
+		<annotation>
+			<documentation>Abstract coordinate reference system, usually defined by a coordinate system and a datum. This abstract complexType shall not be used, extended, or restricted, in an Application Schema, to define a concrete subtype with a meaning equivalent to a concrete subtype specified in this document.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="crsRef" type="gml:CRSRefType"/>
+	<!-- =================================================== -->
+	<complexType name="CRSRefType">
+		<annotation>
+			<documentation>Association to a CRS abstract coordinate reference system, either referencing or containing the definition of that CRS.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_CRS"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =================================================== -->
+	<!-- =================================================== -->
+	<complexType name="IdentifierType">
+		<annotation>
+			<documentation>An identification of a CRS object. The first use of the IdentifierType for an object, if any, is normally the primary identification code, and any others are aliases.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:name">
+				<annotation>
+					<documentation>The code or name for this Identifier, often from a controlled list or pattern defined by a code space. The optional codeSpace attribute is normally included to identify or reference a code space within which one or more codes are defined. This code space is often defined by some authority organization, where one organization may define multiple code spaces. The range and format of each Code Space identifier is defined by that code space authority. Information about th [...]
+				</annotation>
+			</element>
+			<element ref="gml:version" minOccurs="0"/>
+			<element ref="gml:remarks" minOccurs="0">
+				<annotation>
+					<documentation>Remarks about this code or alias.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="version" type="string">
+		<annotation>
+			<documentation>Identifier of the version of the associated codeSpace or code, as specified by the codeSpace or code authority. This version is included only when the "code" or "codeSpace" uses versions. When appropriate, the version is identified by the effective date, coded using ISO 8601 date format.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="remarks" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Information about this object or code. Contains text or refers to external text.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="scope" type="string">
+		<annotation>
+			<documentation>Description of domain of usage, or limitations of usage, for which this CRS object is valid.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="validArea" type="gml:ExtentType">
+		<annotation>
+			<documentation>Area or region in which this CRS object is valid.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<complexType name="ExtentType">
+		<annotation>
+			<documentation>Information about the spatial, vertical, and/or temporal extent of a reference system object. Constraints: At least one of the elements "description", "boundingBox", "boundingPolygon", "verticalExtent", and temporalExtent" must be included, but more that one can be included when appropriate. Furthermore, more than one "boundingBox", "boundingPolygon", "verticalExtent", and/or temporalExtent" element can be included, with more than one meaning the union of the individual [...]
+		</annotation>
+		<sequence>
+			<element ref="gml:description" minOccurs="0">
+				<annotation>
+					<documentation>Description of spatial and/or temporal extent of this object.</documentation>
+				</annotation>
+			</element>
+			<choice>
+				<annotation>
+					<documentation>Geographic domain of this reference system object.</documentation>
+				</annotation>
+				<element ref="gml:boundingBox" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Unordered list of bounding boxes (or envelopes) whose union describes the spatial domain of this object.</documentation>
+					</annotation>
+				</element>
+				<element ref="gml:boundingPolygon" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Unordered list of bounding polygons whose union describes the spatial domain of this object.</documentation>
+					</annotation>
+				</element>
+			</choice>
+			<element ref="gml:verticalExtent" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Unordered list of vertical intervals whose union describes the spatial domain of this object.</documentation>
+				</annotation>
+			</element>
+			<element ref="gml:temporalExtent" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Unordered list of time periods whose union describes the spatial domain of this object.</documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =================================================== -->
+	<element name="boundingBox" type="gml:EnvelopeType">
+		<annotation>
+			<documentation>A bounding box (or envelope) defining the spatial domain of this object.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="boundingPolygon" type="gml:PolygonType">
+		<annotation>
+			<documentation>A bounding polygon defining the horizontal spatial domain of this object.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="verticalExtent" type="gml:EnvelopeType">
+		<annotation>
+			<documentation>An interval defining the vertical spatial domain of this object.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+	<element name="temporalExtent" type="gml:TimePeriodType">
+		<annotation>
+			<documentation>A time period defining the temporal domain of this object.</documentation>
+		</annotation>
+	</element>
+	<!-- =================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/temporal.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/temporal.xsd
new file mode 100644
index 0000000..bb9e183
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/temporal.xsd
@@ -0,0 +1,332 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:temporal:3.1.1"/>
+		<documentation xml:lang="en">The temporal schema for GML 3.1 provides constructs for handling time-varying spatial data. 
+    This schema reflects a partial implementation of the model described in ISO 19108:2002.
+    
+    GML is an OGC Standard.
+    Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ================================================================== -->
+	<include schemaLocation="gmlBase.xsd"/>
+	<!-- ================================================================== -->
+	<!-- ==== Time Object ===== -->
+	<!-- ================================================================== -->
+	<element name="_TimeObject" type="gml:AbstractTimeObjectType" abstract="true" substitutionGroup="gml:_GML">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal primitives and complexes.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimeObjectType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The abstract supertype for temporal objects.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType"/>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Primitive ===== -->
+	<!-- ================================================================== -->
+	<element name="_TimePrimitive" type="gml:AbstractTimePrimitiveType" abstract="true" substitutionGroup="gml:_TimeObject">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal primitives.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimePrimitiveType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The abstract supertype for temporal primitives.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeObjectType">
+				<sequence>
+					<element name="relatedTime" type="gml:RelatedTimeType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimePrimitivePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:_TimePrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="RelatedTimeType">
+		<complexContent>
+			<extension base="gml:TimePrimitivePropertyType">
+				<attribute name="relativePosition">
+					<simpleType>
+						<restriction base="string">
+							<enumeration value="Before"/>
+							<enumeration value="After"/>
+							<enumeration value="Begins"/>
+							<enumeration value="Ends"/>
+							<enumeration value="During"/>
+							<enumeration value="Equals"/>
+							<enumeration value="Contains"/>
+							<enumeration value="Overlaps"/>
+							<enumeration value="Meets"/>
+							<enumeration value="OverlappedBy"/>
+							<enumeration value="MetBy"/>
+							<enumeration value="BegunBy"/>
+							<enumeration value="EndedBy"/>
+						</restriction>
+					</simpleType>
+				</attribute>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Complex ===== -->
+	<!-- ================================================================== -->
+	<element name="_TimeComplex" type="gml:AbstractTimeComplexType" abstract="true" substitutionGroup="gml:_TimeObject">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal complexes. 
+			Temporal complex is an aggregation of temporal primitives as its components, 
+			represents a temporal geometric complex and a temporal topology complex. 
+			N.B. Temporal geometric complex is not defined in this schema.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="AbstractTimeComplexType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The abstract supertype for temporal complexes.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeObjectType"/>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Geometric Primitive ===== -->
+	<!-- ================================================================== -->
+	<element name="_TimeGeometricPrimitive" type="gml:AbstractTimeGeometricPrimitiveType" abstract="true" substitutionGroup="gml:_TimePrimitive">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal geometric primitives.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimeGeometricPrimitiveType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The abstract supertype for temporal geometric primitives.
+       A temporal geometry must be associated with a temporal reference system via URI. 
+       The Gregorian calendar with UTC is the default reference system, following ISO 
+       8601. Other reference systems in common use include the GPS calendar and the 
+       Julian calendar.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimePrimitiveType">
+				<attribute name="frame" type="anyURI" use="optional" default="#ISO-8601"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeGeometricPrimitivePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:_TimeGeometricPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Instant ===== -->
+	<!-- ================================================================== -->
+	<element name="TimeInstant" type="gml:TimeInstantType" substitutionGroup="gml:_TimeGeometricPrimitive"/>
+	<!-- ===================================== -->
+	<complexType name="TimeInstantType">
+		<annotation>
+			<documentation>Omit back-pointers begunBy, endedBy.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeGeometricPrimitiveType">
+				<sequence>
+					<element ref="gml:timePosition"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeInstantPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeInstant"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Period ===== -->
+	<!-- ================================================================== -->
+	<element name="TimePeriod" type="gml:TimePeriodType" substitutionGroup="gml:_TimeGeometricPrimitive"/>
+	<!-- ===================================== -->
+	<complexType name="TimePeriodType">
+		<complexContent>
+			<extension base="gml:AbstractTimeGeometricPrimitiveType">
+				<sequence>
+					<choice>
+						<element name="beginPosition" type="gml:TimePositionType"/>
+						<element name="begin" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<choice>
+						<element name="endPosition" type="gml:TimePositionType"/>
+						<element name="end" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<group ref="gml:timeLength" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimePeriodPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimePeriod"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ==== duration & interval ===== -->
+	<!-- ================================================================== -->
+	<group name="timeLength">
+		<annotation>
+			<documentation>This model group is provided as an alternative to the abstract susbstitutionGroup head _timeLength.
+		ISO 19136 comment 411</documentation>
+		</annotation>
+		<choice>
+			<element ref="gml:duration"/>
+			<element ref="gml:timeInterval"/>
+		</choice>
+	</group>
+	<!-- ================================================================== -->
+	<element name="duration" type="duration">
+		<annotation>
+			<documentation xml:lang="en">This element is an instance of the primitive xsd:duration simple type to 
+      enable use of the ISO 8601 syntax for temporal length (e.g. P5DT4H30M). 
+      It is a valid subtype of TimeDurationType according to section 3.14.6, 
+      rule 2.2.4 in XML Schema, Part 1.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<element name="timeInterval" type="gml:TimeIntervalLengthType">
+		<annotation>
+			<documentation>This element is a valid subtype of TimeDurationType 
+			according to section 3.14.6, rule 2.2.4 in XML Schema, Part 1.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="TimeIntervalLengthType" final="#all">
+		<annotation>
+			<documentation xml:lang="en">This type extends the built-in xsd:decimal simple type to allow floating-point 
+      values for temporal length. According to  the ISO 11404 model you have to use 
+      positiveInteger together with appropriate values for radix and factor. The 
+      resolution of the time interval is to one radix ^(-factor) of the specified 
+      time unit (e.g. unit="second", radix="10", factor="3" specifies a resolution 
+      of milliseconds). It is a subtype of TimeDurationType.</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="decimal">
+				<attribute name="unit" type="gml:TimeUnitType" use="required"/>
+				<attribute name="radix" type="positiveInteger" use="optional"/>
+				<attribute name="factor" type="integer" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<simpleType name="TimeUnitType">
+		<annotation>
+			<documentation xml:lang="en">Standard units for measuring time intervals (see ISO 31-1).</documentation>
+		</annotation>
+		<union>
+			<simpleType>
+				<restriction base="string">
+					<enumeration value="year"/>
+					<enumeration value="day"/>
+					<enumeration value="hour"/>
+					<enumeration value="minute"/>
+					<enumeration value="second"/>
+				</restriction>
+			</simpleType>
+			<simpleType>
+				<restriction base="string">
+					<pattern value="other:\w{2,}"/>
+				</restriction>
+			</simpleType>
+		</union>
+	</simpleType>
+	<!-- ================================================================== -->
+	<!-- ==== Time Position ===== -->
+	<!-- ================================================================== -->
+	<element name="timePosition" type="gml:TimePositionType">
+		<annotation>
+			<documentation>Direct representation of a temporal position</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="TimePositionType" final="#all">
+		<annotation>
+			<documentation xml:lang="en">Direct representation of a temporal position. 
+      Indeterminate time values are also allowed, as described in ISO 19108. The indeterminatePosition 
+      attribute can be used alone or it can qualify a specific value for temporal position (e.g. before 
+      2002-12, after 1019624400). 
+      For time values that identify position within a calendar, the calendarEraName attribute provides 
+      the name of the calendar era to which the date is referenced (e.g. the Meiji era of the Japanese calendar).</documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="gml:TimePositionUnion">
+				<attribute name="frame" type="anyURI" use="optional" default="#ISO-8601"/>
+				<attribute name="calendarEraName" type="string" use="optional"/>
+				<attribute name="indeterminatePosition" type="gml:TimeIndeterminateValueType" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<simpleType name="TimePositionUnion">
+		<annotation>
+			<documentation xml:lang="en">The ISO 19108:2002 hierarchy of subtypes for temporal position are collapsed 
+      by defining a union of XML Schema simple types for indicating temporal position relative 
+      to a specific reference system. 
+      
+      Dates and dateTime may be indicated with varying degrees of precision.  
+      dateTime by itself does not allow right-truncation, except for fractions of seconds. 
+      When used with non-Gregorian calendars based on years, months, days, 
+      the same lexical representation should still be used, with leading zeros added if the 
+      year value would otherwise have fewer than four digits.  
+      
+      An ordinal position may be referenced via URI identifying the definition of an ordinal era.  
+      
+      A time coordinate value is indicated as a decimal (e.g. UNIX time, GPS calendar).</documentation>
+		</annotation>
+		<union memberTypes="gml:CalDate time dateTime anyURI decimal"/>
+	</simpleType>
+	<!-- ================================================================== -->
+	<simpleType name="CalDate">
+		<annotation>
+			<documentation xml:lang="en">Calendar dates may be indicated with varying degrees of precision, 
+      using year, year-month, date. 
+      When used with non-Gregorian calendars based on years, months, days, 
+      the same lexical representation should still be used, with leading zeros added if the 
+      year value would otherwise have fewer than four digits.  
+      time is used for a position that recurs daily (see clause 5.4.4.2 of ISO 19108:2002).</documentation>
+		</annotation>
+		<union memberTypes="date gYearMonth gYear"/>
+	</simpleType>
+	<!-- ================================================================== -->
+	<simpleType name="TimeIndeterminateValueType">
+		<annotation>
+			<documentation xml:lang="en">This enumerated data type specifies values for indeterminate positions.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="after"/>
+			<enumeration value="before"/>
+			<enumeration value="now"/>
+			<enumeration value="unknown"/>
+		</restriction>
+	</simpleType>
+	<!-- ================================================================== -->
+	<!-- ==== Convenience properties ==== -->
+	<!-- ================================================================== -->
+	<element name="validTime" type="gml:TimePrimitivePropertyType"/>
+	<!-- ===================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/temporalReferenceSystems.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/temporalReferenceSystems.xsd
new file mode 100644
index 0000000..6017698
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/temporalReferenceSystems.xsd
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:temporalReferenceSystems:3.1.1"/>
+		<documentation xml:lang="en">The Temporal Reference Systems schema for GML 3.1 provides constructs for handling various styles of temporal reference system. 
+    This schema reflects a partial implementation of the model described in ISO 19108:2002.
+    
+    GML is an OGC Standard.
+    Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ================================================================== -->
+	<include schemaLocation="temporalTopology.xsd"/>
+	<include schemaLocation="dictionary.xsd"/>
+	<!-- ================================================================== -->
+	<!-- == Time Reference System == -->
+	<!-- ================================================================== -->
+	<element name="_TimeReferenceSystem" type="gml:AbstractTimeReferenceSystemType" abstract="true" substitutionGroup="gml:Definition">
+		<annotation>
+			<documentation>Abstract element serves primarily as the head of a substitution group for temporal reference systems.</documentation>
+		</annotation>
+	</element>
+	<!-- ===================================== -->
+	<complexType name="AbstractTimeReferenceSystemType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">A value in the time domain is measured relative to a temporal reference system. Common 
+        types of reference systems include calendars, ordinal temporal reference systems, and 
+        temporal coordinate systems (time elapsed since some epoch, e.g. UNIX time).</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="domainOfValidity" type="string" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- == Time Coordinate System == -->
+	<!-- ================================================================== -->
+	<element name="TimeCoordinateSystem" type="gml:TimeCoordinateSystemType" substitutionGroup="gml:_TimeReferenceSystem"/>
+	<!-- ===================================== -->
+	<complexType name="TimeCoordinateSystemType">
+		<annotation>
+			<documentation xml:lang="en">A temporal coordinate system is based on a continuous interval scale defined in terms of a single time interval.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeReferenceSystemType">
+				<sequence>
+					<choice>
+						<element name="originPosition" type="gml:TimePositionType"/>
+						<element name="origin" type="gml:TimeInstantPropertyType"/>
+					</choice>
+					<element name="interval" type="gml:TimeIntervalLengthType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- == Time Ordinal System == -->
+	<!-- ================================================================== -->
+	<element name="TimeOrdinalReferenceSystem" type="gml:TimeOrdinalReferenceSystemType" substitutionGroup="gml:_TimeReferenceSystem"/>
+	<!-- ===================================== -->
+	<complexType name="TimeOrdinalReferenceSystemType">
+		<annotation>
+			<documentation xml:lang="en">In an ordinal reference system the order of events in time can be well 
+      established, but the magnitude of the intervals between them can not be 
+      accurately determined (e.g. a stratigraphic sequence).</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeReferenceSystemType">
+				<sequence>
+					<element name="component" type="gml:TimeOrdinalEraPropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="TimeOrdinalEra" type="gml:TimeOrdinalEraType"/>
+	<!-- ===================================== -->
+	<complexType name="TimeOrdinalEraType">
+		<annotation>
+			<documentation xml:lang="en">Ordinal temporal reference systems are often hierarchically structured 
+      such that an ordinal era at a given level of the hierarchy includes a 
+      sequence of shorter, coterminous ordinal eras. This captured using the member/group properties.  
+      
+      Note that in this schema, TIme Ordinal Era is patterned on TimeEdge, which is a variation from ISO 19108.  
+      This is in order to fulfill the requirements of ordinal reference systems based on eras delimited by 
+      named points or nodes, which are common in geology, archeology, etc.  
+      
+      This change is subject of a change proposal to ISO</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="relatedTime" type="gml:RelatedTimeType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="start" type="gml:TimeNodePropertyType"/>
+					<element name="end" type="gml:TimeNodePropertyType"/>
+					<element name="extent" type="gml:TimePeriodPropertyType" minOccurs="0"/>
+					<element name="member" type="gml:TimeOrdinalEraPropertyType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>An Era may be composed of several member Eras. The "member" element implements the association to the Era at the next level down the hierarchy.  "member" follows the standard GML property pattern whereby its (complex) value may be either described fully inline, or may be the target of a link carried on the member element and described fully elsewhere, either in the same document or from another service.</documentation>
+						</annotation>
+					</element>
+					<element name="group" type="gml:ReferenceType" minOccurs="0">
+						<annotation>
+							<documentation>In a particular Time System, an Era may be a member of a group.  The "group" element implements the back-pointer to the Era at the next level up in the hierarchy. 
+
+If the hierarchy is represented by describing the nested components fully in the their nested position inside "member" elements, then the parent can be easily inferred, so the group property is unnecessary.  
+
+However, if the hierarchy is represented by links carried on the "member" property elements, pointing to Eras described fully elsewhere, then it may be useful for a child (member) era to carry an explicit pointer back to its parent (group) Era.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeOrdinalEraPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeOrdinalEra"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- == Calendar == -->
+	<!-- ================================================================== -->
+	<element name="TimeCalendar" type="gml:TimeCalendarType" substitutionGroup="gml:_TimeReferenceSystem"/>
+	<!-- ===================================== -->
+	<complexType name="TimeCalendarType">
+		<annotation>
+			<documentation xml:lang="en">A calendar is a discrete temporal reference system 
+      that provides a basis for defining temporal position to a resolution of one day. 
+      A single calendar may reference more than one calendar era.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeReferenceSystemType">
+				<sequence>
+					<element name="referenceFrame" type="gml:TimeCalendarEraPropertyType" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Link to the CalendarEras that it uses as a reference for dating.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeCalendarPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCalendar"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<element name="TimeCalendarEra" type="gml:TimeCalendarEraType" substitutionGroup="gml:Definition"/>
+	<!-- ===================================== -->
+	<complexType name="TimeCalendarEraType">
+		<annotation>
+			<documentation xml:lang="en">In every calendar, years are numbered relative to the date of a 
+      reference event that defines a calendar era. 
+      In this implementation, we omit the back-pointer "datingSystem".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element name="referenceEvent" type="gml:StringOrRefType">
+						<annotation>
+							<documentation>Name or description of a mythical or historic event which fixes the position of the base scale of the calendar era.</documentation>
+						</annotation>
+					</element>
+					<element name="referenceDate" type="date" default="0001-01-01" minOccurs="0">
+						<annotation>
+							<documentation>Date of the referenceEvent expressed as a date in the given calendar. 
+              In most calendars, this date is the origin (i.e., the first day) of the scale, but this is not always true.</documentation>
+						</annotation>
+					</element>
+					<element name="julianReference" type="decimal">
+						<annotation>
+							<documentation>Julian date that corresponds to the reference date.  
+              The Julian day numbering system is a temporal coordinate system that has an 
+              origin earlier than any known calendar, 
+              at noon on 1 January 4713 BC in the Julian proleptic calendar.  
+              The Julian day number is an integer value; 
+              the Julian date is a decimal value that allows greater resolution. 
+              Transforming calendar dates to and from Julian dates provides a 
+              relatively simple basis for transforming dates from one calendar to another.</documentation>
+						</annotation>
+					</element>
+					<element name="epochOfUse" type="gml:TimePeriodPropertyType">
+						<annotation>
+							<documentation>Period for which the calendar era was used as a basis for dating.</documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeCalendarEraPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeCalendarEra"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- == Clock == -->
+	<!-- ================================================================== -->
+	<element name="TimeClock" type="gml:TimeClockType" substitutionGroup="gml:_TimeReferenceSystem"/>
+	<!-- ===================================== -->
+	<complexType name="TimeClockType" final="#all">
+		<annotation>
+			<documentation xml:lang="en">A clock provides a basis for defining temporal position within a day. 
+      A clock must be used with a calendar in order to provide a complete description of a temporal position 
+      within a specific day.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeReferenceSystemType">
+				<sequence>
+					<element name="referenceEvent" type="gml:StringOrRefType">
+						<annotation>
+							<documentation>Name or description of an event, such as solar noon or sunrise, 
+              which fixes the position of the base scale of the clock.</documentation>
+						</annotation>
+					</element>
+					<element name="referenceTime" type="time">
+						<annotation>
+							<documentation>time of day associated with the reference event expressed as 
+              a time of day in the given clock. The reference time is usually the origin of the clock scale.</documentation>
+						</annotation>
+					</element>
+					<element name="utcReference" type="time">
+						<annotation>
+							<documentation>24 hour local or UTC time that corresponds to the reference time.</documentation>
+						</annotation>
+					</element>
+					<element name="dateBasis" type="gml:TimeCalendarPropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeClockPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TimeClock"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/temporalTopology.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/temporalTopology.xsd
new file mode 100644
index 0000000..de4a356
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/temporalTopology.xsd
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:temporalTopology:3.1.1"/>
+		<documentation xml:lang="en">The temporal topology schema for ISO19136 provides constructs for handling topological complexes and 
+		temporal feature relationships. 
+		Temporal geometric characteristics of features are represented as instants and periods. 
+		While, temporal context of features that does not relate to the position of time is described as connectivity relationships 
+		among instants and periods. These relationships are called temporal topology as they do not change in time, 
+		as long as the direction of time does not change. 
+		It is used effectively in the case of describing a family tree expressing evolution of species, an ecological cycle, 
+		a lineage of lands or buildings, or a history of separation and merger of administrative boundaries.
+		This schema reflects a partial yet consistent implementation of the model described in ISO 19108:2002.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ===================================== -->
+	<include schemaLocation="temporal.xsd"/>
+	<!-- ===================================== -->
+	<!-- ================================================================== -->
+	<!-- == TimeTopologyComplex == -->
+	<!-- ================================================================== -->
+	<element name="TimeTopologyComplex" type="gml:TimeTopologyComplexType" substitutionGroup="gml:_TimeComplex">
+		<annotation>
+			<documentation xml:lang="en">This element represents temporal topology complex. It shall be the connected acyclic directed graph composed of time nodes and time edges.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="TimeTopologyComplexType">
+		<annotation>
+			<documentation xml:lang="en">A temporal topology complex.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeComplexType">
+				<sequence>
+					<element name="primitive" type="gml:TimeTopologyPrimitivePropertyType" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeTopologyComplexPropertyType">
+		<annotation>
+			<documentation>A time topology complex property can either be any time topology complex element
+			 encapsulated in an element of this type or an XLink reference to a remote time topology complex element 
+			 (where remote includes elements located elsewhere in the same document). 
+			 Note that either the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeTopologyComplex"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!--  == TimeTopologyPrimitive == -->
+	<!-- ================================================================== -->
+	<element name="_TimeTopologyPrimitive" type="gml:AbstractTimeTopologyPrimitiveType" abstract="true" substitutionGroup="gml:_TimePrimitive">
+		<annotation>
+			<documentation xml:lang="en">This abstract element acts as the head of the substitution group for temporal topology primitives.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="AbstractTimeTopologyPrimitiveType" abstract="true">
+		<annotation>
+			<documentation xml:lang="en">The element "complex" carries a reference to the complex containing this primitive.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimePrimitiveType">
+				<sequence>
+					<element name="complex" type="gml:ReferenceType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeTopologyPrimitivePropertyType">
+		<annotation>
+			<documentation>A time topology primitive property can either hold any time topology complex element
+			 eor carry an XLink reference to a remote time topology complex element 
+			 (where remote includes elements located elsewhere in the same document). 
+			 Note that either the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:_TimeTopologyPrimitive"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!--  ======= TimeNode ======= -->
+	<!-- ================================================================== -->
+	<element name="TimeNode" type="gml:TimeNodeType" substitutionGroup="gml:_TimeTopologyPrimitive">
+		<annotation>
+			<documentation xml:lang="en">"TimeNode" is a zero dimensional temporal topology primitive, 
+			expresses a position in topological time, and is a start and an end of time edge, which represents states of time.
+			Time node may be isolated. However, it cannot describe the ordering relationships with other primitives. 
+			An isolated node may not be an element of any temporal topology complex.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="TimeNodeType">
+		<annotation>
+			<documentation xml:lang="en">Type declaration of the element "TimeNode".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeTopologyPrimitiveType">
+				<sequence>
+					<element name="previousEdge" type="gml:TimeEdgePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="nextEdge" type="gml:TimeEdgePropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<element name="position" type="gml:TimeInstantPropertyType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeNodePropertyType">
+		<annotation>
+			<documentation>A time node property can either be any time node element encapsulated in an element of this type 
+			or an XLink reference to a remote time node element (where remote includes elements located elsewhere in the same document). 
+			Note that either the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeNode"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!--  ======= TimeEdge ======= -->
+	<!-- ================================================================== -->
+	<element name="TimeEdge" type="gml:TimeEdgeType" substitutionGroup="gml:_TimeTopologyPrimitive">
+		<annotation>
+			<documentation xml:lang="en">TimeEdge is one dimensional temporal topology primitive,
+			 expresses a state in topological time. It has an orientation from its start toward the end, 
+			 and its boundaries shall associate with two different time nodes.</documentation>
+		</annotation>
+	</element>
+	<!-- ================================================================== -->
+	<complexType name="TimeEdgeType">
+		<annotation>
+			<documentation xml:lang="en">Type declaration of the element "TimeEdge".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTimeTopologyPrimitiveType">
+				<sequence>
+					<element name="start" type="gml:TimeNodePropertyType"/>
+					<element name="end" type="gml:TimeNodePropertyType"/>
+					<element name="extent" type="gml:TimePeriodPropertyType" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ================================================================== -->
+	<complexType name="TimeEdgePropertyType">
+		<annotation>
+			<documentation>A time edge property can either be any time edge element encapsulated in an element of this type 
+			or an XLink reference to a remote time edge element (where remote includes elements located elsewhere in the same document). 
+			Note that either the reference or the contained element must be given, but not both or none.</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<element ref="gml:TimeEdge"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ================================================================== -->
+	<!-- ===       Succession        === -->
+	<!-- ================================================================== -->
+	<simpleType name="SuccessionType">
+		<annotation>
+			<documentation>Feature succession is a semantic relationship derived from evaluation of observer, and 
+			Feature Substitution, Feature Division and Feature Fusion are defined as associations between 
+			previous features and next features in the temporal context. 
+			Successions shall be represented in either following two ways. 
+			* define a temporal topological complex element as a feature element 
+			* define an association same as temporal topological complex between features.</documentation>
+		</annotation>
+		<restriction base="string">
+			<enumeration value="substitution"/>
+			<enumeration value="division"/>
+			<enumeration value="fusion"/>
+			<enumeration value="initiation"/>
+		</restriction>
+	</simpleType>
+	<!-- ================================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/topology.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/topology.xsd
new file mode 100644
index 0000000..c194de7
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/topology.xsd
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" elementFormDefault="qualified" version="3.1.1 2010-01-28" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:topology:3.1.1">topology.xsd</appinfo>
+		<documentation>
+			GML is an OGC Standard.
+			Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+			To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<include schemaLocation="geometryComplexes.xsd"/>
+	<!-- ==============================================================
+       abstract supertype for topology objects
+        =============================================================== -->
+	<!-- ========================================================== -->
+	<element name="_Topology" type="gml:AbstractTopologyType" abstract="true" substitutionGroup="gml:_GML"/>
+	<!-- ========================================================== -->
+	<complexType name="AbstractTopologyType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractGMLType"/>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="_TopoPrimitive" type="gml:AbstractTopoPrimitiveType" abstract="true" substitutionGroup="gml:_Topology">
+		<annotation>
+			<documentation>Substitution group branch for Topo Primitives, used by TopoPrimitiveArrayAssociationType</documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="AbstractTopoPrimitiveType" abstract="true">
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:isolated" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:container" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="isolated" type="gml:IsolatedPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:isolated">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="IsolatedPropertyType">
+		<choice minOccurs="0">
+			<element ref="gml:Node"/>
+			<element ref="gml:Edge"/>
+		</choice>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="container" type="gml:ContainerPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:containerProperty">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="ContainerPropertyType">
+		<sequence minOccurs="0">
+			<choice>
+				<element ref="gml:Face"/>
+				<element ref="gml:TopoSolid"/>
+			</choice>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- primitive topology objects -->
+	<!-- ========================================================== -->
+	<element name="Node" type="gml:NodeType" substitutionGroup="gml:_TopoPrimitive"/>
+	<!-- =========================================================== -->
+	<complexType name="NodeType">
+		<annotation>
+			<documentation>Its optional co-boundary is a set of connected directedEdges.  The orientation of one of these dirEdges is "+" if the Node is the "to" node of the Edge, and "-" if it is the "from" node.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedEdge" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:pointProperty" minOccurs="0"/>
+					<!-- <element name="geometry" type="gml:PointPropertyType" minOccurs="0"/> -->
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===== Property for topology association - by Value or by Reference ===== -->
+	<element name="directedNode" type="gml:DirectedNodePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:directedNode">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="DirectedNodePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Node"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- primitive topology objects (1-dimensional) -->
+	<!-- ========================================================== -->
+	<element name="Edge" type="gml:EdgeType" substitutionGroup="gml:_TopoPrimitive"/>
+	<!-- ========================================================== -->
+	<complexType name="EdgeType">
+		<annotation>
+			<documentation>There is precisely one positively directed and one negatively directed node in the boundary of every edge. The negatively and positively directed nodes correspond to the start and end nodes respectively. The optional coboundary of an edge is a circular sequence of directed faces which are incident on this edge in document order. Faces which use a particular boundary edge in its positive orientation appear with positive orientation on the coboundary of the same edge. In  [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedNode" minOccurs="2" maxOccurs="2"/>
+					<element ref="gml:directedFace" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:curveProperty" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===== Property for topology association - by Value or by Reference ===== -->
+	<element name="directedEdge" type="gml:DirectedEdgePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:directedEdge">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="DirectedEdgePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Edge"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- primitive topology objects (2-dimensional) -->
+	<!-- ========================================================== -->
+	<element name="Face" type="gml:FaceType" substitutionGroup="gml:_TopoPrimitive"/>
+	<!-- ========================================================== -->
+	<complexType name="FaceType">
+		<annotation>
+			<documentation>. The topological boundary of a face consists of a set of directed edges. Note that all edges associated with a Face, including dangling and interior edges, appear in the boundary.  Dangling and interior edges are each referenced by pairs of directedEdges with opposing orientations.  The optional coboundary of a face is a pair of directed solids which are bounded by this face. If present, there is precisely one positively directed and one negatively directed solid in th [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedEdge" maxOccurs="unbounded"/>
+					<element ref="gml:directedTopoSolid" minOccurs="0" maxOccurs="2"/>
+					<element ref="gml:surfaceProperty" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===== Property for topology association - by Value or by Reference ===== -->
+	<element name="directedFace" type="gml:DirectedFacePropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:directedFace">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="DirectedFacePropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:Face"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- primitive topology objects (3-dimensional) -->
+	<!-- ========================================================== -->
+	<element name="TopoSolid" type="gml:TopoSolidType" substitutionGroup="gml:_TopoPrimitive"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoSolidType">
+		<annotation>
+			<documentation>The topological boundary of a TopoSolid consists of a set of directed faces. Note that all faces associated with the TopoSolid, including dangling faces, appear in the boundary. The coboundary of a TopoSolid is empty and hence requires no representation.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopoPrimitiveType">
+				<sequence>
+					<element ref="gml:directedFace" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value or by Reference ===== -->
+	<element name="directedTopoSolid" type="gml:DirectedTopoSolidPropertyType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:directedTopoSolid">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================= -->
+	<complexType name="DirectedTopoSolidPropertyType">
+		<sequence minOccurs="0">
+			<element ref="gml:TopoSolid"/>
+		</sequence>
+		<attribute name="orientation" type="gml:SignType" default="+"/>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="TopoPoint" type="gml:TopoPointType"/>
+	<!-- ========================================================== -->
+	<complexType name="TopoPointType">
+		<annotation>
+			<documentation>The intended use of TopoPoint is to appear within a point feature to express the structural and possibly geometric relationships of this point to other features via shared node definitions. Note the orientation assigned to the directedNode has no meaning in this context. It is preserved for symmetry with the types and elements which follow.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedNode"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ============================================================= -->
+	<!-- ===== Property for topology association - by Value  ===== -->
+	<element name="topoPointProperty" type="gml:TopoPointPropertyType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoPointPropertyType">
+		<sequence>
+			<element ref="gml:TopoPoint"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<element name="TopoCurve" type="gml:TopoCurveType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoCurveType">
+		<annotation>
+			<documentation>The end Node of each directedEdge of a TopoCurveType
+is the start Node of the next directedEdge of the TopoCurveType in document order.  The TopoCurve type and element represent a homogeneous topological expression, a list of directed edges, which if realised are isomorphic to a geometric curve primitive. The intended use of TopoCurve is to appear within a line feature instance to express the structural and geometric relationships of this line to other features via the shared edge definitions.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedEdge" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value ===== -->
+	<element name="topoCurveProperty" type="gml:TopoCurvePropertyType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoCurvePropertyType">
+		<sequence>
+			<element ref="gml:TopoCurve"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<element name="TopoSurface" type="gml:TopoSurfaceType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoSurfaceType">
+		<annotation>
+			<documentation>The TopoSurface type and element represent a homogeneous topological expression, a set of directed faces, which if realised are isomorphic to a geometric surface primitive. The intended use of TopoSurface is to appear within a surface feature instance to express the structural and possibly geometric relationships of this surface to other features via the shared face definitions.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedFace" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value ===== -->
+	<element name="topoSurfaceProperty" type="gml:TopoSurfacePropertyType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoSurfacePropertyType">
+		<sequence>
+			<element ref="gml:TopoSurface"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="TopoVolume" type="gml:TopoVolumeType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoVolumeType">
+		<annotation>
+			<documentation>The TopoVolume type and element represent a homogeneous topological expression, a set of directed TopoSolids, which if realised are isomorphic to a geometric solid primitive. The intended use of TopoVolume is to appear within a 3D solid feature instance to express the structural and geometric relationships of this solid to other features via the shared TopoSolid definitions.  . Note the orientation assigned to the directedSolid has no meaning in three dimensions. It is  [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:directedTopoSolid" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value  ===== -->
+	<element name="topoVolumeProperty" type="gml:TopoVolumePropertyType"/>
+	<!-- ============================================================= -->
+	<complexType name="TopoVolumePropertyType">
+		<sequence>
+			<element ref="gml:TopoVolume"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<element name="TopoComplex" type="gml:TopoComplexType" substitutionGroup="gml:_Topology"/>
+	<!-- ========================================================== -->
+	<complexType name="TopoComplexType">
+		<annotation>
+			<documentation>This type represents a TP_Complex capable of holding topological primitives.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractTopologyType">
+				<sequence>
+					<element ref="gml:maximalComplex"/>
+					<element ref="gml:superComplex" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:subComplex" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:topoPrimitiveMember" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:topoPrimitiveMembers" minOccurs="0"/>
+				</sequence>
+				<attribute name="isMaximal" type="boolean" default="false"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===== Property for topology association - by Value or Reference ===== -->
+	<element name="topoComplexProperty" type="gml:TopoComplexMemberType"/>
+	<!-- ========================================================== -->
+	<element name="subComplex" type="gml:TopoComplexMemberType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:subComplex">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="superComplex" type="gml:TopoComplexMemberType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:superComplex">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="maximalComplex" type="gml:TopoComplexMemberType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:subComplex">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>Need schamatron test here that isMaximal attribute value is true</documentation>
+		</annotation>
+	</element>
+	<!-- ============================================================= -->
+	<complexType name="TopoComplexMemberType">
+		<annotation>
+			<documentation>This Property can be used to embed a TopoComplex in a feature collection.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:TopoComplex" minOccurs="0"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value or Reference ===== -->
+	<element name="topoPrimitiveMember" type="gml:TopoPrimitiveMemberType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:topoPrimitiveMember">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ============================================================= -->
+	<complexType name="TopoPrimitiveMemberType">
+		<annotation>
+			<documentation>This type supports embedding topological primitives in a TopoComplex.</documentation>
+		</annotation>
+		<sequence>
+			<element ref="gml:_TopoPrimitive" minOccurs="0"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<!-- ===== Property for topology association - by Value ===== -->
+	<element name="topoPrimitiveMembers" type="gml:TopoPrimitiveArrayAssociationType">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="refAndContent co-occurence prohibited">
+					<sch:rule context="gml:topoPrimitiveMember">
+						<sch:extends rule="hrefOrContent"/>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="TopoPrimitiveArrayAssociationType">
+		<annotation>
+			<documentation>This type supports embedding an array of topological primitives in a TopoComplex</documentation>
+		</annotation>
+		<!--		<complexContent>
+			<restriction base="gml:ArrayAssociationType">  -->
+		<sequence>
+			<choice minOccurs="0" maxOccurs="unbounded">
+				<element ref="gml:_TopoPrimitive"/>
+			</choice>
+		</sequence>
+		<!-- 			</restriction>
+		</complexContent> -->
+	</complexType>
+	<!-- ========================================================== -->
+</schema>
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/units.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/units.xsd
new file mode 100644
index 0000000..3b4f9fd
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/units.xsd
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:gml="http://www.opengis.net/gml" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="3.1.1 2010-01-28" xml:lang="en">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-units:3.1.1"/>
+		<documentation>Builds on gmlBase.xsd to encode units of measure (or uom), including definitions of units of measure and dictionaries of such definitions. GML 3.0 candidate schema, primary editor: Arliss Whiteside.			
+	Parts of this schema are based on Subclause 6.5.7 of ISO/CD 19103 Geographic information - Conceptual schema language, on Subclause A.5.2.2.3 of ISO/CD 19118 Geographic information - Encoding, and on most of OpenGIS Recommendation Paper OGC 02-007r4 Units of Measure Use and Definition Recommendations.
+		
+		GML is an OGC Standard.
+		Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+       includes and imports
+	============================================================== -->
+	<include schemaLocation="dictionary.xsd"/>
+	<!-- ==============================================================
+       elements and types
+	============================================================== -->
+	<element name="unitOfMeasure" type="gml:UnitOfMeasureType"/>
+	<!-- =========================================================== -->
+	<complexType name="UnitOfMeasureType">
+		<annotation>
+			<documentation>Reference to a unit of measure definition that applies to all the numerical values described by the element containing this element. Notice that a complexType which needs to include the uom attribute can do so by extending this complexType. Alternately, this complexType can be used as a pattern for a new complexType.</documentation>
+		</annotation>
+		<sequence/>
+		<attribute name="uom" type="anyURI" use="required">
+			<annotation>
+				<documentation>Reference to a unit of measure definition, usually within the same XML document but possibly outside the XML document which contains this reference. For a reference within the same XML document, the "#" symbol should be used, followed by a text abbreviation of the unit name. However, the "#" symbol may be optional, and still may be interpreted as a reference.</documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="UnitDefinition" type="gml:UnitDefinitionType" substitutionGroup="gml:Definition"/>
+	<!-- =========================================================== -->
+	<complexType name="UnitDefinitionType">
+		<annotation>
+			<documentation>Definition of a unit of measure (or uom). The definition includes a quantityType property, which indicates the phenomenon to which the units apply, and a catalogSymbol, which gives the short symbol used for this unit. This element is used when the relationship of this unit to other units or units systems is unknown.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:DefinitionType">
+				<sequence>
+					<element ref="gml:quantityType"/>
+					<element ref="gml:catalogSymbol" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="BaseUnit" type="gml:BaseUnitType" substitutionGroup="gml:UnitDefinition"/>
+	<!-- =========================================================== -->
+	<complexType name="BaseUnitType">
+		<annotation>
+			<documentation>Definition of a unit of measure which is a base unit from the system of units.  A base unit cannot be derived by combination of other base units within this system.  Sometimes known as "fundamental unit".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<element name="unitsSystem" type="gml:ReferenceType"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="DerivedUnit" type="gml:DerivedUnitType" substitutionGroup="gml:UnitDefinition"/>
+	<!-- ============================================================ -->
+	<complexType name="DerivedUnitType">
+		<annotation>
+			<documentation>Definition of a unit of measure which is defined through algebraic combination of more primitive units, which are usually base units from a particular system of units. Derived units based directly on base units are usually preferred for quantities other than the base units or fundamental quantities within a system.  If a derived unit is not the preferred unit, the ConventionalUnit element should be used instead.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<element ref="gml:derivationUnitTerm" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="ConventionalUnit" type="gml:ConventionalUnitType" substitutionGroup="gml:UnitDefinition"/>
+	<!-- =========================================================== -->
+	<complexType name="ConventionalUnitType">
+		<annotation>
+			<documentation>Definition of a unit of measure which is related to a preferred unit for this quantity type through a conversion formula.  A method for deriving this unit by algebraic combination of more primitive units, may also be provided.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitDefinitionType">
+				<sequence>
+					<choice>
+						<element ref="gml:conversionToPreferredUnit"/>
+						<element ref="gml:roughConversionToPreferredUnit"/>
+					</choice>
+					<element ref="gml:derivationUnitTerm" minOccurs="0" maxOccurs="unbounded"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="quantityType" type="gml:StringOrRefType">
+		<annotation>
+			<documentation>Informal description of the phenomenon or type of quantity that is measured or observed. For example, "length", "angle", "time", "pressure", or "temperature". When the quantity is the result of an observation or measurement, this term is known as Observable Type or Measurand.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="catalogSymbol" type="gml:CodeType">
+		<annotation>
+			<documentation>For global understanding of a unit of measure, it is often possible to reference an item in a catalog of units, using a symbol in that catalog. The "codeSpace" attribute in "CodeType" identifies a namespace for the catalog symbol value, and might reference the catalog. The "string" value in "CodeType" contains the value of a symbol that is unique within this catalog namespace. This symbol often appears explicitly in the catalog, but it could be a combination of symbols  [...]
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="derivationUnitTerm" type="gml:DerivationUnitTermType"/>
+	<!-- =========================================================== -->
+	<complexType name="DerivationUnitTermType">
+		<annotation>
+			<documentation>Definition of one unit term for a derived unit of measure. This unit term references another unit of measure (uom) and provides an integer exponent applied to that unit in defining the compound unit. The exponent can be positive or negative, but not zero.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitOfMeasureType">
+				<attribute name="exponent" type="integer"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="conversionToPreferredUnit" type="gml:ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>This element is included when this unit has an accurate conversion to the preferred unit for this quantity type.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="roughConversionToPreferredUnit" type="gml:ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>This element is included when the correct definition of this unit is unknown, but this unit has a rough or inaccurate conversion to the preferred unit for this quantity type.</documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="ConversionToPreferredUnitType">
+		<annotation>
+			<documentation>Relation of a unit to the preferred unit for this quantity type, specified by an arithmetic conversion (scaling and/or offset). A preferred unit is either a base unit or a derived unit selected for all units of one quantity type. The mandatory attribute "uom" shall reference the preferred unit that this conversion applies to. The conversion is specified by one of two alternative elements: "factor" or "formula".</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:UnitOfMeasureType">
+				<choice>
+					<element name="factor" type="double">
+						<annotation>
+							<documentation>Specification of the scale factor by which a value using this unit of measure can be multiplied to obtain the corresponding value using the preferred unit of measure.</documentation>
+						</annotation>
+					</element>
+					<element name="formula" type="gml:FormulaType">
+						<annotation>
+							<documentation>Specification of the formula by which a value using this unit of measure can be converted to obtain the corresponding value using the preferred unit of measure.</documentation>
+						</annotation>
+					</element>
+				</choice>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="FormulaType">
+		<annotation>
+			<documentation>Paremeters of a simple formula by which a value using this unit of measure can be converted to the corresponding value using the preferred unit of measure. The formula element contains elements a, b, c and d, whose values use the XML Schema type "double". These values are used in the formula y = (a + bx) / (c + dx), where x is a value using this unit, and y is the corresponding value using the preferred unit. The elements a and d are optional, and if values are not prov [...]
+		</annotation>
+		<sequence>
+			<element name="a" type="double" minOccurs="0"/>
+			<element name="b" type="double"/>
+			<element name="c" type="double"/>
+			<element name="d" type="double" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/gml/3.1.1/base/valueObjects.xsd b/pycsw/schemas/ogc/gml/3.1.1/base/valueObjects.xsd
new file mode 100644
index 0000000..d9aa662
--- /dev/null
+++ b/pycsw/schemas/ogc/gml/3.1.1/base/valueObjects.xsd
@@ -0,0 +1,361 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:sch="http://www.ascc.net/xml/schematron" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+        attributeFormDefault="unqualified" version="3.1.1 2010-01-28">
+	<annotation>
+		<appinfo source="urn:opengis:specification:gml:schema-xsd:valueObjects:3.1.1">valueObjects.xsd</appinfo>
+		<documentation>GML conformant schema for Values in which the  
+		    * scalar Value types and lists have their values recorded in simpleContent elements 
+		    * complex Value types are built recursively
+		    
+		    GML is an OGC Standard.
+		    Copyright (c) 2001,2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		    To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ====================================================================== -->
+	<!-- geometry and temporal included so that _Geometry and _TimeObject can be added to Value choice group -->
+	<include schemaLocation="geometryBasic0d1d.xsd"/>
+	<include schemaLocation="temporal.xsd"/>
+	<!-- ====================================================================== -->
+	<group name="Value">
+		<annotation>
+			<documentation>Utility choice group which unifies generic Values defined in this schema document with 
+			Geometry and Temporal objects and the Measures described above, 
+			so that any of these may be used within aggregate Values.</documentation>
+		</annotation>
+		<choice>
+			<!-- <element ref="gml:_Value"/> -->
+			<group ref="gml:ValueObject"/>
+			<element ref="gml:_Object"/>
+			<!--			<element ref="gml:_Geometry"/>
+			<element ref="gml:_TimeObject"/> -->
+			<element ref="gml:Null"/>
+		</choice>
+	</group>
+	<!-- ====================================================================== -->
+	<group name="ValueObject">
+		<choice>
+			<group ref="gml:ScalarValue"/>
+			<group ref="gml:ScalarValueList"/>
+			<group ref="gml:ValueExtent"/>
+			<element ref="gml:CompositeValue"/>
+		</choice>
+	</group>
+	<!-- ======================================================================
+	<element name="_Value" abstract="true" substitutionGroup="gml:_Object">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group which contains _ScalarValue, _ScalarValueList and CompositeValue and (transitively) the elements in their substitution groups.  This element may be used in an application schema as a variable, so that in an XML instance document any member of its substitution group may occur.</documentation>
+		</annotation>
+	</element> -->
+	<!-- ====================================================================== -->
+	<!-- ================== Scalar Values =========================
+	<element name="_ScalarValue" abstract="true" substitutionGroup="gml:_Value">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group which contains Boolean, Category, Count and Quantity, and (transitively) the elements in their substitution groups.  This element may be used in an application schema as a variable, so that in an XML instance document any member of its substitution group may occur.</documentation>
+		</annotation>
+	</element> -->
+	<group name="ScalarValue">
+		<choice>
+			<element ref="gml:Boolean"/>
+			<element ref="gml:Category"/>
+			<element ref="gml:Quantity"/>
+			<element ref="gml:Count"/>
+		</choice>
+	</group>
+	<!-- ======================================================================
+	<element name="_ScalarValueList" abstract="true" substitutionGroup="gml:_Value">
+		<annotation>
+			<documentation>Abstract element which acts as the head of a substitution group which contains the compact encodings BooleanList, CategoryList, CountList and QuantityList, and (transitively) the elements in their substitution groups.  This element may be used in an application schema as a variable, so that in an XML instance document any member of its substitution group may occur.</documentation>
+		</annotation>
+	</element> -->
+	<group name="ScalarValueList">
+		<choice>
+			<element ref="gml:BooleanList"/>
+			<element ref="gml:CategoryList"/>
+			<element ref="gml:QuantityList"/>
+			<element ref="gml:CountList"/>
+		</choice>
+	</group>
+	<!-- ====================================================================== -->
+	<!-- ======================= Boolean ========================
+	<element name="Boolean" type="boolean" substitutionGroup="gml:_ScalarValue"> -->
+	<element name="Boolean" type="boolean">
+		<annotation>
+			<documentation>A value from two-valued logic, using the XML Schema boolean type.  An instance may take the values {true, false, 1, 0}.</documentation>
+		</annotation>
+	</element>
+	<!--
+	<element name="BooleanList" type="gml:booleanOrNullList" substitutionGroup="gml:_ScalarValueList"> -->
+	<element name="BooleanList" type="gml:booleanOrNullList">
+		<annotation>
+			<documentation>XML List based on XML Schema boolean type.  An element of this type contains a space-separated list of boolean values {0,1,true,false}</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- ======================= Category ==========================
+	<element name="Category" type="gml:CodeType" substitutionGroup="gml:_ScalarValue"> -->
+	<element name="Category" type="gml:CodeType">
+		<annotation>
+			<documentation>A term representing a classification.  It has an optional XML attribute codeSpace, whose value is a URI which identifies a dictionary, codelist or authority for the term.</documentation>
+		</annotation>
+	</element>
+	<!--
+	<element name="CategoryList" type="gml:CodeOrNullListType" substitutionGroup="gml:_ScalarValueList"> -->
+	<element name="CategoryList" type="gml:CodeOrNullListType">
+		<annotation>
+			<documentation>A space-separated list of terms or nulls.  A single XML attribute codeSpace may be provided, which authorises all the terms in the list.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- =========================== Quantity ============================
+	<element name="Quantity" type="gml:MeasureType" substitutionGroup="gml:_ScalarValue"> -->
+	<element name="Quantity" type="gml:MeasureType">
+		<annotation>
+			<documentation>A numeric value with a scale.  The content of the element is an amount using the XML Schema type double which permits decimal or scientific notation.  An XML attribute uom (unit of measure) is required, whose value is a URI which identifies the definition of the scale or units by which the numeric value must be multiplied.</documentation>
+		</annotation>
+	</element>
+	<!--
+	<element name="QuantityList" type="gml:MeasureOrNullListType" substitutionGroup="gml:_ScalarValueList"> -->
+	<element name="QuantityList" type="gml:MeasureOrNullListType">
+		<annotation>
+			<documentation>A space separated list of amounts or nulls.  The amounts use the XML Schema type double.  A single XML attribute uom (unit of measure) is required, whose value is a URI which identifies the definition of the scale or units by which all the amounts in the list must be multiplied.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- ========================== Count ==========================
+	<element name="Count" type="integer" substitutionGroup="gml:_ScalarValue"> -->
+	<element name="Count" type="integer">
+		<annotation>
+			<documentation>An integer representing a frequency of occurrence.</documentation>
+		</annotation>
+	</element>
+	<!--
+	<element name="CountList" type="gml:integerOrNullList" substitutionGroup="gml:_ScalarValueList"> -->
+	<element name="CountList" type="gml:integerOrNullList">
+		<annotation>
+			<documentation>A space-separated list of integers or nulls.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!--                    aggregate Value types                      -->
+	<!-- ====================================================================== -->
+	<!-- ===================== ValueCollection ========================== -->
+	<complexType name="CompositeValueType">
+		<annotation>
+			<documentation>Aggregate value built from other Values using the Composite pattern. It contains zero or an arbitrary number of valueComponent elements, and zero or one valueComponents elements.  It may be used for strongly coupled aggregates (vectors, tensors) or for arbitrary collections of values.</documentation>
+		</annotation>
+		<complexContent>
+			<extension base="gml:AbstractGMLType">
+				<sequence>
+					<element ref="gml:valueComponent" minOccurs="0" maxOccurs="unbounded"/>
+					<element ref="gml:valueComponents" minOccurs="0"/>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- <element name="CompositeValue" type="gml:CompositeValueType" substitutionGroup="gml:_Value"> -->
+	<element name="CompositeValue" type="gml:CompositeValueType">
+		<annotation>
+			<documentation>Aggregate value built using the Composite pattern.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<!-- ========================= ValueArray ========================== -->
+	<complexType name="ValueArrayType">
+		<annotation>
+			<documentation>A Value Array is used for homogeneous arrays of primitive and aggregate values.  The member values may be scalars, composites, arrays or lists.  ValueArray has the same content model as CompositeValue, but the member values must be homogeneous.  The element declaration contains a Schematron constraint which expresses this restriction precisely.            Since the members are homogeneous, the referenceSystem (uom, codeSpace) may be specified on the ValueArray itself an [...]
+		</annotation>
+		<complexContent>
+			<extension base="gml:CompositeValueType">
+				<attributeGroup ref="gml:referenceSystem"/>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- -->
+	<element name="ValueArray" type="gml:ValueArrayType" substitutionGroup="gml:CompositeValue">
+		<annotation>
+			<appinfo>
+				<sch:pattern name="Check either codeSpace or uom not both">
+					<sch:rule context="gml:ValueArray">
+						<sch:report test="@codeSpace and @uom">ValueArray may not carry both a reference to a codeSpace and a uom</sch:report>
+					</sch:rule>
+				</sch:pattern>
+				<sch:pattern name="Check components are homogeneous">
+					<sch:rule context="gml:ValueArray">
+						<sch:assert test="count(gml:valueComponent/*) = count(gml:valueComponent/*[name() = name(../../gml:valueComponent[1]/*[1])])">All components of <sch:name/> must be of the same type</sch:assert>
+						<sch:assert test="count(gml:valueComponents/*) = count(gml:valueComponents/*[name() = name(../*[1])])">All components of <sch:name/> must be of the same type</sch:assert>
+					</sch:rule>
+				</sch:pattern>
+			</appinfo>
+			<documentation>A Value Array is used for homogeneous arrays of primitive and aggregate values.   _ScalarValueList is preferred for arrays of Scalar Values since this is more efficient.  Since "choice" is not available for attribute groups, an external constraint (e.g. Schematron) would be required to enforce the selection of only one of these through schema validation</documentation>
+		</annotation>
+	</element>
+	<!-- attribute group required for ValueArray -->
+	<attributeGroup name="referenceSystem">
+		<attribute name="codeSpace" type="anyURI" use="optional"/>
+		<attribute name="uom" type="anyURI" use="optional"/>
+	</attributeGroup>
+	<!-- ====================================================================== -->
+	<!-- ====================== Typed ValueExtents ============================ -->
+	<group name="ValueExtent">
+		<choice>
+			<element ref="gml:CategoryExtent"/>
+			<element ref="gml:QuantityExtent"/>
+			<element ref="gml:CountExtent"/>
+		</choice>
+	</group>
+	<!-- ======================================================================
+	<element name="QuantityExtent" type="gml:QuantityExtentType" substitutionGroup="gml:_Value"> -->
+	<element name="QuantityExtent" type="gml:QuantityExtentType">
+		<annotation>
+			<documentation>Utility element to store a 2-point range of numeric values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+	</element>
+	<!-- -->
+	<complexType name="QuantityExtentType">
+		<annotation>
+			<documentation>Restriction of list type to store a 2-point range of numeric values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:MeasureOrNullListType">
+				<length value="2"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- ======================================================================
+	<element name="CategoryExtent" type="gml:CategoryExtentType" substitutionGroup="gml:_Value"> -->
+	<element name="CategoryExtent" type="gml:CategoryExtentType">
+		<annotation>
+			<documentation>Utility element to store a 2-point range of ordinal values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+	</element>
+	<!-- -->
+	<complexType name="CategoryExtentType">
+		<annotation>
+			<documentation>Restriction of list type to store a 2-point range of ordinal values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+		<simpleContent>
+			<restriction base="gml:CodeOrNullListType">
+				<length value="2"/>
+			</restriction>
+		</simpleContent>
+	</complexType>
+	<!-- ======================================================================
+	<element name="CountExtent" type="gml:CountExtentType" substitutionGroup="gml:_Value"> -->
+	<element name="CountExtent" type="gml:CountExtentType">
+		<annotation>
+			<documentation>Utility element to store a 2-point range of frequency values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+	</element>
+	<!-- -->
+	<simpleType name="CountExtentType">
+		<annotation>
+			<documentation>Restriction of list type to store a 2-point range of frequency values. If one member is a null, then this is a single ended interval.</documentation>
+		</annotation>
+		<restriction base="gml:integerOrNullList">
+			<length value="2"/>
+		</restriction>
+	</simpleType>
+	<!-- ====================================================================== -->
+	<!-- ===================== pieces needed for compositing ==================== -->
+	<element name="valueProperty" type="gml:ValuePropertyType">
+		<annotation>
+			<documentation>Element which refers to, or contains, a Value</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<element name="valueComponent" type="gml:ValuePropertyType">
+		<annotation>
+			<documentation>Element which refers to, or contains, a Value.  This version is used in CompositeValues.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<complexType name="ValuePropertyType">
+		<annotation>
+			<documentation>GML property which refers to, or contains, a Value</documentation>
+		</annotation>
+		<sequence minOccurs="0">
+			<group ref="gml:Value"/>
+		</sequence>
+		<attributeGroup ref="gml:AssociationAttributeGroup"/>
+	</complexType>
+	<!-- ====================================================================== -->
+	<!-- ====================================================================== -->
+	<element name="valueComponents" type="gml:ValueArrayPropertyType">
+		<annotation>
+			<documentation>Element which refers to, or contains, a set of homogeneously typed Values.</documentation>
+		</annotation>
+	</element>
+	<!-- ====================================================================== -->
+	<complexType name="ValueArrayPropertyType">
+		<annotation>
+			<documentation>GML property which refers to, or contains, a set of homogeneously typed Values.</documentation>
+		</annotation>
+		<sequence>
+			<group ref="gml:Value" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- ====================== utility typed valueProperty types ===================  -->
+	<complexType name="ScalarValuePropertyType">
+		<annotation>
+			<documentation>Property whose content is a scalar value.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<!-- <element ref="gml:_ScalarValue"/> -->
+					<group ref="gml:ScalarValue"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="BooleanPropertyType">
+		<annotation>
+			<documentation>Property whose content is a Boolean value.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<element ref="gml:Boolean"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="CategoryPropertyType">
+		<annotation>
+			<documentation>Property whose content is a Category.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<element ref="gml:Category"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="QuantityPropertyType">
+		<annotation>
+			<documentation>Property whose content is a Quantity.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<element ref="gml:Quantity"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<complexType name="CountPropertyType">
+		<annotation>
+			<documentation>Property whose content is a Count.</documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="gml:ValuePropertyType">
+				<sequence minOccurs="0">
+					<element ref="gml:Count"/>
+				</sequence>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- ====================================================================== -->
+</schema>
\ No newline at end of file
diff --git a/pycsw/schemas/ogc/ows/1.0.0/ows19115subset.xsd b/pycsw/schemas/ogc/ows/1.0.0/ows19115subset.xsd
new file mode 100644
index 0000000..7f15aed
--- /dev/null
+++ b/pycsw/schemas/ogc/ows/1.0.0/ows19115subset.xsd
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows" 
+xmlns:ows="http://www.opengis.net/ows" 
+xmlns:xlink="http://www.w3.org/1999/xlink" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.0.0 2010-01-30" xml:lang="en">
+	<annotation>
+		<appinfo>ows19115subset.xsd 2010-01-30</appinfo>
+		<documentation>This XML Schema Document encodes the parts of ISO 19115 used by the common "ServiceIdentification" and "ServiceProvider" sections of the GetCapabilities operation response, known as the service metadata XML document. The parts encoded here are the MD_Keywords, CI_ResponsibleParty, and related classes. This XML Schema largely follows the current draft for ISO 19139, with the addition of documentation text extracted and edited from Annex B of ISO 19115. The UML package pre [...]
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="../../../w3c/1999/xlink.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="Title" type="string">
+		<annotation>
+			<documentation>Title of this resource, normally used for display to a human. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="Abstract" type="string">
+		<annotation>
+			<documentation>Brief narrative description of this resource, normally used for display to a human. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="Keywords" type="ows:KeywordsType"/>
+	<!-- =========================================================== -->
+	<complexType name="KeywordsType">
+		<annotation>
+			<documentation>Unordered list of one or more commonly used or formalised word(s) or phrase(s) used to describe the subject. When needed, the optional "type" can name the type of the associated list of keywords that shall all have the same type. Also when needed, the codeSpace attribute of that "type" can reference the type name authority and/or thesaurus. </documentation>
+			<documentation>For OWS use, the optional thesaurusName element was omitted as being complex information that could be referenced by the codeSpace attribute of the Type element. </documentation>
+		</annotation>
+		<sequence>
+			<element name="Keyword" type="string" maxOccurs="unbounded"/>
+			<element name="Type" type="ows:CodeType" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="CodeType">
+		<annotation>
+			<documentation>Name or code with an (optional) authority. If the codeSpace attribute is present, its value should reference a dictionary, thesaurus, or authority for the name or code, such as the organisation who assigned the value, or the dictionary from which it is taken. </documentation>
+			<documentation>Type copied from basicTypes.xsd of GML 3 with documentation edited, for possible use outside the ServiceIdentification section of a service metadata document. </documentation>
+		</annotation>
+		<simpleContent>
+			<extension base="string">
+				<attribute name="codeSpace" type="anyURI" use="optional"/>
+			</extension>
+		</simpleContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="PointOfContact" type="ows:ResponsiblePartyType">
+		<annotation>
+			<documentation>Identification of, and means of communication with, person(s) responsible for the resource(s). </documentation>
+			<documentation>For OWS use in the ServiceProvider section of a service metadata document, the optional organizationName element was removed, since this type is always used with the ProviderName element which provides that information. The optional individualName element was made mandatory, since either the organizationName or individualName element is mandatory. The mandatory "role" element was changed to optional, since no clear use of this information is known in the ServiceProvider [...]
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="ResponsiblePartyType">
+		<annotation>
+			<documentation>Identification of, and means of communication with, person responsible for the server. At least one of IndividualName, OrganisationName, or PositionName shall be included. </documentation>
+		</annotation>
+		<sequence>
+			<element ref="ows:IndividualName" minOccurs="0"/>
+			<element ref="ows:OrganisationName" minOccurs="0"/>
+			<element ref="ows:PositionName" minOccurs="0"/>
+			<element ref="ows:ContactInfo" minOccurs="0"/>
+			<element ref="ows:Role"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<complexType name="ResponsiblePartySubsetType">
+		<annotation>
+			<documentation>Identification of, and means of communication with, person responsible for the server. </documentation>
+			<documentation>For OWS use in the ServiceProvider section of a service metadata document, the optional organizationName element was removed, since this type is always used with the ProviderName element which provides that information. The mandatory "role" element was changed to optional, since no clear use of this information is known in the ServiceProvider section. </documentation>
+		</annotation>
+		<sequence>
+			<element ref="ows:IndividualName" minOccurs="0"/>
+			<element ref="ows:PositionName" minOccurs="0"/>
+			<element ref="ows:ContactInfo" minOccurs="0"/>
+			<element ref="ows:Role" minOccurs="0"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="IndividualName" type="string">
+		<annotation>
+			<documentation>Name of the responsible person: surname, given name, title separated by a delimiter. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="OrganisationName" type="string">
+		<annotation>
+			<documentation>Name of the responsible organization. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="PositionName" type="string">
+		<annotation>
+			<documentation>Role or position of the responsible person. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="Role" type="ows:CodeType">
+		<annotation>
+			<documentation>Function performed by the responsible party. Possible values of this Role shall include the values and the meanings listed in Subclause B.5.5 of ISO 19115:2003. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<element name="ContactInfo" type="ows:ContactType">
+		<annotation>
+			<documentation>Address of the responsible party. </documentation>
+		</annotation>
+	</element>
+	<!-- =========================================================== -->
+	<complexType name="ContactType">
+		<annotation>
+			<documentation>Information required to enable contact with the responsible person and/or organization. </documentation>
+			<documentation>For OWS use in the service metadata document, the optional hoursOfService and contactInstructions elements were retained, as possibly being useful in the ServiceProvider section. </documentation>
+		</annotation>
+		<sequence>
+			<element name="Phone" type="ows:TelephoneType" minOccurs="0">
+				<annotation>
+					<documentation>Telephone numbers at which the organization or individual may be contacted. </documentation>
+				</annotation>
+			</element>
+			<element name="Address" type="ows:AddressType" minOccurs="0">
+				<annotation>
+					<documentation>Physical and email address at which the organization or individual may be contacted. </documentation>
+				</annotation>
+			</element>
+			<element name="OnlineResource" type="ows:OnlineResourceType" minOccurs="0">
+				<annotation>
+					<documentation>On-line information that can be used to contact the individual or organization. OWS specifics: The xlink:href attribute in the xlink:simpleAttrs attribute group shall be used to reference this resource. Whenever practical, the xlink:href attribute with type anyURI should be a URL from which more contact information can be electronically retrieved. The xlink:title attribute with type "string" can be used to name this set of information. The other attributes in the xlin [...]
+				</annotation>
+			</element>
+			<element name="HoursOfService" type="string" minOccurs="0">
+				<annotation>
+					<documentation>Time period (including time zone) when individuals can contact the organization or individual. </documentation>
+				</annotation>
+			</element>
+			<element name="ContactInstructions" type="string" minOccurs="0">
+				<annotation>
+					<documentation>Supplemental instructions on how or when to contact the individual or organization. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="OnlineResourceType">
+		<annotation>
+			<documentation>Reference to on-line resource from which data can be obtained. </documentation>
+			<documentation>For OWS use in the service metadata document, the CI_OnlineResource class was XML encoded as the attributeGroup "xlink:simpleAttrs", as used in GML. </documentation>
+		</annotation>
+		<attributeGroup ref="xlink:simpleAttrs"/>
+	</complexType>
+	<!-- ========================================================== -->
+	<complexType name="TelephoneType">
+		<annotation>
+			<documentation>Telephone numbers for contacting the responsible individual or organization. </documentation>
+		</annotation>
+		<sequence>
+			<element name="Voice" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Telephone number by which individuals can speak to the responsible organization or individual. </documentation>
+				</annotation>
+			</element>
+			<element name="Facsimile" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Telephone number of a facsimile machine for the responsible
+organization or individual. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="AddressType">
+		<annotation>
+			<documentation>Location of the responsible individual or organization. </documentation>
+		</annotation>
+		<sequence>
+			<element name="DeliveryPoint" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Address line for the location. </documentation>
+				</annotation>
+			</element>
+			<element name="City" type="string" minOccurs="0">
+				<annotation>
+					<documentation>City of the location. </documentation>
+				</annotation>
+			</element>
+			<element name="AdministrativeArea" type="string" minOccurs="0">
+				<annotation>
+					<documentation>State or province of the location. </documentation>
+				</annotation>
+			</element>
+			<element name="PostalCode" type="string" minOccurs="0">
+				<annotation>
+					<documentation>ZIP or other postal code. </documentation>
+				</annotation>
+			</element>
+			<element name="Country" type="string" minOccurs="0">
+				<annotation>
+					<documentation>Country of the physical address. </documentation>
+				</annotation>
+			</element>
+			<element name="ElectronicMailAddress" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Address of the electronic mailbox of the responsible organization or individual. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/pycsw/schemas/ogc/ows/1.0.0/owsAll.xsd b/pycsw/schemas/ogc/ows/1.0.0/owsAll.xsd
new file mode 100644
index 0000000..f7cd634
--- /dev/null
+++ b/pycsw/schemas/ogc/ows/1.0.0/owsAll.xsd
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows" 
+xmlns:ows="http://www.opengis.net/ows" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.0.0 2010-01-30" xml:lang="en">
+	<annotation>
+		<appinfo>owsAll.xsd 2010-01-30</appinfo>
+		<documentation>This XML Schema Document includes and imports, directly and indirectly, all the XML Schemas defined by the OWS Common Implemetation Specification.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsGetCapabilities.xsd"/>
+	<include schemaLocation="owsExceptionReport.xsd"/>
+</schema>
diff --git a/pycsw/schemas/ogc/ows/1.0.0/owsCommon.xsd b/pycsw/schemas/ogc/ows/1.0.0/owsCommon.xsd
new file mode 100644
index 0000000..acf1d59
--- /dev/null
+++ b/pycsw/schemas/ogc/ows/1.0.0/owsCommon.xsd
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows" 
+xmlns:ows="http://www.opengis.net/ows" 
+xmlns:xlink="http://www.w3.org/1999/xlink" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.0.0 2010-01-30" xml:lang="en">
+	<annotation>
+		<appinfo>owsCommon.xsd 2010-01-30</appinfo>
+		<documentation>This XML Schema Document encodes various parameters and parameter types that can be used in OWS operation requests and responses.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<import namespace="http://www.w3.org/1999/xlink" schemaLocation="../../../w3c/1999/xlink.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<simpleType name="MimeType">
+		<annotation>
+			<documentation>XML encoded identifier of a standard MIME type, possibly a parameterized MIME type. </documentation>
+		</annotation>
+		<restriction base="string">
+			<pattern value="(application|audio|image|text|video|message|multipart|model)/.+(;\s*.+=.+)*"/>
+		</restriction>
+	</simpleType>
+	<!-- ========================================================= -->
+	<simpleType name="VersionType">
+		<annotation>
+			<documentation>Specification version for OWS operation. The string value shall contain one x.y.z "version" value (e.g., "2.1.3"). A version number shall contain three non-negative integers separated by decimal points, in the form "x.y.z". The integers y and z shall not exceed 99. Each version shall be for the Implementation Specification (document) and the associated XML Schemas to which requested operations will conform. An Implementation Specification version normally specifies XML  [...]
+		</annotation>
+		<restriction base="string"/>
+	</simpleType>
+	<!-- ========================================================== -->
+	<element name="Metadata" type="ows:MetadataType"/>
+	<!-- ========================================================== -->
+	<complexType name="MetadataType">
+		<annotation>
+			<documentation>This element either references or contains more metadata about the element that includes this element. To reference metadata stored remotely, at least the xlinks:href attribute in xlink:simpleAttrs shall be included. Either at least one of the attributes in xlink:simpleAttrs or a substitute for the AbstractMetaData element shall be included, but not both. An Implementation Specification can restrict the contents of this element to always be a reference or always contain [...]
+		</annotation>
+		<sequence>
+			<element ref="ows:AbstractMetaData" minOccurs="0"/>
+		</sequence>
+		<attributeGroup ref="xlink:simpleAttrs">
+			<annotation>
+				<documentation>Reference to metadata recorded elsewhere, either external to this XML document or within it. Whenever practical, the xlink:href attribute with type anyURI should include a URL from which this metadata can be electronically retrieved. </documentation>
+			</annotation>
+		</attributeGroup>
+		<attribute name="about" type="anyURI" use="optional">
+			<annotation>
+				<documentation>Optional reference to the aspect of the element which includes this "metadata" element that this metadata provides more information about. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- ========================================================== -->
+	<element name="AbstractMetaData" abstract="true">
+		<annotation>
+			<documentation>Abstract element containing more metadata about the element that includes the containing "metadata" element. A specific server implementation, or an Implementation Specification, can define concrete elements in the AbstractMetaData substitution group. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<!-- ========================================================== -->
+	<element name="BoundingBox" type="ows:BoundingBoxType"/>
+	<!-- =========================================================== -->
+	<complexType name="BoundingBoxType">
+		<annotation>
+			<documentation>XML encoded minimum rectangular bounding box (or region) parameter, surrounding all the associated data. </documentation>
+			<documentation>This type is adapted from the EnvelopeType of GML 3.1, with modified contents and documentation for encoding a MINIMUM size box SURROUNDING all associated data. </documentation>
+		</annotation>
+		<sequence>
+			<element name="LowerCorner" type="ows:PositionType">
+				<annotation>
+					<documentation>Position of the bounding box corner at which the value of each coordinate normally is the algebraic minimum within this bounding box. In some cases, this position is normally displayed at the top, such as the top left for some image coordinates. For more information, see Subclauses 10.2.5 and C.13. </documentation>
+				</annotation>
+			</element>
+			<element name="UpperCorner" type="ows:PositionType">
+				<annotation>
+					<documentation>Position of the bounding box corner at which the value of each coordinate normally is the algebraic maximum within this bounding box. In some cases, this position is normally displayed at the bottom, such as the bottom right for some image coordinates. For more information, see Subclauses 10.2.5 and C.13. </documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="crs" type="anyURI" use="optional">
+			<annotation>
+				<documentation>Usually references the definition of a CRS, as specified in [OGC Topic 2]. Such a CRS definition can be XML encoded using the gml:CoordinateReferenceSystemType in [GML 3.1]. For well known references, it is not required that a CRS definition exist at the location the URI points to. If no anyURI value is included, the applicable CRS must be either:
+a)	Specified outside the bounding box, but inside a data structure that includes this bounding box, as specified for a specific OWS use of this bounding box type.
+b)	Fixed and specified in the Implementation Specification for a specific OWS use of the bounding box type. </documentation>
+			</annotation>
+		</attribute>
+		<attribute name="dimensions" type="positiveInteger" use="optional">
+			<annotation>
+				<documentation>The number of dimensions in this CRS (the length of a coordinate sequence in this use of the PositionType). This number is specified by the CRS definition, but can also be specified here. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="PositionType">
+		<annotation>
+			<documentation>Position instances hold the coordinates of a position in a coordinate reference system (CRS) referenced by the related "crs" attribute or elsewhere. For an angular coordinate axis that is physically continuous for multiple revolutions, but whose recorded values can be discontinuous, special conditions apply when the bounding box is continuous across the value discontinuity:
+a)  If the bounding box is continuous clear around this angular axis, then ordinate values of minus and plus infinity shall be used.
+b)  If the bounding box is continuous across the value discontinuity but is not continuous clear around this angular axis, then some non-normal value can be used if specified for a specific OWS use of the BoundingBoxType. For more information, see Subclauses 10.2.5 and C.13. </documentation>
+			<documentation>This type is adapted from DirectPositionType and doubleList of GML 3.1. The adaptations include omission of all the attributes, since the needed information is included in the BoundingBoxType. </documentation>
+		</annotation>
+		<list itemType="double"/>
+	</simpleType>
+	<!-- =========================================================== -->
+	<element name="WGS84BoundingBox" type="ows:WGS84BoundingBoxType" substitutionGroup="ows:BoundingBox"/>
+	<!-- =========================================================== -->
+	<complexType name="WGS84BoundingBoxType">
+		<annotation>
+			<documentation>XML encoded minimum rectangular bounding box (or region) parameter, surrounding all the associated data. This box is specialized for use with the 2D WGS 84 coordinate reference system with decimal values of longitude and latitude. </documentation>
+			<documentation>This type is adapted from the general BoundingBoxType, with modified contents and documentation for use with the 2D WGS 84 coordinate reference system. </documentation>
+		</annotation>
+		<complexContent>
+			<restriction base="ows:BoundingBoxType">
+				<sequence>
+					<element name="LowerCorner" type="ows:PositionType2D">
+						<annotation>
+							<documentation>Position of the bounding box corner at which the values of longitude and latitude normally are the algebraic minimums within this bounding box. For more information, see Subclauses 10.4.5 and C.13. </documentation>
+						</annotation>
+					</element>
+					<element name="UpperCorner" type="ows:PositionType2D">
+						<annotation>
+							<documentation>Position of the bounding box corner at which the values of longitude and latitude normally are the algebraic minimums within this bounding box. For more information, see Subclauses 10.4.5 and C.13. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+				<attribute name="crs" type="anyURI" use="optional" fixed="urn:ogc:def:crs:OGC:2:84">
+					<annotation>
+						<documentation>This attribute can be included when considered useful. When included, this attribute shall reference the 2D WGS 84 coordinate reference system with longitude before latitude and decimal values of longitude and latitude. </documentation>
+					</annotation>
+				</attribute>
+				<attribute name="dimensions" type="positiveInteger" use="optional" fixed="2">
+					<annotation>
+						<documentation>The number of dimensions in this CRS (the length of a coordinate sequence in this use of the PositionType). This number is specified by the CRS definition, but can also be specified here. </documentation>
+					</annotation>
+				</attribute>
+			</restriction>
+		</complexContent>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="PositionType2D">
+		<annotation>
+			<documentation>Two-dimensional position instances hold the longitude and latitude coordinates of a position in the 2D WGS 84 coordinate reference system. The longitude value shall be listed first, followed by the latitude value, both in decimal degrees. Latitude values shall range from -90 to +90 degrees, and longitude values shall normally range from -180 to +180 degrees. For the longitude axis, special conditions apply when the bounding box is continuous across the +/- 180 degrees m [...]
+a)  If the bounding box is continuous clear around the Earth, then longitude values of minus and plus infinity shall be used.
+b)  If the bounding box is continuous across the value discontinuity but is not continuous clear around the Earth, then some non-normal value can be used if specified for a specific OWS use of the WGS84BoundingBoxType. For more information, see Subclauses 10.4.5 and C.13. </documentation>
+		</annotation>
+		<restriction base="ows:PositionType">
+			<length value="2"/>
+		</restriction>
+	</simpleType>
+</schema>
diff --git a/pycsw/schemas/ogc/ows/1.0.0/owsDataIdentification.xsd b/pycsw/schemas/ogc/ows/1.0.0/owsDataIdentification.xsd
new file mode 100644
index 0000000..e927185
--- /dev/null
+++ b/pycsw/schemas/ogc/ows/1.0.0/owsDataIdentification.xsd
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows" 
+xmlns:ows="http://www.opengis.net/ows" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.0.0 2010-01-30" xml:lang="en">
+	<annotation>
+		<appinfo>owsDataIdentification.xsd 2010-01-30</appinfo>
+		<documentation>This XML Schema Document encodes the parts of the MD_DataIdentification class of ISO 19115 (OGC Abstract Specification Topic 11) which are expected to be used for most datasets. This Schema also encodes the parts of this class that are expected to be useful for other metadata. Both are expected to be used within the Contents section of OWS service metadata (Capabilities) documents.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsCommon.xsd"/>
+	<include schemaLocation="ows19115subset.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<complexType name="DescriptionType">
+		<annotation>
+			<documentation>Human-readable descriptive information for the object it is included within.
+This type shall be extended if needed for specific OWS use to include additional metadata for each type of information. This type shall not be restricted for a specific OWS to change the multiplicity (or optionality) of some elements. </documentation>
+		</annotation>
+		<sequence>
+			<element ref="ows:Title" minOccurs="0"/>
+			<element ref="ows:Abstract" minOccurs="0"/>
+			<element ref="ows:Keywords" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- ========================================================= -->
+	<complexType name="IdentificationType">
+		<annotation>
+			<documentation>General metadata identifying and describing a set of data. This type shall be extended if needed for each specific OWS to include additional metadata for each type of dataset. If needed, this type should first be restricted for each specific OWS to change the multiplicity (or optionality) of some elements. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:DescriptionType">
+				<sequence>
+					<element ref="ows:Identifier" minOccurs="0">
+						<annotation>
+							<documentation>Optional unique identifier or name of this dataset. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of zero or more bounding boxes whose union describes the extent of this dataset. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:OutputFormat" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of zero or more references to data formats supported for server outputs. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:AvailableCRS" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Unordered list of zero or more available coordinate reference systems. </documentation>
+						</annotation>
+					</element>
+					<element ref="ows:Metadata" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Optional unordered list of additional metadata about this data(set). A list of optional metadata elements for this data identification could be specified in the Implementation Specification for this service. </documentation>
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ===========================================================-->
+	<element name="Identifier" type="ows:CodeType">
+		<annotation>
+			<documentation>Unique identifier or name of this dataset. </documentation>
+		</annotation>
+	</element>
+	<!-- ===========================================================-->
+	<element name="OutputFormat" type="ows:MimeType">
+		<annotation>
+			<documentation>Reference to a format in which this data can be encoded and transferred. More specific parameter names should be used by specific OWS specifications wherever applicable. More than one such parameter can be included for different purposes. </documentation>
+		</annotation>
+	</element>
+	<!-- ===========================================================-->
+	<element name="AvailableCRS" type="anyURI"/>
+	<element name="SupportedCRS" type="anyURI" substitutionGroup="ows:AvailableCRS">
+		<annotation>
+			<documentation>Coordinate reference system in which data from this data(set) or resource is available or supported. More specific parameter names should be used by specific OWS specifications wherever applicable. More than one such parameter can be included for different purposes. </documentation>
+		</annotation>
+	</element>
+	<!-- ==========================================================
+	The following elements could be added to the IdentificationType when useful for a 
+	specific OWS. In addition the PointOfContact element in ows19115subset.xsd could 
+	be added.
+	============================================================= -->
+	<element name="AccessConstraints" type="string">
+		<annotation>
+			<documentation>Access constraint applied to assure the protection of privacy or intellectual property, or any other restrictions on retrieving or using data from or otherwise using this server. The reserved value NONE (case insensitive) shall be used to mean no access constraints are imposed. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="Fees" type="string">
+		<annotation>
+			<documentation>Fees and terms for retrieving data from or otherwise using this server, including the monetary units as specified in ISO 4217. The reserved value NONE (case insensitive) shall be used to mean no fees or terms. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="Language" type="language">
+		<annotation>
+			<documentation>Identifier of a language used by the data(set) contents. This language identifier shall be as specified in IETF RFC 1766. When this element is omitted, the language used is not identified. </documentation>
+		</annotation>
+	</element>
+</schema>
diff --git a/pycsw/schemas/ogc/ows/1.0.0/owsExceptionReport.xsd b/pycsw/schemas/ogc/ows/1.0.0/owsExceptionReport.xsd
new file mode 100644
index 0000000..eda60e4
--- /dev/null
+++ b/pycsw/schemas/ogc/ows/1.0.0/owsExceptionReport.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows" 
+xmlns:ows="http://www.opengis.net/ows" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.0.0 2010-01-30" xml:lang="en">
+	<annotation>
+		<appinfo>owsExceptionReport.xsd 2010-01-30</appinfo>
+		<documentation>This XML Schema Document encodes the Exception Report response to all OWS operations.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="ExceptionReport">
+		<annotation>
+			<documentation>Report message returned to the client that requested any OWS operation when the server detects an error while processing that operation request. </documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element ref="ows:Exception" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Unordered list of one or more Exception elements that each describes an error. These Exception elements shall be interpreted by clients as being independent of one another (not hierarchical). </documentation>
+					</annotation>
+				</element>
+			</sequence>
+			<attribute name="version" type="string" use="required">
+				<annotation>
+					<documentation>Specification version for OWS operation. The string value shall contain one x.y.z "version" value (e.g., "2.1.3"). A version number shall contain three non-negative integers separated by decimal points, in the form "x.y.z". The integers y and z shall not exceed 99. Each version shall be for the Implementation Specification (document) and the associated XML Schemas to which requested operations will conform. An Implementation Specification version normally specifies XM [...]
+				</annotation>
+			</attribute>
+			<attribute name="language" type="language" use="optional">
+				<annotation>
+					<documentation>Identifier of the language used by all included exception text values. These language identifiers shall be as specified in IETF RFC 1766. When this attribute is omitted, the language used is not identified. </documentation>
+				</annotation>
+			</attribute>
+		</complexType>
+	</element>
+	<!-- ======================================================= -->
+	<element name="Exception" type="ows:ExceptionType"/>
+	<!-- ======================================================= -->
+	<complexType name="ExceptionType">
+		<annotation>
+			<documentation>An Exception element describes one detected error that a server chooses to convey to the client. </documentation>
+		</annotation>
+		<sequence>
+			<element name="ExceptionText" type="string" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Ordered sequence of text strings that describe this specific exception or error. The contents of these strings are left open to definition by each server implementation. A server is strongly encouraged to include at least one ExceptionText value, to provide more information about the detected error than provided by the exceptionCode. When included, multiple ExceptionText values shall provide hierarchical information about one detected error, with the most significant  [...]
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="exceptionCode" type="string" use="required">
+			<annotation>
+				<documentation>A code representing the type of this exception, which shall be selected from a set of exceptionCode values specified for the specific service operation and server. </documentation>
+			</annotation>
+		</attribute>
+		<attribute name="locator" type="string" use="optional">
+			<annotation>
+				<documentation>When included, this locator shall indicate to the client where an exception was encountered in servicing the client's operation request. This locator should be included whenever meaningful information can be provided by the server. The contents of this locator will depend on the specific exceptionCode and OWS service, and shall be specified in the OWS Implementation Specification. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+</schema>
diff --git a/pycsw/schemas/ogc/ows/1.0.0/owsGetCapabilities.xsd b/pycsw/schemas/ogc/ows/1.0.0/owsGetCapabilities.xsd
new file mode 100644
index 0000000..aa01b44
--- /dev/null
+++ b/pycsw/schemas/ogc/ows/1.0.0/owsGetCapabilities.xsd
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows" 
+xmlns:ows="http://www.opengis.net/ows" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.0.0 2010-01-30" xml:lang="en">
+	<annotation>
+		<appinfo>owsGetCapabilities.xsd 2010-01-30</appinfo>
+		<documentation>This XML Schema Document defines the GetCapabilities operation request and response XML elements and types, which are common to all OWSs. This XML Schema shall be edited by each OWS, for example, to specify a specific value for the "service" attribute.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsServiceIdentification.xsd"/>
+	<include schemaLocation="owsServiceProvider.xsd"/>
+	<include schemaLocation="owsOperationsMetadata.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<complexType name="CapabilitiesBaseType">
+		<annotation>
+			<documentation>XML encoded GetCapabilities operation response. This document provides clients with service metadata about a specific service instance, usually including metadata about the tightly-coupled data served. If the server does not implement the updateSequence parameter, the server shall always return the complete Capabilities document, without the updateSequence parameter. When the server implements the updateSequence parameter and the GetCapabilities operation request includ [...]
+		</annotation>
+		<sequence>
+			<element ref="ows:ServiceIdentification" minOccurs="0"/>
+			<element ref="ows:ServiceProvider" minOccurs="0"/>
+			<element ref="ows:OperationsMetadata" minOccurs="0"/>
+		</sequence>
+		<attribute name="version" type="ows:VersionType" use="required"/>
+		<attribute name="updateSequence" type="ows:UpdateSequenceType" use="optional"/>
+	</complexType>
+	<!-- =========================================================== -->
+	<element name="GetCapabilities" type="ows:GetCapabilitiesType"/>
+	<!-- =========================================================== -->
+	<complexType name="GetCapabilitiesType">
+		<annotation>
+			<documentation>XML encoded GetCapabilities operation request. This operation allows clients to retrieve service metadata about a specific service instance. In this XML encoding, no "request" parameter is included, since the element name specifies the specific operation. This base type shall be extended by each specific OWS to include the additional required "service" attribute, with the correct value for that OWS. </documentation>
+		</annotation>
+		<sequence>
+			<element name="AcceptVersions" type="ows:AcceptVersionsType" minOccurs="0">
+				<annotation>
+					<documentation>When omitted, server shall return latest supported version. </documentation>
+				</annotation>
+			</element>
+			<element name="Sections" type="ows:SectionsType" minOccurs="0">
+				<annotation>
+					<documentation>When omitted or not supported by server, server shall return complete service metadata (Capabilities) document. </documentation>
+				</annotation>
+			</element>
+			<element name="AcceptFormats" type="ows:AcceptFormatsType" minOccurs="0">
+				<annotation>
+					<documentation>When omitted or not supported by server, server shall return service metadata document using the MIME type "text/xml". </documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="updateSequence" type="ows:UpdateSequenceType" use="optional">
+			<annotation>
+				<documentation>When omitted or not supported by server, server shall return latest complete service metadata document. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+	<!-- =========================================================== -->
+	<!-- =========================================================== -->
+	<simpleType name="ServiceType">
+		<annotation>
+			<documentation>Service type identifier, where the string value is the OWS type abbreviation, such as "WMS" or "WFS". </documentation>
+		</annotation>
+		<restriction base="string"/>
+	</simpleType>
+	<!-- ========================================================= -->
+	<complexType name="AcceptVersionsType">
+		<annotation>
+			<documentation>Prioritized sequence of one or more specification versions accepted by client, with preferred versions listed first. See Version negotiation subclause for more information. </documentation>
+		</annotation>
+		<sequence>
+			<element name="Version" type="ows:VersionType" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<complexType name="SectionsType">
+		<annotation>
+			<documentation>Unordered list of zero or more names of requested sections in complete service metadata document. Each Section value shall contain an allowed section name as specified by each OWS specification. See Sections parameter subclause for more information.  </documentation>
+		</annotation>
+		<sequence>
+			<element name="Section" type="string" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+	<!-- =========================================================== -->
+	<simpleType name="UpdateSequenceType">
+		<annotation>
+			<documentation>Service metadata document version, having values that are "increased" whenever any change is made in service metadata document. Values are selected by each server, and are always opaque to clients. See updateSequence parameter use subclause for more information. </documentation>
+		</annotation>
+		<restriction base="string"/>
+	</simpleType>
+	<!-- =========================================================== -->
+	<complexType name="AcceptFormatsType">
+		<annotation>
+			<documentation>Prioritized sequence of zero or more GetCapabilities operation response formats desired by client, with preferred formats listed first. Each response format shall be identified by its MIME type. See AcceptFormats parameter use subclause for more information. </documentation>
+		</annotation>
+		<sequence>
+			<element name="OutputFormat" type="ows:MimeType" minOccurs="0" maxOccurs="unbounded"/>
+		</sequence>
+	</complexType>
+</schema>
diff --git a/pycsw/schemas/ogc/ows/1.0.0/owsOperationsMetadata.xsd b/pycsw/schemas/ogc/ows/1.0.0/owsOperationsMetadata.xsd
new file mode 100644
index 0000000..b7dcc88
--- /dev/null
+++ b/pycsw/schemas/ogc/ows/1.0.0/owsOperationsMetadata.xsd
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows" 
+xmlns:ows="http://www.opengis.net/ows" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.0.0 2010-01-30" xml:lang="en">
+	<annotation>
+		<appinfo>owsOperationsMetadata.xsd 2010-01-30</appinfo>
+		<documentation>This XML Schema Document encodes the basic contents of the "OperationsMetadata" section of the GetCapabilities operation response, also known as the Capabilities XML document.
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsCommon.xsd"/>
+	<include schemaLocation="ows19115subset.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="OperationsMetadata">
+		<annotation>
+			<documentation>Metadata about the operations and related abilities specified by this service and implemented by this server, including the URLs for operation requests. The basic contents of this section shall be the same for all OWS types, but individual services can add elements and/or change the optionality of optional elements. </documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element ref="ows:Operation" minOccurs="2" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Metadata for unordered list of all the (requests for) operations that this server interface implements. The list of required and optional operations implemented shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element name="Parameter" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of parameter valid domains that each apply to one or more operations which this server interface implements. The list of required and optional parameter domain limitations shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element name="Constraint" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this server. The list of required and optional constraints shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element ref="ows:ExtendedCapabilities" minOccurs="0"/>
+			</sequence>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<element name="ExtendedCapabilities" type="anyType">
+		<annotation>
+			<documentation>Individual software vendors and servers can use this element to provide metadata about any additional server abilities. </documentation>
+		</annotation>
+	</element>
+	<!-- ========================================================== -->
+	<element name="Operation">
+		<annotation>
+			<documentation>Metadata for one operation that this server implements. </documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element ref="ows:DCP" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Unordered list of Distributed Computing Platforms (DCPs) supported for this operation. At present, only the HTTP DCP is defined, so this element will appear only once. </documentation>
+					</annotation>
+				</element>
+				<element name="Parameter" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of parameter domains that each apply to this operation which this server implements. If one of these Parameter elements has the same "name" attribute as a Parameter element in the OperationsMetadata element, this Parameter element shall override the other one for this operation. The list of required and optional parameter domain limitations for this operation shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element name="Constraint" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this operation. If one of these Constraint elements has the same "name" attribute as a Constraint element in the OperationsMetadata element, this Constraint element shall override the other one for this operation. The list of required and optional constraints for this operation shall be specified in the Implementation Specification for this service. </documentation>
+					</annotation>
+				</element>
+				<element ref="ows:Metadata" minOccurs="0" maxOccurs="unbounded">
+					<annotation>
+						<documentation>Optional unordered list of additional metadata about this operation and its' implementation. A list of required and optional metadata elements for this operation should be specified in the Implementation Specification for this service. (Informative: This metadata might specify the operation request parameters or provide the XML Schemas for the operation request.) </documentation>
+					</annotation>
+				</element>
+			</sequence>
+			<attribute name="name" type="string" use="required">
+				<annotation>
+					<documentation>Name or identifier of this operation (request) (for example, GetCapabilities). The list of required and optional operations implemented shall be specified in the Implementation Specification for this service. </documentation>
+				</annotation>
+			</attribute>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<element name="DCP">
+		<annotation>
+			<documentation>Information for one distributed Computing Platform (DCP) supported for this operation. At present, only the HTTP DCP is defined, so this element only includes the HTTP element.
+</documentation>
+		</annotation>
+		<complexType>
+			<choice>
+				<element ref="ows:HTTP"/>
+			</choice>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<element name="HTTP">
+		<annotation>
+			<documentation>Connect point URLs for the HTTP Distributed Computing Platform (DCP). Normally, only one Get and/or one Post is included in this element. More than one Get and/or Post is allowed to support including alternative URLs for uses such as load balancing or backup. </documentation>
+		</annotation>
+		<complexType>
+			<choice maxOccurs="unbounded">
+				<element name="Get" type="ows:RequestMethodType">
+					<annotation>
+						<documentation>Connect point URL prefix and any constraints for the HTTP "Get" request method for this operation request. </documentation>
+					</annotation>
+				</element>
+				<element name="Post" type="ows:RequestMethodType">
+					<annotation>
+						<documentation>Connect point URL and any constraints for the HTTP "Post" request method for this operation request. </documentation>
+					</annotation>
+				</element>
+			</choice>
+		</complexType>
+	</element>
+	<!-- ========================================================== -->
+	<complexType name="RequestMethodType">
+		<annotation>
+			<documentation>Connect point URL and any constraints for this HTTP request method for this operation request. In the OnlineResourceType, the xlink:href attribute in the xlink:simpleAttrs attribute group shall be used to contain this URL. The other attributes in the xlink:simpleAttrs attribute group should not be used. </documentation>
+		</annotation>
+		<complexContent>
+			<extension base="ows:OnlineResourceType">
+				<sequence>
+					<element name="Constraint" type="ows:DomainType" minOccurs="0" maxOccurs="unbounded">
+						<annotation>
+							<documentation>Optional unordered list of valid domain constraints on non-parameter quantities that each apply to this request method for this operation. If one of these Constraint elements has the same "name" attribute as a Constraint element in the OperationsMetadata or Operation element, this Constraint element shall override the other one for this operation. The list of required and optional constraints for this request method for this operation shall be specified in the Imple [...]
+						</annotation>
+					</element>
+				</sequence>
+			</extension>
+		</complexContent>
+	</complexType>
+	<!-- ========================================================== -->
+	<complexType name="DomainType">
+		<annotation>
+			<documentation>Valid domain (or set of values) of one parameter or other quantity used by this server. A non-parameter quantity may not be explicitly represented in the server software. (Informative: An example is the outputFormat parameter of a WFS. Each WFS server should provide a Parameter element for the outputFormat parameter that lists the supported output formats, such as GML2, GML3, etc. as the allowed "Value" elements.) </documentation>
+		</annotation>
+		<sequence>
+			<element name="Value" type="string" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Unordered list of all the valid values for this parameter or other quantity. For those parameters that contain a list or sequence of values, these values shall be for individual values in the list. The allowed set of values and the allowed server restrictions on that set of values shall be specified in the Implementation Specification for this service. </documentation>
+				</annotation>
+			</element>
+			<element ref="ows:Metadata" minOccurs="0" maxOccurs="unbounded">
+				<annotation>
+					<documentation>Optional unordered list of additional metadata about this parameter. A list of required and optional metadata elements for this domain should be specified in the Implementation Specification for this service. (Informative: This metadata might specify the meanings of the valid values.) </documentation>
+				</annotation>
+			</element>
+		</sequence>
+		<attribute name="name" type="string" use="required">
+			<annotation>
+				<documentation>Name or identifier of this parameter or other quantity. </documentation>
+			</annotation>
+		</attribute>
+	</complexType>
+</schema>
diff --git a/pycsw/schemas/ogc/ows/1.0.0/owsServiceIdentification.xsd b/pycsw/schemas/ogc/ows/1.0.0/owsServiceIdentification.xsd
new file mode 100644
index 0000000..9c91c81
--- /dev/null
+++ b/pycsw/schemas/ogc/ows/1.0.0/owsServiceIdentification.xsd
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows" 
+xmlns:ows="http://www.opengis.net/ows" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.0.0 2010-01-30" xml:lang="en">
+	<annotation>
+		<appinfo>owsServiceIdentification.xsd 2010-01-30</appinfo>
+		<documentation>This XML Schema Document encodes the common "ServiceIdentification" section of the GetCapabilities operation response, known as the Capabilities XML document. This section encodes the SV_ServiceIdentification class of ISO 19119 (OGC Abstract Specification Topic 12).
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="owsDataIdentification.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="ServiceIdentification">
+		<annotation>
+			<documentation>General metadata for this specific server. This XML Schema of this section shall be the same for all OWS. </documentation>
+		</annotation>
+		<complexType>
+			<complexContent>
+				<extension base="ows:DescriptionType">
+					<sequence>
+						<element name="ServiceType" type="ows:CodeType">
+							<annotation>
+								<documentation>A service type name from a registry of services. For example, the values of the codeSpace URI and name and code string may be "OGC" and "catalogue." This type name is normally used for machine-to-machine communication. </documentation>
+							</annotation>
+						</element>
+						<element name="ServiceTypeVersion" type="ows:VersionType" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Unordered list of one or more versions of this service type implemented by this server. This information is not adequate for version negotiation, and shall not be used for that purpose. </documentation>
+							</annotation>
+						</element>
+						<element ref="ows:Fees" minOccurs="0">
+							<annotation>
+								<documentation>If this element is omitted, no meaning is implied. </documentation>
+							</annotation>
+						</element>
+						<element ref="ows:AccessConstraints" minOccurs="0" maxOccurs="unbounded">
+							<annotation>
+								<documentation>Unordered list of access constraints applied to assure the protection of privacy or intellectual property, and any other restrictions on retrieving or using data from or otherwise using this server. The reserved value NONE (case insensitive) shall be used to mean no access constraints are imposed. If this element is omitted, no meaning is implied. </documentation>
+							</annotation>
+						</element>
+					</sequence>
+				</extension>
+			</complexContent>
+		</complexType>
+	</element>
+</schema>
diff --git a/pycsw/schemas/ogc/ows/1.0.0/owsServiceProvider.xsd b/pycsw/schemas/ogc/ows/1.0.0/owsServiceProvider.xsd
new file mode 100644
index 0000000..17c3dba
--- /dev/null
+++ b/pycsw/schemas/ogc/ows/1.0.0/owsServiceProvider.xsd
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema targetNamespace="http://www.opengis.net/ows" 
+xmlns:ows="http://www.opengis.net/ows" 
+xmlns="http://www.w3.org/2001/XMLSchema" 
+elementFormDefault="qualified" version="1.0.0 2010-01-30" xml:lang="en">
+	<annotation>
+		<appinfo>owsServiceProvider.xsd 2010-01-30</appinfo>
+		<documentation>This XML Schema Document encodes the common "ServiceProvider" section of the GetCapabilities operation response, known as the Capabilities XML document. This section encodes the SV_ServiceProvider class of ISO 19119 (OGC Abstract Specification Topic 12).
+		
+		OWS is an OGC Standard.
+		Copyright (c) 2005,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+		To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+		</documentation>
+	</annotation>
+	<!-- ==============================================================
+		includes and imports
+	============================================================== -->
+	<include schemaLocation="ows19115subset.xsd"/>
+	<!-- ==============================================================
+		elements and types
+	============================================================== -->
+	<element name="ServiceProvider">
+		<annotation>
+			<documentation>Metadata about the organization that provides this specific service instance or server. </documentation>
+		</annotation>
+		<complexType>
+			<sequence>
+				<element name="ProviderName" type="string">
+					<annotation>
+						<documentation>A unique identifier for the service provider organization. </documentation>
+					</annotation>
+				</element>
+				<element name="ProviderSite" type="ows:OnlineResourceType" minOccurs="0">
+					<annotation>
+						<documentation>Reference to the most relevant web site of the service provider. </documentation>
+					</annotation>
+				</element>
+				<element name="ServiceContact" type="ows:ResponsiblePartySubsetType">
+					<annotation>
+						<documentation>Information for contacting the service provider. The OnlineResource element within this ServiceContact element should not be used to reference a web site of the service provider. </documentation>
+					</annotation>
+				</element>
+			</sequence>
+		</complexType>
+	</element>
+</schema>
diff --git a/pycsw/schemas/w3c/1999/xlink.xsd b/pycsw/schemas/w3c/1999/xlink.xsd
new file mode 100644
index 0000000..f9e14da
--- /dev/null
+++ b/pycsw/schemas/w3c/1999/xlink.xsd
@@ -0,0 +1,271 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink">
+ 
+ <xs:annotation>
+  <xs:documentation>This schema document provides attribute declarations and
+attribute group, complex type and simple type definitions which can be used in
+the construction of user schemas to define the structure of particular linking
+constructs, e.g.
+<![CDATA[
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns:xl="http://www.w3.org/1999/xlink">
+
+ <xs:import namespace="http://www.w3.org/1999/xlink"
+            location="http://www.w3.org/1999/xlink.xsd">
+
+ <xs:element name="mySimple">
+  <xs:complexType>
+   ...
+   <xs:attributeGroup ref="xl:simpleAttrs"/>
+   ...
+  </xs:complexType>
+ </xs:element>
+ ...
+</xs:schema>]]></xs:documentation>
+ </xs:annotation>
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="../2001/xml.xsd"/>
+
+ <xs:attribute name="type" type="xlink:typeType"/>
+
+ <xs:simpleType name="typeType">
+  <xs:restriction base="xs:token">
+   <xs:enumeration value="simple"/>
+   <xs:enumeration value="extended"/>
+   <xs:enumeration value="title"/>
+   <xs:enumeration value="resource"/>
+   <xs:enumeration value="locator"/>
+   <xs:enumeration value="arc"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="href" type="xlink:hrefType"/>
+
+ <xs:simpleType name="hrefType">
+  <xs:restriction base="xs:anyURI"/>
+ </xs:simpleType>
+
+ <xs:attribute name="role" type="xlink:roleType"/>
+
+ <xs:simpleType name="roleType">
+  <xs:restriction base="xs:anyURI">
+   <xs:minLength value="1"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="arcrole" type="xlink:arcroleType"/>
+
+ <xs:simpleType name="arcroleType">
+  <xs:restriction base="xs:anyURI">
+   <xs:minLength value="1"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="title" type="xlink:titleAttrType"/>
+
+ <xs:simpleType name="titleAttrType">
+  <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+
+ <xs:attribute name="show" type="xlink:showType"/>
+
+ <xs:simpleType name="showType">
+  <xs:restriction base="xs:token">
+   <xs:enumeration value="new"/>
+   <xs:enumeration value="replace"/>
+   <xs:enumeration value="embed"/>
+   <xs:enumeration value="other"/>
+   <xs:enumeration value="none"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="actuate" type="xlink:actuateType"/>
+
+ <xs:simpleType name="actuateType">
+  <xs:restriction base="xs:token">
+   <xs:enumeration value="onLoad"/>
+   <xs:enumeration value="onRequest"/>
+   <xs:enumeration value="other"/>
+   <xs:enumeration value="none"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:attribute name="label" type="xlink:labelType"/>
+
+ <xs:simpleType name="labelType">
+  <xs:restriction base="xs:NCName"/>
+ </xs:simpleType>
+
+ <xs:attribute name="from" type="xlink:fromType"/>
+
+ <xs:simpleType name="fromType">
+  <xs:restriction base="xs:NCName"/>
+ </xs:simpleType>
+
+ <xs:attribute name="to" type="xlink:toType"/>
+
+ <xs:simpleType name="toType">
+  <xs:restriction base="xs:NCName"/>
+ </xs:simpleType>
+
+ <xs:attributeGroup name="simpleAttrs">
+  <xs:attribute ref="xlink:type" fixed="simple"/>
+  <xs:attribute ref="xlink:href"/>
+  <xs:attribute ref="xlink:role"/>
+  <xs:attribute ref="xlink:arcrole"/>
+  <xs:attribute ref="xlink:title"/>
+  <xs:attribute ref="xlink:show"/>
+  <xs:attribute ref="xlink:actuate"/>
+ </xs:attributeGroup>
+
+ <xs:group name="simpleModel">
+  <xs:sequence>
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType mixed="true" name="simple">
+  <xs:annotation>
+   <xs:documentation>
+    Intended for use as the type of user-declared elements to make them
+    simple links.
+   </xs:documentation>
+  </xs:annotation>
+  <xs:group ref="xlink:simpleModel"/>
+  <xs:attributeGroup ref="xlink:simpleAttrs"/>
+ </xs:complexType>
+
+ <xs:attributeGroup name="extendedAttrs">
+  <xs:attribute ref="xlink:type" fixed="extended" use="required"/>
+  <xs:attribute ref="xlink:role"/>
+  <xs:attribute ref="xlink:title"/>
+ </xs:attributeGroup>
+
+ <xs:group name="extendedModel">
+   <xs:choice>
+    <xs:element ref="xlink:title"/>
+    <xs:element ref="xlink:resource"/>
+    <xs:element ref="xlink:locator"/>
+    <xs:element ref="xlink:arc"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:complexType name="extended">
+  <xs:annotation>
+   <xs:documentation>
+    Intended for use as the type of user-declared elements to make them
+    extended links.
+    Note that the elements referenced in the content model are all abstract.
+    The intention is that by simply declaring elements with these as their
+    substitutionGroup, all the right things will happen.
+   </xs:documentation>
+  </xs:annotation>
+  <xs:group ref="xlink:extendedModel" minOccurs="0" maxOccurs="unbounded"/>
+  <xs:attributeGroup ref="xlink:extendedAttrs"/>
+ </xs:complexType>
+
+ <xs:element name="title" type="xlink:titleEltType" abstract="true"/>
+
+ <xs:attributeGroup name="titleAttrs">
+  <xs:attribute ref="xlink:type" fixed="title" use="required"/>
+  <xs:attribute ref="xml:lang">
+   <xs:annotation>
+    <xs:documentation>
+     xml:lang is not required, but provides much of the
+     motivation for title elements in addition to attributes, and so
+     is provided here for convenience.
+    </xs:documentation>
+   </xs:annotation>
+  </xs:attribute>
+ </xs:attributeGroup>
+
+ <xs:group name="titleModel">
+  <xs:sequence>
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType mixed="true" name="titleEltType">
+  <xs:group ref="xlink:titleModel"/>
+  <xs:attributeGroup ref="xlink:titleAttrs"/>
+ </xs:complexType>
+
+ <xs:element name="resource" type="xlink:resourceType" abstract="true"/>
+
+ <xs:attributeGroup name="resourceAttrs">
+  <xs:attribute ref="xlink:type" fixed="resource" use="required"/>
+  <xs:attribute ref="xlink:role"/>
+  <xs:attribute ref="xlink:title"/>
+  <xs:attribute ref="xlink:label"/>
+ </xs:attributeGroup>
+
+ <xs:group name="resourceModel">
+  <xs:sequence>
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType mixed="true" name="resourceType">
+  <xs:group ref="xlink:resourceModel"/>
+  <xs:attributeGroup ref="xlink:resourceAttrs"/>
+ </xs:complexType>
+
+ <xs:element name="locator" type="xlink:locatorType" abstract="true"/>
+
+ <xs:attributeGroup name="locatorAttrs">
+  <xs:attribute ref="xlink:type" fixed="locator" use="required"/>
+  <xs:attribute ref="xlink:href" use="required"/>
+  <xs:attribute ref="xlink:role"/>
+  <xs:attribute ref="xlink:title"/>
+  <xs:attribute ref="xlink:label">
+   <xs:annotation>
+    <xs:documentation>
+     label is not required, but locators have no particular
+     XLink function if they are not labeled.
+    </xs:documentation>
+   </xs:annotation>
+  </xs:attribute>
+ </xs:attributeGroup>
+
+ <xs:group name="locatorModel">
+  <xs:sequence>
+   <xs:element ref="xlink:title" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType name="locatorType">
+  <xs:group ref="xlink:locatorModel"/>
+  <xs:attributeGroup ref="xlink:locatorAttrs"/>
+ </xs:complexType>
+
+ <xs:element name="arc" type="xlink:arcType" abstract="true"/>
+
+ <xs:attributeGroup name="arcAttrs">
+  <xs:attribute ref="xlink:type" fixed="arc" use="required"/>
+  <xs:attribute ref="xlink:arcrole"/>
+  <xs:attribute ref="xlink:title"/>
+  <xs:attribute ref="xlink:show"/>
+  <xs:attribute ref="xlink:actuate"/>
+  <xs:attribute ref="xlink:from"/>
+  <xs:attribute ref="xlink:to">
+   <xs:annotation>
+    <xs:documentation>
+     from and to have default behavior when values are missing
+    </xs:documentation>
+   </xs:annotation>
+  </xs:attribute>
+ </xs:attributeGroup>
+
+ <xs:group name="arcModel">
+  <xs:sequence>
+   <xs:element ref="xlink:title" minOccurs="0" maxOccurs="unbounded"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:complexType name="arcType">
+  <xs:group ref="xlink:arcModel"/>
+  <xs:attributeGroup ref="xlink:arcAttrs"/>
+ </xs:complexType>
+
+</xs:schema>
+
diff --git a/pycsw/schemas/w3c/2001/xml.xsd b/pycsw/schemas/w3c/2001/xml.xsd
new file mode 100644
index 0000000..aea7d0d
--- /dev/null
+++ b/pycsw/schemas/w3c/2001/xml.xsd
@@ -0,0 +1,287 @@
+<?xml version='1.0'?>
+<?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" 
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns   ="http://www.w3.org/1999/xhtml"
+  xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   <div>
+    <h1>About the XML namespace</h1>
+
+    <div class="bodytext">
+     <p>
+      This schema document describes the XML namespace, in a form
+      suitable for import by other schema documents.
+     </p>
+     <p>
+      See <a href="http://www.w3.org/XML/1998/namespace.html">
+      http://www.w3.org/XML/1998/namespace.html</a> and
+      <a href="http://www.w3.org/TR/REC-xml">
+      http://www.w3.org/TR/REC-xml</a> for information 
+      about this namespace.
+     </p>
+     <p>
+      Note that local names in this namespace are intended to be
+      defined only by the World Wide Web Consortium or its subgroups.
+      The names currently defined in this namespace are listed below.
+      They should not be used with conflicting semantics by any Working
+      Group, specification, or document instance.
+     </p>
+     <p>   
+      See further below in this document for more information about <a
+      href="#usage">how to refer to this schema document from your own
+      XSD schema documents</a> and about <a href="#nsversioning">the
+      namespace-versioning policy governing this schema document</a>.
+     </p>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>lang (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose value
+       is a language code for the natural language of the content of
+       any element; its value is inherited.  This name is reserved
+       by virtue of its definition in the XML specification.</p>
+     
+    </div>
+    <div>
+     <h4>Notes</h4>
+     <p>
+      Attempting to install the relevant ISO 2- and 3-letter
+      codes as the enumerated possible values is probably never
+      going to be a realistic possibility.  
+     </p>
+     <p>
+      See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
+       http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
+      and the IANA language subtag registry at
+      <a href="http://www.iana.org/assignments/language-subtag-registry">
+       http://www.iana.org/assignments/language-subtag-registry</a>
+      for further information.
+     </p>
+     <p>
+      The union allows for the 'un-declaration' of xml:lang with
+      the empty string.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:union memberTypes="xs:language">
+    <xs:simpleType>    
+     <xs:restriction base="xs:string">
+      <xs:enumeration value=""/>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:union>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>space (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose
+       value is a keyword indicating what whitespace processing
+       discipline is intended for the content of the element; its
+       value is inherited.  This name is reserved by virtue of its
+       definition in the XML specification.</p>
+     
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+ 
+ <xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>base (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose value
+       provides a URI to be used as the base for interpreting any
+       relative URIs in the scope of the element on which it
+       appears; its value is inherited.  This name is reserved
+       by virtue of its definition in the XML Base specification.</p>
+     
+     <p>
+      See <a
+      href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
+      for information about this attribute.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+ 
+ <xs:attribute name="id" type="xs:ID">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>id (as an attribute name)</h3> 
+      <p>
+       denotes an attribute whose value
+       should be interpreted as if declared to be of type ID.
+       This name is reserved by virtue of its definition in the
+       xml:id specification.</p>
+     
+     <p>
+      See <a
+      href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
+      for information about this attribute.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+  <xs:attribute ref="xml:id"/>
+ </xs:attributeGroup>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div>
+   
+    <h3>Father (in any context at all)</h3> 
+
+    <div class="bodytext">
+     <p>
+      denotes Jon Bosak, the chair of 
+      the original XML Working Group.  This name is reserved by 
+      the following decision of the W3C XML Plenary and 
+      XML Coordination groups:
+     </p>
+     <blockquote>
+       <p>
+	In appreciation for his vision, leadership and
+	dedication the W3C XML Plenary on this 10th day of
+	February, 2000, reserves for Jon Bosak in perpetuity
+	the XML name "xml:Father".
+       </p>
+     </blockquote>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div xml:id="usage" id="usage">
+    <h2><a name="usage">About this schema document</a></h2>
+
+    <div class="bodytext">
+     <p>
+      This schema defines attributes and an attribute group suitable
+      for use by schemas wishing to allow <code>xml:base</code>,
+      <code>xml:lang</code>, <code>xml:space</code> or
+      <code>xml:id</code> attributes on elements they define.
+     </p>
+     <p>
+      To enable this, such a schema must import this schema for
+      the XML namespace, e.g. as follows:
+     </p>
+     <pre>
+          <schema . . .>
+           . . .
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+     </pre>
+     <p>
+      or
+     </p>
+     <pre>
+           <import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+     </pre>
+     <p>
+      Subsequently, qualified reference to any of the attributes or the
+      group defined below will have the desired effect, e.g.
+     </p>
+     <pre>
+          <type . . .>
+           . . .
+           <attributeGroup ref="xml:specialAttrs"/>
+     </pre>
+     <p>
+      will define a type which will schema-validate an instance element
+      with any of those attributes.
+     </p>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div id="nsversioning" xml:id="nsversioning">
+    <h2><a name="nsversioning">Versioning policy for this schema document</a></h2>
+    <div class="bodytext">
+     <p>
+      In keeping with the XML Schema WG's standard versioning
+      policy, this schema document will persist at
+      <a href="http://www.w3.org/2009/01/xml.xsd">
+       http://www.w3.org/2009/01/xml.xsd</a>.
+     </p>
+     <p>
+      At the date of issue it can also be found at
+      <a href="http://www.w3.org/2001/xml.xsd">
+       http://www.w3.org/2001/xml.xsd</a>.
+     </p>
+     <p>
+      The schema document at that URI may however change in the future,
+      in order to remain compatible with the latest version of XML
+      Schema itself, or with the XML namespace itself.  In other words,
+      if the XML Schema or XML namespaces change, the version of this
+      document at <a href="http://www.w3.org/2001/xml.xsd">
+       http://www.w3.org/2001/xml.xsd 
+      </a> 
+      will change accordingly; the version at 
+      <a href="http://www.w3.org/2009/01/xml.xsd">
+       http://www.w3.org/2009/01/xml.xsd 
+      </a> 
+      will not change.
+     </p>
+     <p>
+      Previous dated (and unchanging) versions of this schema 
+      document are at:
+     </p>
+     <ul>
+      <li><a href="http://www.w3.org/2009/01/xml.xsd">
+	http://www.w3.org/2009/01/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2007/08/xml.xsd">
+	http://www.w3.org/2007/08/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2004/10/xml.xsd">
+	http://www.w3.org/2004/10/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2001/03/xml.xsd">
+	http://www.w3.org/2001/03/xml.xsd</a></li>
+     </ul>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+</xs:schema>
+
diff --git a/pycsw/server.py b/pycsw/server.py
new file mode 100644
index 0000000..60a479b
--- /dev/null
+++ b/pycsw/server.py
@@ -0,0 +1,2557 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#          Angelos Tzotsos <tzotsos at gmail.com>
+#
+# Copyright (c) 2010 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import os
+import sys
+import cgi
+from urllib2 import quote, unquote
+import urlparse
+from cStringIO import StringIO
+from ConfigParser import SafeConfigParser
+from lxml import etree
+from pycsw.plugins.profiles import profile as pprofile
+import pycsw.plugins.outputschemas
+from pycsw import config, fes, log, metadata, util, sru, opensearch
+import logging
+
+LOGGER = logging.getLogger(__name__)
+
+
+class Csw(object):
+    ''' Base CSW server '''
+    def __init__(self, rtconfig=None, env=None):
+        ''' Initialize CSW '''
+
+        if not env:
+            self.environ = os.environ
+        else:
+            self.environ = env
+
+        self.context = config.StaticContext()
+
+        # Lazy load this when needed
+        # (it will permanently update global cfg namespaces)
+        self.sruobj = None
+        self.opensearchobj = None
+
+        # init kvp
+        self.kvp = {}
+
+        self.mode = 'csw'
+        self.async = False
+        self.soap = False
+        self.request = None
+        self.exception = False
+        self.profiles = None
+        self.outputschemas = {}
+        self.mimetype = 'application/xml; charset=UTF-8'
+        self.encoding = 'UTF-8'
+        self.pretty_print = 0
+        self.domainquerytype = 'list'
+        self.orm = 'django'
+        self.language = {'639_code': 'en', 'text': 'english'}
+
+        # load user configuration
+        try:
+            if isinstance(rtconfig, SafeConfigParser):  # serialized already
+                self.config = rtconfig
+            else:
+                self.config = SafeConfigParser()
+                if isinstance(rtconfig, dict):  # dictionary
+                    for section, options in rtconfig.iteritems():
+                        self.config.add_section(section)
+                        for k, v in options.iteritems():
+                            self.config.set(section, k, v)
+                else:  # configuration file
+                    import codecs
+                    with codecs.open(rtconfig, encoding='utf-8') as scp:
+                        self.config.readfp(scp)
+        except Exception, err:
+            self.response = self.exceptionreport(
+            'NoApplicableCode', 'service',
+            'Error opening configuration %s' % rtconfig)
+            return
+
+        # set server.home safely
+        # TODO: make this more abstract
+        self.config.set('server', 'home', os.path.dirname(
+        os.path.join(os.path.dirname(__file__), '..')))
+
+        self.context.pycsw_home = self.config.get('server', 'home')
+
+        # configure transaction support, if specified in config
+        self._gen_manager()
+
+        log.setup_logger(self.config)
+
+        LOGGER.debug('running configuration %s' % rtconfig)
+        LOGGER.debug(str(self.environ['QUERY_STRING']))
+
+        # generate domain model
+        # NOTE: We should probably avoid this sort of mutable state for WSGI
+        if 'GetDomain' not in self.context.model['operations']:
+            self.context.model['operations']['GetDomain'] = \
+            self.context.gen_domains()
+
+        # set OGC schemas location
+        if not self.config.has_option('server', 'ogc_schemas_base'):
+            self.config.set('server', 'ogc_schemas_base',
+            self.context.ogc_schemas_base)
+
+        # set mimetype
+        if self.config.has_option('server', 'mimetype'):
+            self.mimetype = self.config.get('server', 'mimetype').encode()
+
+        # set encoding
+        if self.config.has_option('server', 'encoding'):
+            self.encoding = self.config.get('server', 'encoding')
+
+        # set domainquerytype
+        if self.config.has_option('server', 'domainquerytype'):
+            self.domainquerytype = self.config.get('server', 'domainquerytype')
+
+        # set XML pretty print
+        if (self.config.has_option('server', 'pretty_print') and
+        self.config.get('server', 'pretty_print') == 'true'):
+            self.pretty_print = 1
+        
+        # set Spatial Ranking option
+        if (self.config.has_option('server', 'spatial_ranking') and
+        self.config.get('server', 'spatial_ranking') == 'true'):
+            util.ranking_enabled = True
+
+        # set language default
+        if (self.config.has_option('server', 'language')):
+            try:
+                LOGGER.info('Setting language')
+                lang_code = self.config.get('server', 'language').split('-')[0]
+                self.language['639_code'] = lang_code
+                self.language['text'] = self.context.languages[lang_code]
+            except:
+                pass
+
+        # generate distributed search model, if specified in config
+        if self.config.has_option('server', 'federatedcatalogues'):
+            LOGGER.debug('Configuring distributed search.')
+
+            self.context.model['constraints']['FederatedCatalogues'] = \
+            {'values': []}
+
+            for fedcat in \
+            self.config.get('server', 'federatedcatalogues').split(','):
+                self.context.model\
+                ['constraints']['FederatedCatalogues']['values'].append(fedcat)
+
+        LOGGER.debug('Configuration: %s.' % self.config)
+        LOGGER.debug('Model: %s.' % self.context.model)
+
+        # load user-defined mappings if they exist
+        if self.config.has_option('repository', 'mappings'):
+            # override default repository mappings
+            try:
+                import imp
+                module = self.config.get('repository','mappings')
+                modulename = '%s' % \
+                os.path.splitext(module)[0].replace(os.sep, '.')
+                LOGGER.debug(
+                'Loading custom repository mappings from %s.' % module)
+                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:
+                self.response = self.exceptionreport(
+                'NoApplicableCode', 'service',
+                'Could not load repository.mappings %s' % str(err))
+
+        # load profiles
+        LOGGER.debug('Loading profiles.')
+
+        if self.config.has_option('server', 'profiles'):
+            self.profiles = pprofile.load_profiles(
+            os.path.join('pycsw', 'plugins', 'profiles'),
+            pprofile.Profile,
+            self.config.get('server', 'profiles'))
+
+            for prof in self.profiles['plugins'].keys():
+                tmp = self.profiles['plugins'][prof](self.context.model,
+                self.context.namespaces, self.context)
+
+                key = tmp.outputschema  # to ref by outputschema
+                self.profiles['loaded'][key] = tmp
+                self.profiles['loaded'][key].extend_core(
+                self.context.model, self.context.namespaces,
+                self.config)
+
+            LOGGER.debug('Profiles loaded: %s.' %
+            self.profiles['loaded'].keys())
+
+        # load profiles
+        LOGGER.debug('Loading outputschemas.')
+
+        for osch in pycsw.plugins.outputschemas.__all__:
+            mod = getattr(__import__('pycsw.plugins.outputschemas.%s' % osch).plugins.outputschemas, osch)
+            self.context.model['operations']['GetRecords']['parameters']['outputSchema']['values'].append(mod.NAMESPACE)
+            self.context.model['operations']['GetRecordById']['parameters']['outputSchema']['values'].append(mod.NAMESPACE)
+            if 'Harvest' in self.context.model['operations']:
+                self.context.model['operations']['Harvest']['parameters']['ResourceType']['values'].append(mod.NAMESPACE)
+            self.outputschemas[mod.NAMESPACE] = mod
+
+        LOGGER.debug('Outputschemas loaded: %s.' % self.outputschemas)
+
+        LOGGER.debug('Namespaces: %s' % self.context.namespaces)
+
+        # init repository
+        # look for tablename, set 'records' as default
+        if not self.config.has_option('repository', 'table'):
+            self.config.set('repository', 'table', 'records')
+
+        repo_filter = None
+        if self.config.has_option('repository', 'filter'):
+            repo_filter = self.config.get('repository', 'filter')
+
+        if (self.config.has_option('repository', 'source') and
+            self.config.get('repository', 'source') == 'geonode'):
+
+            # load geonode repository
+            from pycsw.plugins.repository.geonode import geonode_
+
+            try:
+                self.repository = \
+                geonode_.GeoNodeRepository(self.context)
+                LOGGER.debug('GeoNode repository loaded (geonode): %s.' % \
+                self.repository.dbtype)
+            except Exception, err:
+                self.response = self.exceptionreport(
+                'NoApplicableCode', 'service',
+                'Could not load repository (geonode): %s' % str(err))
+
+        elif (self.config.has_option('repository', 'source') and
+            self.config.get('repository', 'source') == 'odc'):
+
+            # load odc repository
+            from pycsw.plugins.repository.odc import odc
+
+            try:
+                self.repository = \
+                odc.OpenDataCatalogRepository(self.context)
+                LOGGER.debug('OpenDataCatalog repository loaded (geonode): %s.' % \
+                self.repository.dbtype)
+            except Exception, err:
+                self.response = self.exceptionreport(
+                'NoApplicableCode', 'service',
+                'Could not load repository (odc): %s' % str(err))
+
+        else:  # load default repository
+            self.orm = 'sqlalchemy'
+            from pycsw import repository
+            try:
+                self.repository = \
+                repository.Repository(self.config.get('repository', 'database'),
+                self.context, self.environ.get('local.app_root', None),
+                self.config.get('repository', 'table'), repo_filter)
+                LOGGER.debug('Repository loaded (local): %s.' \
+                % self.repository.dbtype)
+            except Exception, err:
+                self.response = self.exceptionreport(
+                'NoApplicableCode', 'service',
+                'Could not load repository (local): %s' % str(err))
+
+    def expand_path(self, path):
+        ''' return safe path for WSGI environments '''
+        if 'local.app_root' in self.environ and not os.path.isabs(path):
+            return os.path.join(self.environ['local.app_root'], path)
+        else:
+            return path
+
+    def dispatch_cgi(self):
+        ''' CGI handler '''
+
+        if hasattr(self,'response'):
+            return self._write_response()
+
+        LOGGER.debug('CGI mode detected')
+
+        cgifs = cgi.FieldStorage(keep_blank_values=1)
+
+        if cgifs.file:  # it's a POST request
+            postdata = cgifs.file.read()
+            self.requesttype = 'POST'
+            self.request = postdata
+            LOGGER.debug('Request type: POST.  Request:\n%s\n', self.request)
+            self.kvp = self.parse_postdata(postdata)
+
+        else:  # it's a GET request
+            self.requesttype = 'GET'
+            self.request = 'http://%s%s' % \
+            (self.environ['HTTP_HOST'], self.environ['REQUEST_URI'])
+            LOGGER.debug('Request type: GET.  Request:\n%s\n', self.request)
+            for key in cgifs.keys():
+                self.kvp[key.lower()] = cgifs[key].value
+
+        return self.dispatch()
+
+    def dispatch_wsgi(self):
+        ''' WSGI handler '''
+
+        if hasattr(self,'response'):
+            return self._write_response()
+
+        LOGGER.debug('WSGI mode detected')
+
+        if self.environ['REQUEST_METHOD'] == 'POST':
+            try:
+                request_body_size = int(self.environ.get('CONTENT_LENGTH', 0))
+            except (ValueError):
+                request_body_size = 0
+
+            postdata = self.environ['wsgi.input'].read(request_body_size)
+
+            self.requesttype = 'POST'
+            self.request = postdata
+            LOGGER.debug('Request type: POST.  Request:\n%s\n', self.request)
+            self.kvp = self.parse_postdata(postdata)
+
+        else:  # it's a GET request
+            self.requesttype = 'GET'
+
+            scheme = '%s://' % self.environ['wsgi.url_scheme']
+
+            if self.environ.get('HTTP_HOST'):
+                url = '%s%s' % (scheme, self.environ['HTTP_HOST'])
+            else:
+                url = '%s%s' % (scheme, self.environ['SERVER_NAME'])
+
+                if self.environ['wsgi.url_scheme'] == 'https':
+                    if self.environ['SERVER_PORT'] != '443':
+                        url += ':' + self.environ['SERVER_PORT']
+                else:
+                    if self.environ['SERVER_PORT'] != '80':
+                        url += ':' + self.environ['SERVER_PORT']
+
+            url += quote(self.environ.get('SCRIPT_NAME', ''))
+            url += quote(self.environ.get('PATH_INFO', ''))
+
+            if self.environ.get('QUERY_STRING'):
+                url += '?' + self.environ['QUERY_STRING']
+
+            self.request = url
+            LOGGER.debug('Request type: GET.  Request:\n%s\n', self.request)
+
+            pairs = self.environ.get('QUERY_STRING').split("&")
+
+            kvp = {}
+
+            for pairstr in pairs:
+                pair = pairstr.split("=")
+                pair[0] = pair[0].lower()
+                pair = [unquote(a) for a in pair]
+
+                if len(pair) is 1:
+                    kvp[pair[0]] = ""
+                else:
+                    kvp[pair[0]] = pair[1]
+
+            self.kvp = kvp
+
+        return self.dispatch()
+
+    def opensearch(self):
+        ''' enable OpenSearch '''
+        if not self.opensearchobj:
+            self.opensearchobj = opensearch.OpenSearch(self.context)
+
+        return self.opensearchobj
+
+    def sru(self):
+        ''' enable SRU '''
+        if not self.sruobj:
+            self.sruobj = sru.Sru(self.context)
+
+        return self.sruobj
+
+    def dispatch(self, writer=sys.stdout, write_headers=True):
+        ''' Handle incoming HTTP request '''
+
+        error = 0
+
+        if isinstance(self.kvp, str):  # it's an exception
+            error = 1
+            locator = 'service'
+            text = self.kvp
+            if (self.kvp.find('the document is not valid') != -1 or
+                self.kvp.find('document not well-formed') != -1):
+                code = 'NoApplicableCode'
+            else:
+                code = 'InvalidParameterValue'
+
+        LOGGER.debug('HTTP Headers:\n%s.' % self.environ)
+        LOGGER.debug('Parsed request parameters: %s' % self.kvp)
+
+        if (not isinstance(self.kvp, str) and
+        'mode' in self.kvp and self.kvp['mode'] == 'sru'):
+            self.mode = 'sru'
+            LOGGER.debug('SRU mode detected; processing request.')
+            self.kvp = self.sru().request_sru2csw(self.kvp)
+
+        if (not isinstance(self.kvp, str) and
+        'mode' in self.kvp and self.kvp['mode'] == 'opensearch'):
+            self.mode = 'opensearch'
+            LOGGER.debug('OpenSearch mode detected; processing request.')
+            self.kvp['outputschema'] = 'http://www.w3.org/2005/Atom'
+
+        if error == 0:
+            # test for the basic keyword values (service, version, request)
+            for k in ['service', 'version', 'request']:
+                if k not in self.kvp:
+                    if (k == 'version' and 'request' in self.kvp and
+                    self.kvp['request'] == 'GetCapabilities'):
+                        pass
+                    else:
+                        error   = 1
+                        locator = k
+                        code = 'MissingParameterValue'
+                        text = 'Missing keyword: %s' % k
+                        break
+
+            # test each of the basic keyword values
+            if error == 0:
+                # test service
+                if self.kvp['service'] != 'CSW':
+                    error = 1
+                    locator = 'service'
+                    code = 'InvalidParameterValue'
+                    text = 'Invalid value for service: %s.\
+                    Value MUST be CSW' % self.kvp['service']
+
+                # test version
+                if ('version' in self.kvp and
+                    util.get_version_integer(self.kvp['version']) !=
+                    util.get_version_integer('2.0.2') and
+                    self.kvp['request'] != 'GetCapabilities'):
+                    error = 1
+                    locator = 'version'
+                    code = 'InvalidParameterValue'
+                    text = 'Invalid value for version: %s.\
+                    Value MUST be 2.0.2' % self.kvp['version']
+
+                # check for GetCapabilities acceptversions
+                if 'acceptversions' in self.kvp:
+                    for vers in self.kvp['acceptversions'].split(','):
+                        if (util.get_version_integer(vers) ==
+                            util.get_version_integer('2.0.2')):
+                            break
+                        else:
+                            error = 1
+                            locator = 'acceptversions'
+                            code = 'VersionNegotiationFailed'
+                            text = 'Invalid parameter value in acceptversions:\
+                            %s. Value MUST be 2.0.2' % \
+                            self.kvp['acceptversions']
+
+                # test request
+                if self.kvp['request'] not in \
+                    self.context.model['operations'].keys():
+                    error = 1
+                    locator = 'request'
+                    if self.kvp['request'] in ['Transaction','Harvest']:
+                        code = 'OperationNotSupported'
+                        text = '%s operations are not supported' % \
+                        self.kvp['request']
+                    else:
+                        code = 'InvalidParameterValue'
+                        text = 'Invalid value for request: %s' % \
+                        self.kvp['request']
+
+        if error == 1:  # return an ExceptionReport
+            self.response = self.exceptionreport(code, locator, text)
+
+        else:  # process per the request value
+
+            if 'responsehandler' in self.kvp:
+                # set flag to process asynchronously
+                import threading
+                self.async = True
+                if ('requestid' not in self.kvp
+                or self.kvp['requestid'] is None):
+                    import uuid
+                    self.kvp['requestid'] = str(uuid.uuid4())
+
+            if self.kvp['request'] == 'GetCapabilities':
+                self.response = self.getcapabilities()
+            elif self.kvp['request'] == 'DescribeRecord':
+                self.response = self.describerecord()
+            elif self.kvp['request'] == 'GetDomain':
+                self.response = self.getdomain()
+            elif self.kvp['request'] == 'GetRecords':
+                if self.async:  # process asynchronously
+                    threading.Thread(target=self.getrecords).start()
+                    self.response = self._write_acknowledgement()
+                else:
+                    self.response = self.getrecords()
+            elif self.kvp['request'] == 'GetRecordById':
+                self.response = self.getrecordbyid()
+            elif self.kvp['request'] == 'GetRepositoryItem':
+                self.response = self.getrepositoryitem()
+            elif self.kvp['request'] == 'Transaction':
+                self.response = self.transaction()
+            elif self.kvp['request'] == 'Harvest':
+                if self.async:  # process asynchronously
+                    threading.Thread(target=self.harvest).start()
+                    self.response = self._write_acknowledgement()
+                else:
+                    self.response = self.harvest()
+            else:
+                self.response = self.exceptionreport('InvalidParameterValue',
+                'request', 'Invalid request parameter: %s' %
+                self.kvp['request'])
+
+        if self.mode == 'sru':
+            LOGGER.debug('SRU mode detected; processing response.')
+            self.response = self.sru().response_csw2sru(self.response,
+                            self.environ)
+        elif self.mode == 'opensearch':
+            LOGGER.debug('OpenSearch mode detected; processing response.')
+            self.response = self.opensearch().response_csw2opensearch(
+                            self.response, self.config)
+
+        return self._write_response()
+
+    def exceptionreport(self, code, locator, text):
+        ''' Generate ExceptionReport '''
+        self.exception = True
+
+        try:
+            language = self.config.get('server', 'language')
+            ogc_schemas_base = self.config.get('server', 'ogc_schemas_base')
+        except:
+            language = 'en-US'
+            ogc_schemas_base = self.context.ogc_schemas_base
+
+        node = etree.Element(util.nspath_eval('ows:ExceptionReport',
+        self.context.namespaces), nsmap=self.context.namespaces,
+        version='1.2.0', language=language)
+
+        node.attrib[util.nspath_eval('xsi:schemaLocation',
+        self.context.namespaces)] = \
+        '%s %s/ows/1.0.0/owsExceptionReport.xsd' % \
+        (self.context.namespaces['ows'], ogc_schemas_base)
+
+        exception = etree.SubElement(node, util.nspath_eval('ows:Exception',
+        self.context.namespaces),
+        exceptionCode=code, locator=locator)
+
+        etree.SubElement(exception,
+        util.nspath_eval('ows:ExceptionText',
+        self.context.namespaces)).text = text
+
+        return node
+
+    def getcapabilities(self):
+        ''' Handle GetCapabilities request '''
+        serviceidentification = True
+        serviceprovider = True
+        operationsmetadata = True
+        if 'sections' in self.kvp:
+            serviceidentification = False
+            serviceprovider = False
+            operationsmetadata = False
+            for section in self.kvp['sections'].split(','):
+                if section == 'ServiceIdentification':
+                    serviceidentification = True
+                if section == 'ServiceProvider':
+                    serviceprovider = True
+                if section == 'OperationsMetadata':
+                    operationsmetadata = True
+
+        # check extra parameters that may be def'd by profiles
+        if self.profiles is not None:
+            for prof in self.profiles['loaded'].keys():
+                result = \
+                self.profiles['loaded'][prof].check_parameters(self.kvp)
+                if result is not None:
+                    return self.exceptionreport(result['code'],
+                    result['locator'], result['text'])
+
+        # @updateSequence: get latest update to repository
+        try:
+            updatesequence = \
+            util.get_time_iso2unix(self.repository.query_latest_insert())
+        except:
+            updatesequence = None
+
+        node = etree.Element(util.nspath_eval('csw:Capabilities',
+        self.context.namespaces),
+        nsmap=self.context.namespaces, version='2.0.2',
+        updateSequence=str(updatesequence))
+
+        if 'updatesequence' in self.kvp:
+            if int(self.kvp['updatesequence']) == updatesequence:
+                return node
+            elif int(self.kvp['updatesequence']) > updatesequence:
+                return self.exceptionreport('InvalidUpdateSequence',
+                'updatesequence',
+                'outputsequence specified (%s) is higher than server\'s \
+                updatesequence (%s)' % (self.kvp['updatesequence'],
+                updatesequence))
+
+        node.attrib[util.nspath_eval('xsi:schemaLocation',
+        self.context.namespaces)] = '%s %s/csw/2.0.2/CSW-discovery.xsd' % \
+        (self.context.namespaces['csw'],
+         self.config.get('server', 'ogc_schemas_base'))
+
+        metadata_main = dict(self.config.items('metadata:main'))
+
+        if serviceidentification:
+            LOGGER.debug('Writing section ServiceIdentification.')
+
+            serviceidentification = etree.SubElement(node, \
+            util.nspath_eval('ows:ServiceIdentification',
+            self.context.namespaces))
+
+            etree.SubElement(serviceidentification,
+            util.nspath_eval('ows:Title', self.context.namespaces)).text = \
+            metadata_main.get('identification_title', 'missing')
+
+            etree.SubElement(serviceidentification,
+            util.nspath_eval('ows:Abstract', self.context.namespaces)).text = \
+            metadata_main.get('identification_abstract', 'missing')
+
+            keywords = etree.SubElement(serviceidentification,
+            util.nspath_eval('ows:Keywords', self.context.namespaces))
+
+            for k in \
+            metadata_main.get('identification_keywords').split(','):
+                etree.SubElement(
+                keywords, util.nspath_eval('ows:Keyword',
+                self.context.namespaces)).text = k
+
+            etree.SubElement(keywords,
+            util.nspath_eval('ows:Type', self.context.namespaces),
+            codeSpace='ISOTC211/19115').text = \
+            metadata_main.get('identification_keywords_type', 'missing')
+
+            etree.SubElement(serviceidentification,
+            util.nspath_eval('ows:ServiceType', self.context.namespaces),
+            codeSpace='OGC').text = 'CSW'
+
+            etree.SubElement(serviceidentification,
+            util.nspath_eval('ows:ServiceTypeVersion',
+            self.context.namespaces)).text = '2.0.2'
+
+            etree.SubElement(serviceidentification,
+            util.nspath_eval('ows:Fees', self.context.namespaces)).text = \
+            metadata_main.get('identification_fees', 'missing')
+
+            etree.SubElement(serviceidentification,
+            util.nspath_eval('ows:AccessConstraints',
+            self.context.namespaces)).text = \
+            metadata_main.get('identification_accessconstraints', 'missing')
+
+        if serviceprovider:
+            LOGGER.debug('Writing section ServiceProvider.')
+            serviceprovider = etree.SubElement(node,
+            util.nspath_eval('ows:ServiceProvider', self.context.namespaces))
+
+            etree.SubElement(serviceprovider,
+            util.nspath_eval('ows:ProviderName', self.context.namespaces)).text = \
+            metadata_main.get('provider_name', 'missing')
+
+            providersite = etree.SubElement(serviceprovider,
+            util.nspath_eval('ows:ProviderSite', self.context.namespaces))
+
+            providersite.attrib[util.nspath_eval('xlink:type',
+            self.context.namespaces)] = 'simple'
+
+            providersite.attrib[util.nspath_eval('xlink:href',
+            self.context.namespaces)] = \
+            metadata_main.get('provider_url', 'missing')
+
+            servicecontact = etree.SubElement(serviceprovider,
+            util.nspath_eval('ows:ServiceContact', self.context.namespaces))
+
+            etree.SubElement(servicecontact,
+            util.nspath_eval('ows:IndividualName',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_name', 'missing')
+
+            etree.SubElement(servicecontact,
+            util.nspath_eval('ows:PositionName',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_position', 'missing')
+
+            contactinfo = etree.SubElement(servicecontact,
+            util.nspath_eval('ows:ContactInfo', self.context.namespaces))
+
+            phone = etree.SubElement(contactinfo, util.nspath_eval('ows:Phone',
+            self.context.namespaces))
+
+            etree.SubElement(phone, util.nspath_eval('ows:Voice',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_phone', 'missing')
+
+            etree.SubElement(phone, util.nspath_eval('ows:Facsimile',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_fax', 'missing')
+
+            address = etree.SubElement(contactinfo,
+            util.nspath_eval('ows:Address', self.context.namespaces))
+
+            etree.SubElement(address,
+            util.nspath_eval('ows:DeliveryPoint',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_address', 'missing')
+
+            etree.SubElement(address, util.nspath_eval('ows:City',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_city', 'missing')
+
+            etree.SubElement(address,
+            util.nspath_eval('ows:AdministrativeArea',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_stateorprovince', 'missing')
+
+            etree.SubElement(address,
+            util.nspath_eval('ows:PostalCode',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_postalcode', 'missing')
+
+            etree.SubElement(address,
+            util.nspath_eval('ows:Country', self.context.namespaces)).text = \
+            metadata_main.get('contact_country', 'missing')
+
+            etree.SubElement(address,
+            util.nspath_eval('ows:ElectronicMailAddress',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_email', 'missing')
+
+            url = etree.SubElement(contactinfo,
+            util.nspath_eval('ows:OnlineResource', self.context.namespaces))
+
+            url.attrib[util.nspath_eval('xlink:type',
+            self.context.namespaces)] = 'simple'
+
+            url.attrib[util.nspath_eval('xlink:href',
+            self.context.namespaces)] = \
+            metadata_main.get('contact_url', 'missing')
+
+            etree.SubElement(contactinfo,
+            util.nspath_eval('ows:HoursOfService',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_hours', 'missing')
+
+            etree.SubElement(contactinfo,
+            util.nspath_eval('ows:ContactInstructions',
+            self.context.namespaces)).text = \
+            metadata_main.get('contact_instructions', 'missing')
+
+            etree.SubElement(servicecontact,
+            util.nspath_eval('ows:Role', self.context.namespaces),
+            codeSpace='ISOTC211/19115').text = \
+            metadata_main.get('contact_role', 'missing')
+
+        if operationsmetadata:
+            LOGGER.debug('Writing section OperationsMetadata.')
+            operationsmetadata = etree.SubElement(node,
+            util.nspath_eval('ows:OperationsMetadata',
+            self.context.namespaces))
+
+            for operation in self.context.model['operations'].keys():
+                oper = etree.SubElement(operationsmetadata,
+                util.nspath_eval('ows:Operation', self.context.namespaces),
+                name=operation)
+
+                dcp = etree.SubElement(oper, util.nspath_eval('ows:DCP',
+                self.context.namespaces))
+
+                http = etree.SubElement(dcp, util.nspath_eval('ows:HTTP',
+                self.context.namespaces))
+
+                if self.context.model['operations'][operation]['methods']['get']:
+                    get = etree.SubElement(http, util.nspath_eval('ows:Get',
+                    self.context.namespaces))
+
+                    get.attrib[util.nspath_eval('xlink:type',\
+                    self.context.namespaces)] = 'simple'
+
+                    get.attrib[util.nspath_eval('xlink:href',\
+                    self.context.namespaces)] = self.config.get('server', 'url')
+
+                if self.context.model['operations'][operation]['methods']['post']:
+                    post = etree.SubElement(http, util.nspath_eval('ows:Post',
+                    self.context.namespaces))
+                    post.attrib[util.nspath_eval('xlink:type',
+                    self.context.namespaces)] = 'simple'
+                    post.attrib[util.nspath_eval('xlink:href',
+                    self.context.namespaces)] = \
+                    self.config.get('server', 'url')
+
+                for parameter in \
+                self.context.model['operations'][operation]['parameters']:
+                    param = etree.SubElement(oper,
+                    util.nspath_eval('ows:Parameter',
+                    self.context.namespaces), name=parameter)
+
+                    for val in \
+                    self.context.model['operations'][operation]\
+                    ['parameters'][parameter]['values']:
+                        etree.SubElement(param,
+                        util.nspath_eval('ows:Value',
+                        self.context.namespaces)).text = val
+
+                if operation == 'GetRecords':  # advertise queryables
+                    for qbl in self.repository.queryables.keys():
+                        if qbl != '_all':
+                            param = etree.SubElement(oper,
+                            util.nspath_eval('ows:Constraint',
+                            self.context.namespaces), name=qbl)
+
+                            for qbl2 in self.repository.queryables[qbl]:
+                                etree.SubElement(param,
+                                util.nspath_eval('ows:Value',
+                                self.context.namespaces)).text = qbl2
+
+                    if self.profiles is not None:
+                        for con in self.context.model[\
+                        'operations']['GetRecords']['constraints'].keys():
+                            param = etree.SubElement(oper,
+                            util.nspath_eval('ows:Constraint',
+                            self.context.namespaces), name = con)
+                            for val in self.context.model['operations']\
+                            ['GetRecords']['constraints'][con]['values']:
+                                etree.SubElement(param,
+                                util.nspath_eval('ows:Value',
+                                self.context.namespaces)).text = val
+
+            for parameter in self.context.model['parameters'].keys():
+                param = etree.SubElement(operationsmetadata,
+                util.nspath_eval('ows:Parameter', self.context.namespaces),
+                name=parameter)
+
+                for val in self.context.model['parameters'][parameter]['values']:
+                    etree.SubElement(param, util.nspath_eval('ows:Value',
+                    self.context.namespaces)).text = val
+
+            for constraint in self.context.model['constraints'].keys():
+                param = etree.SubElement(operationsmetadata,
+                util.nspath_eval('ows:Constraint', self.context.namespaces),
+                name=constraint)
+
+                for val in self.context.model['constraints'][constraint]['values']:
+                    etree.SubElement(param, util.nspath_eval('ows:Value',
+                    self.context.namespaces)).text = val
+
+            if self.profiles is not None:
+                for prof in self.profiles['loaded'].keys():
+                    ecnode = \
+                    self.profiles['loaded'][prof].get_extendedcapabilities()
+                    if ecnode is not None:
+                        operationsmetadata.append(ecnode)
+
+        # always write out Filter_Capabilities
+        LOGGER.debug('Writing section Filter_Capabilities.')
+        fltcaps = etree.SubElement(node,
+        util.nspath_eval('ogc:Filter_Capabilities', self.context.namespaces))
+
+        spatialcaps = etree.SubElement(fltcaps,
+        util.nspath_eval('ogc:Spatial_Capabilities', self.context.namespaces))
+
+        geomops = etree.SubElement(spatialcaps,
+        util.nspath_eval('ogc:GeometryOperands', self.context.namespaces))
+
+        for geomtype in \
+        fes.MODEL['GeometryOperands']['values']:
+            etree.SubElement(geomops,
+            util.nspath_eval('ogc:GeometryOperand',
+            self.context.namespaces)).text = geomtype
+
+        spatialops = etree.SubElement(spatialcaps,
+        util.nspath_eval('ogc:SpatialOperators', self.context.namespaces))
+
+        for spatial_comparison in \
+        fes.MODEL['SpatialOperators']['values']:
+            etree.SubElement(spatialops,
+            util.nspath_eval('ogc:SpatialOperator', self.context.namespaces),
+            name=spatial_comparison)
+
+        scalarcaps = etree.SubElement(fltcaps,
+        util.nspath_eval('ogc:Scalar_Capabilities', self.context.namespaces))
+
+        etree.SubElement(scalarcaps, util.nspath_eval('ogc:LogicalOperators',
+        self.context.namespaces))
+
+        cmpops = etree.SubElement(scalarcaps,
+        util.nspath_eval('ogc:ComparisonOperators', self.context.namespaces))
+
+        for cmpop in fes.MODEL['ComparisonOperators'].keys():
+            etree.SubElement(cmpops,
+            util.nspath_eval('ogc:ComparisonOperator',
+            self.context.namespaces)).text = \
+            fes.MODEL['ComparisonOperators'][cmpop]['opname']
+
+        arithops = etree.SubElement(scalarcaps,
+        util.nspath_eval('ogc:ArithmeticOperators', self.context.namespaces))
+
+        functions = etree.SubElement(arithops,
+        util.nspath_eval('ogc:Functions', self.context.namespaces))
+
+        functionames = etree.SubElement(functions,
+        util.nspath_eval('ogc:FunctionNames', self.context.namespaces))
+
+        for fnop in sorted(fes.MODEL['Functions'].keys()):
+            etree.SubElement(functionames,
+            util.nspath_eval('ogc:FunctionName', self.context.namespaces),
+            nArgs=fes.MODEL['Functions'][fnop]['args']).text = fnop
+
+        idcaps = etree.SubElement(fltcaps,
+        util.nspath_eval('ogc:Id_Capabilities', self.context.namespaces))
+
+        for idcap in fes.MODEL['Ids']['values']:
+            etree.SubElement(idcaps, util.nspath_eval('ogc:%s' % idcap,
+            self.context.namespaces))
+
+        return node
+
+    def describerecord(self):
+        ''' Handle DescribeRecord request '''
+
+        if 'typename' not in self.kvp or \
+        len(self.kvp['typename']) == 0:  # missing typename
+        # set to return all typenames
+            self.kvp['typename'] = ['csw:Record']
+
+            if self.profiles is not None:
+                for prof in self.profiles['loaded'].keys():
+                    self.kvp['typename'].append(
+                    self.profiles['loaded'][prof].typename)
+
+        elif self.requesttype == 'GET':  # pass via GET
+            self.kvp['typename'] = self.kvp['typename'].split(',')
+
+        if ('outputformat' in self.kvp and
+            self.kvp['outputformat'] not in
+            self.context.model['operations']['DescribeRecord']
+            ['parameters']['outputFormat']['values']):  # bad outputformat
+            return self.exceptionreport('InvalidParameterValue',
+            'outputformat', 'Invalid value for outputformat: %s' %
+            self.kvp['outputformat'])
+
+        if ('schemalanguage' in self.kvp and
+            self.kvp['schemalanguage'] not in
+            self.context.model['operations']['DescribeRecord']['parameters']
+            ['schemaLanguage']['values']):  # bad schemalanguage
+            return self.exceptionreport('InvalidParameterValue',
+            'schemalanguage', 'Invalid value for schemalanguage: %s' %
+            self.kvp['schemalanguage'])
+
+        node = etree.Element(util.nspath_eval('csw:DescribeRecordResponse',
+        self.context.namespaces), nsmap=self.context.namespaces)
+
+        node.attrib[util.nspath_eval('xsi:schemaLocation',
+        self.context.namespaces)] = \
+        '%s %s/csw/2.0.2/CSW-discovery.xsd' % (self.context.namespaces['csw'],
+        self.config.get('server', 'ogc_schemas_base'))
+
+        for typename in self.kvp['typename']:
+            if typename.find(':') == -1:  # unqualified typename
+                return self.exceptionreport('InvalidParameterValue',
+                'typename', 'Typename not qualified: %s' % typename)
+            if typename == 'csw:Record':   # load core schema
+                LOGGER.debug('Writing csw:Record schema.')
+                schemacomponent = etree.SubElement(node,
+                util.nspath_eval('csw:SchemaComponent', self.context.namespaces),
+                schemaLanguage='XMLSCHEMA',
+                targetNamespace=self.context.namespaces['csw'])
+
+                path = os.path.join(self.config.get('server', 'home'),
+                'schemas', 'ogc', 'csw', '2.0.2', 'record.xsd')
+
+                dublincore = etree.parse(path).getroot()
+
+                schemacomponent.append(dublincore)
+
+            if self.profiles is not None:
+                for prof in self.profiles['loaded'].keys():
+                    if self.profiles['loaded'][prof].typename == typename:
+                        scnodes = \
+                        self.profiles['loaded'][prof].get_schemacomponents()
+                        if scnodes is not None:
+                            map(node.append, scnodes)
+        return node
+
+    def getdomain(self):
+        ''' Handle GetDomain request '''
+        if ('parametername' not in self.kvp and
+            'propertyname' not in self.kvp):
+            return self.exceptionreport('MissingParameterValue',
+            'parametername', 'Missing value. \
+            One of propertyname or parametername must be specified')
+
+        node = etree.Element(util.nspath_eval('csw:GetDomainResponse',
+        self.context.namespaces), nsmap=self.context.namespaces)
+
+        node.attrib[util.nspath_eval('xsi:schemaLocation',
+        self.context.namespaces)] = '%s %s/csw/2.0.2/CSW-discovery.xsd' % \
+        (self.context.namespaces['csw'],
+        self.config.get('server', 'ogc_schemas_base'))
+
+        if 'parametername' in self.kvp:
+            for pname in self.kvp['parametername'].split(','):
+                LOGGER.debug('Parsing parametername %s.' % pname)
+                domainvalue = etree.SubElement(node,
+                util.nspath_eval('csw:DomainValues', self.context.namespaces),
+                type='csw:Record')
+                etree.SubElement(domainvalue,
+                util.nspath_eval('csw:ParameterName',
+                self.context.namespaces)).text = pname
+                try:
+                    operation, parameter = pname.split('.')
+                except:
+                    return node
+                if (operation in self.context.model['operations'].keys() and
+                    parameter in
+                    self.context.model['operations'][operation]['parameters'].keys()):
+                    listofvalues = etree.SubElement(domainvalue,
+                    util.nspath_eval('csw:ListOfValues', self.context.namespaces))
+                    for val in \
+                    self.context.model['operations'][operation]\
+                    ['parameters'][parameter]['values']:
+                        etree.SubElement(listofvalues,
+                        util.nspath_eval('csw:Value',
+                        self.context.namespaces)).text = val
+
+        if 'propertyname' in self.kvp:
+            for pname in self.kvp['propertyname'].split(','):
+                LOGGER.debug('Parsing propertyname %s.' % pname)
+
+                if pname.find('/') == 0:  # it's an XPath
+                    pname2 = pname
+                else:  # it's a core queryable, map to internal typename model
+                    try:
+                        pname2 = self.repository.queryables['_all'][pname]['dbcol']
+                    except:
+                        pname2 = pname
+
+                # decipher typename
+                dvtype = None
+                if self.profiles is not None:
+                    for prof in self.profiles['loaded'].keys():
+                        for prefix in self.profiles['loaded'][prof].prefixes:
+                            if pname2.find(prefix) != -1:
+                                dvtype = self.profiles['loaded'][prof].typename
+                                break
+                if not dvtype:
+                    dvtype = 'csw:Record'
+
+                domainvalue = etree.SubElement(node,
+                util.nspath_eval('csw:DomainValues', self.context.namespaces),
+                type=dvtype)
+                etree.SubElement(domainvalue,
+                util.nspath_eval('csw:PropertyName',
+                self.context.namespaces)).text = pname
+
+                try:
+                    LOGGER.debug(
+                    'Querying repository property %s, typename %s, \
+                    domainquerytype %s.' % \
+                    (pname2, dvtype, self.domainquerytype))
+
+                    count = False
+
+                    if (self.config.has_option('server', 'domaincounts') and
+                        self.config.get('server', 'domaincounts') == 'true'):
+                        count = True
+
+                    results = self.repository.query_domain(
+                    pname2, dvtype, self.domainquerytype, count)
+
+                    LOGGER.debug('Results: %s' % str(len(results)))
+
+                    if self.domainquerytype == 'range':
+                        rangeofvalues = etree.SubElement(domainvalue,
+                        util.nspath_eval('csw:RangeOfValues',
+                        self.context.namespaces))
+
+                        etree.SubElement(rangeofvalues,
+                        util.nspath_eval('csw:MinValue',
+                        self.context.namespaces)).text = results[0][0]
+
+                        etree.SubElement(rangeofvalues,
+                        util.nspath_eval('csw:MaxValue',
+                        self.context.namespaces)).text = results[0][1]
+                    else:
+                        listofvalues = etree.SubElement(domainvalue,
+                        util.nspath_eval('csw:ListOfValues',
+                        self.context.namespaces))
+                        for result in results:
+                            LOGGER.debug(str(result))
+                            if (result is not None and
+                                result[0] is not None):  # drop null values
+                                if count:  # show counts
+                                    val = '%s (%s)' % (result[0], result[1])
+                                else:
+                                    val = result[0]
+                                etree.SubElement(listofvalues,
+                                util.nspath_eval('csw:Value',
+                                self.context.namespaces)).text = val
+                except Exception, err:
+                    LOGGER.debug('No results for propertyname %s: %s.' %
+                    (pname2, str(err)))
+        return node
+
+    def getrecords(self):
+        ''' Handle GetRecords request '''
+
+        timestamp = util.get_today_and_now()
+
+        if ('elementsetname' not in self.kvp and
+            'elementname' not in self.kvp):
+            # mutually exclusive required
+            return self.exceptionreport('MissingParameterValue',
+            'elementsetname',
+            'Missing one of ElementSetName or ElementName parameter(s)')
+
+        if 'outputschema' not in self.kvp:
+            self.kvp['outputschema'] = self.context.namespaces['csw']
+
+        if (self.kvp['outputschema'] not in self.context.model['operations']
+            ['GetRecords']['parameters']['outputSchema']['values']):
+            return self.exceptionreport('InvalidParameterValue',
+            'outputschema', 'Invalid outputSchema parameter value: %s' %
+            self.kvp['outputschema'])
+
+        if 'outputformat' not in self.kvp:
+            self.kvp['outputformat'] = 'application/xml'
+
+        if (self.kvp['outputformat'] not in self.context.model['operations']
+            ['GetRecords']['parameters']['outputFormat']['values']):
+            return self.exceptionreport('InvalidParameterValue',
+            'outputformat', 'Invalid outputFormat parameter value: %s' %
+            self.kvp['outputformat'])
+
+        if 'resulttype' not in self.kvp:
+            self.kvp['resulttype'] = 'hits'
+
+        if self.kvp['resulttype'] is not None:
+            if (self.kvp['resulttype'] not in self.context.model['operations']
+            ['GetRecords']['parameters']['resultType']['values']):
+                return self.exceptionreport('InvalidParameterValue',
+                'resulttype', 'Invalid resultType parameter value: %s' %
+                self.kvp['resulttype'])
+
+        if (('elementname' not in self.kvp or
+             len(self.kvp['elementname']) == 0) and
+             self.kvp['elementsetname'] not in
+             self.context.model['operations']['GetRecords']['parameters']
+             ['ElementSetName']['values']):
+            return self.exceptionreport('InvalidParameterValue',
+            'elementsetname', 'Invalid ElementSetName parameter value: %s' %
+            self.kvp['elementsetname'])
+
+        if ('elementname' in self.kvp and
+            self.requesttype == 'GET'):  # passed via GET
+            self.kvp['elementname'] = self.kvp['elementname'].split(',')
+            self.kvp['elementsetname'] = 'summary'
+
+        if 'typenames' not in self.kvp:
+            return self.exceptionreport('MissingParameterValue',
+            'typenames', 'Missing typenames parameter')
+
+        if ('typenames' in self.kvp and
+            self.requesttype == 'GET'):  # passed via GET
+            self.kvp['typenames'] = self.kvp['typenames'].split(',')
+
+        if 'typenames' in self.kvp:
+            for tname in self.kvp['typenames']:
+                if (tname not in self.context.model['operations']['GetRecords']
+                    ['parameters']['typeNames']['values']):
+                    return self.exceptionreport('InvalidParameterValue',
+                    'typenames', 'Invalid typeNames parameter value: %s' %
+                    tname)
+
+        # check elementname's
+        if 'elementname' in self.kvp:
+            for ename in self.kvp['elementname']:
+                enamelist = self.repository.queryables['_all'].keys()
+                if ename not in enamelist:
+                    return self.exceptionreport('InvalidParameterValue',
+                    'elementname', 'Invalid ElementName parameter value: %s' %
+                    ename)
+
+        if self.kvp['resulttype'] == 'validate':
+            return self._write_acknowledgement()
+
+        if 'maxrecords' not in self.kvp:
+            self.kvp['maxrecords'] = int(self.config.get('server', 'maxrecords'))
+
+        if self.requesttype == 'GET':
+            if 'constraint' in self.kvp:
+                # GET request
+                LOGGER.debug('csw:Constraint passed over HTTP GET.')
+                if 'constraintlanguage' not in self.kvp:
+                    return self.exceptionreport('MissingParameterValue',
+                    'constraintlanguage',
+                    'constraintlanguage required when constraint specified')
+                if (self.kvp['constraintlanguage'] not in
+                self.context.model['operations']['GetRecords']['parameters']
+                ['CONSTRAINTLANGUAGE']['values']):
+                    return self.exceptionreport('InvalidParameterValue',
+                    'constraintlanguage', 'Invalid constraintlanguage: %s'
+                    % self.kvp['constraintlanguage'])
+                if self.kvp['constraintlanguage'] == 'CQL_TEXT':
+                    tmp = self.kvp['constraint']
+                    self.kvp['constraint'] = {}
+                    self.kvp['constraint']['type'] = 'cql'
+                    self.kvp['constraint']['where'] = \
+                    self._cql_update_queryables_mappings(tmp,
+                    self.repository.queryables['_all'])
+                    self.kvp['constraint']['values'] = {}
+                elif self.kvp['constraintlanguage'] == 'FILTER':
+                    # validate filter XML
+                    try:
+                        schema = os.path.join(self.config.get('server', 'home'),
+                        'schemas', 'ogc', 'filter', '1.1.0', 'filter.xsd')
+                        LOGGER.debug('Validating Filter %s.' %
+                        self.kvp['constraint'])
+                        schema = etree.XMLSchema(file=schema)
+                        parser = etree.XMLParser(schema=schema)
+                        doc = etree.fromstring(self.kvp['constraint'], parser)
+                        LOGGER.debug('Filter is valid XML.')
+                        self.kvp['constraint'] = {}
+                        self.kvp['constraint']['type'] = 'filter'
+                        self.kvp['constraint']['where'], self.kvp['constraint']['values'] = \
+                        fes.parse(doc,
+                        self.repository.queryables['_all'].keys(),
+                        self.repository.dbtype,
+                        self.context.namespaces, self.orm, self.language['text'], self.repository.fts)
+                    except Exception, err:
+                        errortext = \
+                        'Exception: document not valid.\nError: %s.' % str(err)
+
+                        LOGGER.debug(errortext)
+                        return self.exceptionreport('InvalidParameterValue',
+                        'constraint', 'Invalid Filter query: %s' % errortext)
+            else:
+                self.kvp['constraint'] = {}
+
+        if 'sortby' not in self.kvp:
+            self.kvp['sortby'] = None
+        elif 'sortby' in self.kvp and self.requesttype == 'GET':
+            LOGGER.debug('Sorted query specified.')
+            tmp = self.kvp['sortby']
+            self.kvp['sortby'] = {}
+
+            try:
+                name, order = tmp.rsplit(':', 1)
+            except:
+                return self.exceptionreport('InvalidParameterValue',
+                'sortby', 'Invalid SortBy value: must be in the format\
+                propertyname:A or propertyname:D')
+
+            try:
+                self.kvp['sortby']['propertyname'] = \
+                self.repository.queryables['_all'][name]['dbcol']
+                if name.find('BoundingBox') != -1 or name.find('Envelope') != -1:
+                    # it's a spatial sort
+                    self.kvp['sortby']['spatial'] = True
+            except Exception, err:
+                return self.exceptionreport('InvalidParameterValue',
+                'sortby', 'Invalid SortBy propertyname: %s' % name)
+
+            if order not in ['A', 'D']:
+                return self.exceptionreport('InvalidParameterValue',
+                'sortby', 'Invalid SortBy value: sort order must be "A" or "D"')
+
+            if order == 'D':
+                self.kvp['sortby']['order'] = 'DESC'
+            else:
+                self.kvp['sortby']['order'] = 'ASC'
+
+        if 'startposition' not in self.kvp:
+            self.kvp['startposition'] = 1
+
+        # query repository
+        LOGGER.debug('Querying repository with constraint: %s,\
+        sortby: %s, typenames: %s, maxrecords: %s, startposition: %s.' %
+        (self.kvp['constraint'], self.kvp['sortby'], self.kvp['typenames'],
+        self.kvp['maxrecords'], self.kvp['startposition']))
+
+        try:
+            matched, results = self.repository.query(
+            constraint=self.kvp['constraint'],
+            sortby=self.kvp['sortby'], typenames=self.kvp['typenames'],
+            maxrecords=self.kvp['maxrecords'],
+            startposition=int(self.kvp['startposition'])-1)
+        except Exception, err:
+            return self.exceptionreport('InvalidParameterValue', 'constraint',
+            'Invalid query: %s' % err)
+
+        dsresults = []
+
+        if (self.config.has_option('server', 'federatedcatalogues') and
+            'distributedsearch' in self.kvp and
+            self.kvp['distributedsearch'] and self.kvp['hopcount'] > 0):
+            # do distributed search
+
+            LOGGER.debug('DistributedSearch specified (hopCount: %s).' %
+            self.kvp['hopcount'])
+
+            from owslib.csw import CatalogueServiceWeb
+            for fedcat in \
+            self.config.get('server', 'federatedcatalogues').split(','):
+                LOGGER.debug('Performing distributed search on federated \
+                catalogue: %s.' % fedcat)
+                remotecsw = CatalogueServiceWeb(fedcat, skip_caps=True)
+                try:
+                    remotecsw.getrecords2(xml=self.request)
+                    if hasattr(remotecsw, 'results'):
+                        LOGGER.debug(
+                        'Distributed search results from catalogue \
+                        %s: %s.' % (fedcat, remotecsw.results))
+
+                        remotecsw_matches = int(remotecsw.results['matches'])
+                        plural = 's' if remotecsw_matches != 1 else ''
+                        if remotecsw_matches > 0:
+                            matched = str(int(matched) + remotecsw_matches)
+                            dsresults.append(etree.Comment(
+                            ' %d result%s from %s ' %
+                            (remotecsw_matches, plural, fedcat)))
+
+                            dsresults.append(remotecsw.records)
+
+                except Exception, err:
+                    error_string = 'remote CSW %s returned error: ' % fedcat
+                    dsresults.append(etree.Comment(
+                    ' %s\n\n%s ' % (error_string, remotecsw.response)))
+                    LOGGER.debug(str(err))
+
+        if int(matched) == 0:
+            returned = nextrecord = '0'
+        else:
+            if int(matched) < int(self.kvp['maxrecords']):
+                returned = matched
+                nextrecord = '0'
+            else:
+                returned = str(self.kvp['maxrecords'])
+                if int(self.kvp['startposition']) + int(self.kvp['maxrecords']) >= int(matched):
+                    nextrecord = '0'
+                else:
+                    nextrecord = str(int(self.kvp['startposition']) + \
+                    int(self.kvp['maxrecords']))
+
+        LOGGER.debug('Results: matched: %s, returned: %s, next: %s.' % \
+        (matched, returned, nextrecord))
+
+        node = etree.Element(util.nspath_eval('csw:GetRecordsResponse',
+        self.context.namespaces),
+        nsmap=self.context.namespaces, version='2.0.2')
+
+        node.attrib[util.nspath_eval('xsi:schemaLocation',
+        self.context.namespaces)] = \
+        '%s %s/csw/2.0.2/CSW-discovery.xsd' % \
+        (self.context.namespaces['csw'], self.config.get('server', 'ogc_schemas_base'))
+
+        if 'requestid' in self.kvp and self.kvp['requestid'] is not None:
+            etree.SubElement(node, util.nspath_eval('csw:RequestId',
+            self.context.namespaces)).text = self.kvp['requestid']
+
+        etree.SubElement(node, util.nspath_eval('csw:SearchStatus',
+        self.context.namespaces), timestamp=timestamp)
+
+        if 'where' not in self.kvp['constraint'] and \
+        self.kvp['resulttype'] is None:
+            returned = '0'
+
+        searchresults = etree.SubElement(node,
+        util.nspath_eval('csw:SearchResults', self.context.namespaces),
+        numberOfRecordsMatched=matched, numberOfRecordsReturned=returned,
+        nextRecord=nextrecord, recordSchema=self.kvp['outputschema'])
+
+        if self.kvp['elementsetname'] is not None:
+            searchresults.attrib['elementSet'] = self.kvp['elementsetname']
+
+        if 'where' not in self.kvp['constraint'] \
+        and self.kvp['resulttype'] is None:
+            LOGGER.debug('Empty result set returned.')
+            return node
+
+        if self.kvp['resulttype'] == 'hits':
+            return node
+
+
+        if results is not None:
+            if len(results) < self.kvp['maxrecords']:
+                max1 = len(results)
+            else:
+                max1 = int(self.kvp['startposition']) + (int(self.kvp['maxrecords'])-1)
+            LOGGER.debug('Presenting records %s - %s.' %
+            (self.kvp['startposition'], max1))
+
+            for res in results:
+                try:
+                    if (self.kvp['outputschema'] ==
+                        'http://www.opengis.net/cat/csw/2.0.2' and
+                        'csw:Record' in self.kvp['typenames']):
+                        # serialize csw:Record inline
+                        searchresults.append(self._write_record(
+                        res, self.repository.queryables['_all']))
+                    elif (self.kvp['outputschema'] ==
+                        'http://www.opengis.net/cat/csw/2.0.2' and
+                        'csw:Record' not in self.kvp['typenames']):
+                        # serialize into csw:Record model
+
+                        for prof in self.profiles['loaded']:
+                            # find source typename
+                            if self.profiles['loaded'][prof].typename in \
+                            self.kvp['typenames']:
+                                typename = self.profiles['loaded'][prof].typename
+                                break
+
+                        util.transform_mappings(self.repository.queryables['_all'],
+                        self.context.model['typenames'][typename]\
+                        ['mappings']['csw:Record'], reverse=True)
+
+                        searchresults.append(self._write_record(
+                        res, self.repository.queryables['_all']))
+                    elif self.kvp['outputschema'] in self.outputschemas.keys():  # use outputschema serializer
+                        searchresults.append(self.outputschemas[self.kvp['outputschema']].write_record(res, self.kvp['elementsetname'], self.context, self.config.get('server', 'url')))
+                    else:  # use profile serializer
+                        searchresults.append(
+                        self.profiles['loaded'][self.kvp['outputschema']].\
+                        write_record(res, self.kvp['elementsetname'],
+                        self.kvp['outputschema'],
+                        self.repository.queryables['_all']))
+                except Exception, err:
+                    self.response = self.exceptionreport(
+                    'NoApplicableCode', 'service',
+                    'Record serialization failed: %s' % str(err))
+                    return self.response
+
+        if len(dsresults) > 0:  # return DistributedSearch results
+            for resultset in dsresults:
+                if isinstance(resultset, etree._Comment):
+                    searchresults.append(resultset)
+                for rec in resultset:
+                    searchresults.append(etree.fromstring(resultset[rec].xml))
+
+        if 'responsehandler' in self.kvp:  # process the handler
+            self._process_responsehandler(etree.tostring(node,
+            pretty_print=self.pretty_print))
+        else:
+            return node
+
+    def getrecordbyid(self, raw=False):
+        ''' Handle GetRecordById request '''
+
+        if 'id' not in self.kvp:
+            return self.exceptionreport('MissingParameterValue', 'id',
+            'Missing id parameter')
+        if len(self.kvp['id']) < 1:
+            return self.exceptionreport('InvalidParameterValue', 'id',
+            'Invalid id parameter')
+        if 'outputschema' not in self.kvp:
+            self.kvp['outputschema'] = self.context.namespaces['csw']
+
+        if self.requesttype == 'GET':
+            self.kvp['id'] = self.kvp['id'].split(',')
+
+        if ('outputformat' in self.kvp and
+            self.kvp['outputformat'] not in
+            self.context.model['operations']['GetRecordById']['parameters']
+            ['outputFormat']['values']):
+            return self.exceptionreport('InvalidParameterValue',
+            'outputformat', 'Invalid outputformat parameter %s' %
+            self.kvp['outputformat'])
+
+        if ('outputschema' in self.kvp and self.kvp['outputschema'] not in
+            self.context.model['operations']['GetRecordById']['parameters']
+            ['outputSchema']['values']):
+            return self.exceptionreport('InvalidParameterValue',
+            'outputschema', 'Invalid outputschema parameter %s' %
+            self.kvp['outputschema'])
+
+        if 'elementsetname' not in self.kvp:
+            self.kvp['elementsetname'] = 'summary'
+        else:
+            if (self.kvp['elementsetname'] not in
+                self.context.model['operations']['GetRecordById']['parameters']
+                ['ElementSetName']['values']):
+                return self.exceptionreport('InvalidParameterValue',
+                'elementsetname', 'Invalid elementsetname parameter %s' %
+                self.kvp['elementsetname'])
+
+        node = etree.Element(util.nspath_eval('csw:GetRecordByIdResponse',
+        self.context.namespaces), nsmap=self.context.namespaces)
+
+        node.attrib[util.nspath_eval('xsi:schemaLocation',
+        self.context.namespaces)] = '%s %s/csw/2.0.2/CSW-discovery.xsd' % \
+        (self.context.namespaces['csw'], self.config.get('server', 'ogc_schemas_base'))
+
+        # query repository
+        LOGGER.debug('Querying repository with ids: %s.' % self.kvp['id'][0])
+        results = self.repository.query_ids(self.kvp['id'])
+
+        if raw:  # GetRepositoryItem request
+            LOGGER.debug('GetRepositoryItem request.')
+            if len(results) > 0:
+                return etree.fromstring(util.getqattr(results[0],
+                self.context.md_core_model['mappings']['pycsw:XML']))
+
+        for result in results:
+            if (util.getqattr(result,
+            self.context.md_core_model['mappings']['pycsw:Typename']) == 'csw:Record'
+            and self.kvp['outputschema'] ==
+            'http://www.opengis.net/cat/csw/2.0.2'):
+                # serialize record inline
+                node.append(self._write_record(
+                result, self.repository.queryables['_all']))
+            elif (self.kvp['outputschema'] ==
+                'http://www.opengis.net/cat/csw/2.0.2'):
+                # serialize into csw:Record model
+                typename = None
+
+                for prof in self.profiles['loaded']:  # find source typename
+                    if self.profiles['loaded'][prof].typename in \
+                    [util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Typename'])]:
+                        typename = self.profiles['loaded'][prof].typename
+                        break
+
+                if typename is not None:
+                    util.transform_mappings(self.repository.queryables['_all'],
+                    self.context.model['typenames'][typename]\
+                    ['mappings']['csw:Record'], reverse=True)
+
+                node.append(self._write_record(
+                result, self.repository.queryables['_all']))
+            elif self.kvp['outputschema'] in self.outputschemas.keys():  # use outputschema serializer
+                node.append(self.outputschemas[self.kvp['outputschema']].write_record(result, self.kvp['elementsetname'], self.context, self.config.get('server', 'url')))
+            else:  # it's a profile output
+                node.append(
+                self.profiles['loaded'][self.kvp['outputschema']].write_record(
+                result, self.kvp['elementsetname'],
+                self.kvp['outputschema'], self.repository.queryables['_all']))
+
+        if raw and len(results) == 0:
+            return None
+
+        return node
+
+    def getrepositoryitem(self):
+        ''' Handle GetRepositoryItem request '''
+
+        # similar to GetRecordById without csw:* wrapping
+        node = self.getrecordbyid(raw=True)
+        if node is None:
+            return self.exceptionreport('NotFound', 'id',
+            'No repository item found for \'%s\'' % self.kvp['id'])
+        else:
+            return node
+
+    def transaction(self):
+        ''' Handle Transaction request '''
+
+        try:
+            self._test_manager()
+        except Exception, err:
+            return self.exceptionreport('NoApplicableCode', 'transaction',
+            str(err))
+
+        inserted = 0
+        updated = 0
+        deleted = 0
+
+        insertresults = []
+
+        LOGGER.debug('Transaction list: %s' % self.kvp['transactions'])
+
+        for ttype in self.kvp['transactions']:
+            if ttype['type'] == 'insert':
+                try:
+                    record = metadata.parse_record(self.context,
+                    ttype['xml'], self.repository)[0]
+                except Exception, err:
+                    return self.exceptionreport('NoApplicableCode', 'insert',
+                    'Transaction (insert) failed: record parsing failed: %s' \
+                    % str(err))
+
+                LOGGER.debug('Transaction operation: %s' % record)
+
+                if not hasattr(record,
+                self.context.md_core_model['mappings']['pycsw:Identifier']):
+                    return self.exceptionreport('NoApplicableCode',
+                    'insert', 'Record requires an identifier')
+
+                # insert new record
+                try:
+                    self.repository.insert(record, 'local',
+                    util.get_today_and_now())
+
+                    inserted += 1
+                    insertresults.append(
+                    {'identifier': getattr(record,
+                    self.context.md_core_model['mappings']['pycsw:Identifier']),
+                    'title': getattr(record,
+                    self.context.md_core_model['mappings']['pycsw:Title'])})
+                except Exception, err:
+                    return self.exceptionreport('NoApplicableCode',
+                    'insert', 'Transaction (insert) failed: %s.' % str(err))
+
+            elif ttype['type'] == 'update':
+                if 'constraint' not in ttype:
+                    # update full existing resource in repository
+                    try:
+                        record = metadata.parse_record(self.context,
+                        ttype['xml'], self.repository)[0]
+                        identifier = getattr(record,
+                        self.context.md_core_model['mappings']['pycsw:Identifier'])
+                    except Exception, err:
+                        return self.exceptionreport('NoApplicableCode', 'insert',
+                        'Transaction (update) failed: record parsing failed: %s' \
+                        % str(err))
+
+                    # query repository to see if record already exists
+                    LOGGER.debug('checking if record exists (%s)' % \
+                    identifier)
+
+                    results = self.repository.query_ids(ids=[identifier])
+
+                    if len(results) == 0:
+                        LOGGER.debug('id %s does not exist in repository' % \
+                        identifier)
+                    else:  # existing record, it's an update
+                        try:
+                            self.repository.update(record)
+                            updated += 1
+                        except Exception, err:
+                            return self.exceptionreport('NoApplicableCode',
+                            'update',
+                            'Transaction (update) failed: %s.' % str(err))
+                else:  # update by record property and constraint
+                    # get / set XPath for property names
+                    for rp in ttype['recordproperty']:
+                        if rp['name'] not in self.repository.queryables['_all']:
+                            # is it an XPath?
+                            if rp['name'].find('/') != -1:
+                                # scan outputschemas; if match, bind
+                                for osch in self.outputschemas.values():
+                                    for key, value in osch.XPATH_MAPPINGS.iteritems():
+                                        if value == rp['name']:  # match
+                                            rp['rp'] = {'xpath': value, 'name': key}
+                                            rp['rp']['dbcol'] = self.repository.queryables['_all'][key]
+                                            break
+                            else:
+                                return self.exceptionreport('NoApplicableCode',
+                                       'update', 'Transaction (update) failed: invalid property2: %s.' % str(rp['name']))
+                        else:
+                            rp['rp']= \
+                            self.repository.queryables['_all'][rp['name']]
+
+                    LOGGER.debug('Record Properties: %s.' %
+                    ttype['recordproperty'])
+                    try:
+                        updated += self.repository.update(record=None,
+                        recprops=ttype['recordproperty'],
+                        constraint=ttype['constraint'])
+                    except Exception, err:
+                        return self.exceptionreport('NoApplicableCode',
+                        'update',
+                        'Transaction (update) failed: %s.' % str(err))
+
+            elif ttype['type'] == 'delete':
+                deleted += self.repository.delete(ttype['constraint'])
+
+        node = etree.Element(util.nspath_eval('csw:TransactionResponse',
+        self.context.namespaces), nsmap=self.context.namespaces, version='2.0.2')
+
+        node.attrib[util.nspath_eval('xsi:schemaLocation',
+        self.context.namespaces)] = '%s %s/csw/2.0.2/CSW-publication.xsd' % \
+        (self.context.namespaces['csw'], self.config.get('server', 'ogc_schemas_base'))
+
+        node.append(
+        self._write_transactionsummary(
+        inserted=inserted, updated=updated, deleted=deleted))
+
+        if (len(insertresults) > 0 and self.kvp['verboseresponse']):
+            # show insert result identifiers
+            node.append(self._write_verboseresponse(insertresults))
+
+        return node
+
+    def harvest(self):
+        ''' Handle Harvest request '''
+
+        try:
+            self._test_manager()
+        except Exception, err:
+            return self.exceptionreport('NoApplicableCode', 'harvest', str(err))
+
+        if self.requesttype == 'GET':
+            if 'resourcetype' not in self.kvp:
+                return self.exceptionreport('MissingParameterValue',
+                'resourcetype', 'Missing resourcetype parameter')
+            if 'source' not in self.kvp:
+                return self.exceptionreport('MissingParameterValue',
+                'source', 'Missing source parameter')
+
+        # validate resourcetype
+        if (self.kvp['resourcetype'] not in
+            self.context.model['operations']['Harvest']['parameters']['ResourceType']
+            ['values']):
+            return self.exceptionreport('InvalidParameterValue',
+            'resourcetype', 'Invalid resource type parameter: %s.\
+            Allowable resourcetype values: %s' % (self.kvp['resourcetype'],
+            ','.join(self.context.model['operations']['Harvest']['parameters']
+            ['ResourceType']['values'])))
+
+        if (self.kvp['resourcetype'].find('opengis.net') == -1 and
+            self.kvp['resourcetype'].find('urn:geoss:waf') == -1):
+            # fetch content-based resource
+            LOGGER.debug('Fetching resource %s' % self.kvp['source'])
+            try:
+                content = util.http_request('GET', self.kvp['source'])
+            except Exception, err:
+                errortext = 'Error fetching resource %s.\nError: %s.' % \
+                (self.kvp['source'], str(err))
+                LOGGER.debug(errortext)
+                return self.exceptionreport('InvalidParameterValue', 'source',
+                errortext)
+        else:  # it's a service URL
+            content = self.kvp['source']
+            # query repository to see if service already exists
+            LOGGER.debug('checking if service exists (%s)' % content)
+            results = self.repository.query_source(content)
+
+            if len(results) > 0:  # exists, don't insert
+                return self.exceptionreport('NoApplicableCode', 'source',
+                'Insert failed: service %s already in repository' % content)
+
+        # parse resource into record
+        try:
+            records_parsed = metadata.parse_record(self.context,
+            content, self.repository, self.kvp['resourcetype'],
+            pagesize=self.csw_harvest_pagesize)
+        except Exception, err:
+            return self.exceptionreport('NoApplicableCode', 'source',
+            'Harvest failed: record parsing failed: %s' % str(err))
+
+        inserted = 0
+        updated = 0
+        ir = []
+
+        for record in records_parsed:
+            if self.kvp['resourcetype'] == 'urn:geoss:waf':
+                src = record.source
+            else:
+                src = self.kvp['source']
+
+            setattr(record, self.context.md_core_model['mappings']['pycsw:Source'],
+                    src)
+
+            setattr(record, self.context.md_core_model['mappings']['pycsw:InsertDate'],
+            util.get_today_and_now())
+
+            identifier = getattr(record,
+            self.context.md_core_model['mappings']['pycsw:Identifier'])
+            source = getattr(record,
+            self.context.md_core_model['mappings']['pycsw:Source'])
+            insert_date = getattr(record,
+            self.context.md_core_model['mappings']['pycsw:InsertDate'])
+            title = getattr(record,
+            self.context.md_core_model['mappings']['pycsw:Title'])
+
+
+            ir.append({'identifier': identifier, 'title': title})
+
+            # query repository to see if record already exists
+            LOGGER.debug('checking if record exists (%s)' % identifier)
+            results = self.repository.query_ids(ids=[identifier])
+
+            LOGGER.debug(str(results))
+
+            if len(results) == 0:  # new record, it's a new insert
+                inserted += 1
+                try:
+                    self.repository.insert(record, source, insert_date)
+                except Exception, err:
+                    return self.exceptionreport('NoApplicableCode',
+                    'source', 'Harvest (insert) failed: %s.' % str(err))
+            else:  # existing record, it's an update
+                if source != results[0].source:
+                    # same identifier, but different source
+                    return self.exceptionreport('NoApplicableCode',
+                    'source', 'Insert failed: identifier %s in repository\
+                    has source %s.' % (identifier, source))
+
+                try:
+                    self.repository.update(record)
+                except Exception, err:
+                    return self.exceptionreport('NoApplicableCode',
+                    'source', 'Harvest (update) failed: %s.' % str(err))
+                updated += 1
+
+        node = etree.Element(util.nspath_eval('csw:HarvestResponse',
+        self.context.namespaces), nsmap=self.context.namespaces)
+
+        node.attrib[util.nspath_eval('xsi:schemaLocation',
+        self.context.namespaces)] = \
+        '%s %s/csw/2.0.2/CSW-publication.xsd' % (self.context.namespaces['csw'],
+        self.config.get('server', 'ogc_schemas_base'))
+
+        node2 = etree.SubElement(node,
+        util.nspath_eval('csw:TransactionResponse',
+        self.context.namespaces), version='2.0.2')
+
+        node2.append(
+        self._write_transactionsummary(inserted=inserted, updated=updated))
+
+        if inserted > 0:
+            # show insert result identifiers
+            node2.append(self._write_verboseresponse(ir))
+
+        if 'responsehandler' in self.kvp:  # process the handler
+            self._process_responsehandler(etree.tostring(node,
+            pretty_print=self.pretty_print))
+        else:
+            return node
+
+    def parse_postdata(self, postdata):
+        ''' Parse POST XML '''
+
+        request = {}
+        try:
+            LOGGER.debug('Parsing %s.' % postdata)
+            doc = etree.fromstring(postdata)
+        except Exception, err:
+            errortext = \
+            'Exception: document not well-formed.\nError: %s.' % str(err)
+
+            LOGGER.debug(errortext)
+            return errortext
+
+        # if this is a SOAP request, get to SOAP-ENV:Body/csw:*
+        if (doc.tag == util.nspath_eval('soapenv:Envelope',
+            self.context.namespaces)):
+
+            LOGGER.debug('SOAP request specified.')
+            self.soap = True
+
+            doc = doc.find(
+            util.nspath_eval('soapenv:Body',
+            self.context.namespaces)).xpath('child::*')[0]
+
+        if (doc.tag in [util.nspath_eval('csw:Transaction',
+            self.context.namespaces), util.nspath_eval('csw:Harvest',
+            self.context.namespaces)]):
+            schema = os.path.join(self.config.get('server', 'home'),
+            'schemas', 'ogc', 'csw', '2.0.2', 'CSW-publication.xsd')
+        else:
+            schema = os.path.join(self.config.get('server', 'home'),
+            'schemas', 'ogc', 'csw', '2.0.2', 'CSW-discovery.xsd')
+
+        try:
+            # it is virtually impossible to validate a csw:Transaction
+            # csw:Insert|csw:Update (with single child) XML document.
+            # Only validate non csw:Transaction XML
+
+            if doc.find('.//%s' % util.nspath_eval('csw:Insert',
+            self.context.namespaces)) is None and \
+            len(doc.xpath('//csw:Update/child::*',
+            namespaces=self.context.namespaces)) == 0:
+
+                LOGGER.debug('Validating %s.' % postdata)
+                schema = etree.XMLSchema(file=schema)
+                parser = etree.XMLParser(schema=schema)
+                if hasattr(self, 'soap') and self.soap:
+                # validate the body of the SOAP request
+                    doc = etree.fromstring(etree.tostring(doc), parser)
+                else:  # validate the request normally
+                    doc = etree.fromstring(postdata, parser)
+                LOGGER.debug('Request is valid XML.')
+            else:  # parse Transaction without validation
+                doc = etree.fromstring(postdata)
+        except Exception, err:
+            errortext = \
+            'Exception: the document is not valid.\nError: %s' % str(err)
+            LOGGER.debug(errortext)
+            return errortext
+
+        request['request'] = util.xmltag_split(doc.tag)
+        LOGGER.debug('Request operation %s specified.' % request['request'])
+        tmp = doc.find('.').attrib.get('service')
+        if tmp is not None:
+            request['service'] = tmp
+
+        tmp = doc.find('.').attrib.get('version')
+        if tmp is not None:
+            request['version'] = tmp
+
+        tmp = doc.find('.//%s' % util.nspath_eval('ows:Version',
+        self.context.namespaces))
+
+        if tmp is not None:
+            request['version'] = tmp.text
+
+        tmp = doc.find('.').attrib.get('updateSequence')
+        if tmp is not None:
+            request['updatesequence'] = tmp
+
+        # GetCapabilities
+        if request['request'] == 'GetCapabilities':
+            tmp = doc.find(util.nspath_eval('ows:Sections',
+                  self.context.namespaces))
+            if tmp is not None:
+                request['sections'] = ','.join([section.text for section in \
+                doc.findall(util.nspath_eval('ows:Sections/ows:Section',
+                self.context.namespaces))])
+
+        # DescribeRecord
+        if request['request'] == 'DescribeRecord':
+            request['typename'] = [typename.text for typename in \
+            doc.findall(util.nspath_eval('csw:TypeName',
+            self.context.namespaces))]
+
+            tmp = doc.find('.').attrib.get('schemaLanguage')
+            if tmp is not None:
+                request['schemalanguage'] = tmp
+
+            tmp = doc.find('.').attrib.get('outputFormat')
+            if tmp is not None:
+                request['outputformat'] = tmp
+
+        # GetDomain
+        if request['request'] == 'GetDomain':
+            tmp = doc.find(util.nspath_eval('csw:ParameterName',
+                  self.context.namespaces))
+            if tmp is not None:
+                request['parametername'] = tmp.text
+
+            tmp = doc.find(util.nspath_eval('csw:PropertyName',
+                  self.context.namespaces))
+            if tmp is not None:
+                request['propertyname'] = tmp.text
+
+        # GetRecords
+        if request['request'] == 'GetRecords':
+            tmp = doc.find('.').attrib.get('outputSchema')
+            request['outputschema'] = tmp if tmp is not None \
+            else self.context.namespaces['csw']
+
+            tmp = doc.find('.').attrib.get('resultType')
+            request['resulttype'] = tmp if tmp is not None else None
+
+            tmp = doc.find('.').attrib.get('outputFormat')
+            request['outputformat'] = tmp if tmp is not None \
+            else 'application/xml'
+
+            tmp = doc.find('.').attrib.get('startPosition')
+            request['startposition'] = tmp if tmp is not None else 1
+
+            tmp = doc.find('.').attrib.get('requestId')
+            request['requestid'] = tmp if tmp is not None else None
+
+            tmp = doc.find('.').attrib.get('maxRecords')
+            request['maxrecords'] = tmp if tmp is not None else \
+            self.config.get('server', 'maxrecords')
+
+            client_mr = int(request['maxrecords'])
+            server_mr = int(self.config.get('server', 'maxrecords'))
+
+            if client_mr < server_mr:
+                request['maxrecords'] = client_mr
+
+            tmp = doc.find(util.nspath_eval('csw:DistributedSearch',
+                  self.context.namespaces))
+            if tmp is not None:
+                request['distributedsearch'] = True
+                hopcount = tmp.attrib.get('hopCount')
+                request['hopcount'] = int(hopcount)-1 if hopcount is not None \
+                else 1
+            else:
+                request['distributedsearch'] = False
+
+            tmp = doc.find(util.nspath_eval('csw:ResponseHandler',
+                  self.context.namespaces))
+            if tmp is not None:
+                request['responsehandler'] = tmp.text
+
+            tmp = doc.find(util.nspath_eval('csw:Query/csw:ElementSetName',
+                  self.context.namespaces))
+            request['elementsetname'] = tmp.text if tmp is not None else None
+
+            tmp = doc.find(util.nspath_eval(
+            'csw:Query', self.context.namespaces)).attrib.get('typeNames')
+            request['typenames'] = tmp.split() if tmp is not None \
+            else 'csw:Record'
+
+            request['elementname'] = [elname.text for elname in \
+            doc.findall(util.nspath_eval('csw:Query/csw:ElementName',
+            self.context.namespaces))]
+
+            request['constraint'] = {}
+            tmp = doc.find(util.nspath_eval('csw:Query/csw:Constraint',
+            self.context.namespaces))
+
+            if tmp is not None:
+                request['constraint'] = self._parse_constraint(tmp)
+                if isinstance(request['constraint'], str):  # parse error
+                    return 'Invalid Constraint: %s' % request['constraint']
+            else:
+                LOGGER.debug('No csw:Constraint (ogc:Filter or csw:CqlText) \
+                specified.')
+
+            tmp = doc.find(util.nspath_eval('csw:Query/ogc:SortBy',
+                  self.context.namespaces))
+            if tmp is not None:
+                LOGGER.debug('Sorted query specified.')
+                request['sortby'] = {}
+
+
+                try:
+                    elname = tmp.find(util.nspath_eval(
+                    'ogc:SortProperty/ogc:PropertyName',
+                    self.context.namespaces)).text
+
+                    request['sortby']['propertyname'] = \
+                    self.repository.queryables['_all'][elname]['dbcol']
+
+                    if (elname.find('BoundingBox') != -1 or
+                        elname.find('Envelope') != -1):
+                        # it's a spatial sort
+                        request['sortby']['spatial'] = True
+                except Exception, err:
+                    errortext = \
+                    'Invalid ogc:SortProperty/ogc:PropertyName: %s' % str(err)
+                    LOGGER.debug(errortext)
+                    return errortext
+
+                tmp2 =  tmp.find(util.nspath_eval(
+                'ogc:SortProperty/ogc:SortOrder', self.context.namespaces))
+                request['sortby']['order'] = tmp2.text if tmp2 is not None \
+                else 'ASC'
+            else:
+                request['sortby'] = None
+
+        # GetRecordById
+        if request['request'] == 'GetRecordById':
+            request['id'] = [id1.text for id1 in \
+            doc.findall(util.nspath_eval('csw:Id', self.context.namespaces))]
+
+            tmp = doc.find(util.nspath_eval('csw:ElementSetName',
+                  self.context.namespaces))
+            request['elementsetname'] = tmp.text if tmp is not None \
+            else 'summary'
+
+            tmp = doc.find('.').attrib.get('outputSchema')
+            request['outputschema'] = tmp if tmp is not None \
+            else self.context.namespaces['csw']
+
+            tmp = doc.find('.').attrib.get('outputFormat')
+            if tmp is not None:
+                request['outputformat'] = tmp
+
+        # Transaction
+        if request['request'] == 'Transaction':
+            request['verboseresponse'] = True
+            tmp = doc.find('.').attrib.get('verboseResponse')
+            if tmp is not None:
+                if tmp in ['false', '0']:
+                    request['verboseresponse'] = False
+
+            tmp = doc.find('.').attrib.get('requestId')
+            request['requestid'] = tmp if tmp is not None else None
+
+            request['transactions'] = []
+
+            for ttype in \
+            doc.xpath('//csw:Insert', namespaces=self.context.namespaces):
+                tname = ttype.attrib.get('typeName')
+
+                for mdrec in ttype.xpath('child::*'):
+                    xml = mdrec
+                    request['transactions'].append(
+                    {'type': 'insert', 'typename': tname, 'xml': xml})
+
+            for ttype in \
+            doc.xpath('//csw:Update', namespaces=self.context.namespaces):
+                child = ttype.xpath('child::*')
+                update = {'type': 'update'}
+
+                if len(child) == 1:  # it's a wholesale update
+                    update['xml'] = child[0]
+                else:  # it's a RecordProperty with Constraint Update
+                    update['recordproperty'] = []
+
+                    for recprop in ttype.findall(
+                    util.nspath_eval('csw:RecordProperty',
+                        self.context.namespaces)):
+                        rpname = recprop.find(util.nspath_eval('csw:Name',
+                        self.context.namespaces)).text
+                        rpvalue = recprop.find(
+                        util.nspath_eval('csw:Value',
+                        self.context.namespaces)).text
+
+                        update['recordproperty'].append(
+                        {'name': rpname, 'value': rpvalue})
+
+                    update['constraint'] = self._parse_constraint(
+                    ttype.find(util.nspath_eval('csw:Constraint',
+                    self.context.namespaces)))
+
+                request['transactions'].append(update)
+
+            for ttype in \
+            doc.xpath('//csw:Delete', namespaces=self.context.namespaces):
+                tname = ttype.attrib.get('typeName')
+                constraint = self._parse_constraint(
+                ttype.find(util.nspath_eval('csw:Constraint',
+                self.context.namespaces)))
+
+                if isinstance(constraint, str):  # parse error
+                    return 'Invalid Constraint: %s' % constraint
+
+                request['transactions'].append(
+                {'type': 'delete', 'typename': tname, 'constraint': constraint})
+
+        # Harvest
+        if request['request'] == 'Harvest':
+            request['source'] = doc.find(util.nspath_eval('csw:Source',
+            self.context.namespaces)).text
+
+            request['resourcetype'] = \
+            doc.find(util.nspath_eval('csw:ResourceType',
+            self.context.namespaces)).text
+
+            tmp = doc.find(util.nspath_eval('csw:ResourceFormat',
+                  self.context.namespaces))
+            if tmp is not None:
+                request['resourceformat'] = tmp.text
+            else:
+                request['resourceformat'] = 'application/xml'
+
+            tmp = doc.find(util.nspath_eval('csw:HarvestInterval',
+                  self.context.namespaces))
+            if tmp is not None:
+                request['harvestinterval'] = tmp.text
+
+            tmp = doc.find(util.nspath_eval('csw:ResponseHandler',
+                  self.context.namespaces))
+            if tmp is not None:
+                request['responsehandler'] = tmp.text
+        return request
+
+    def _write_record(self, recobj, queryables):
+        ''' Generate csw:Record '''
+        if self.kvp['elementsetname'] == 'brief':
+            elname = 'BriefRecord'
+        elif self.kvp['elementsetname'] == 'summary':
+            elname = 'SummaryRecord'
+        else:
+            elname = 'Record'
+
+        record = etree.Element(util.nspath_eval('csw:%s' % elname,
+                 self.context.namespaces))
+
+        if ('elementname' in self.kvp and
+            len(self.kvp['elementname']) > 0):
+            for elemname in self.kvp['elementname']:
+                if (elemname.find('BoundingBox') != -1 or
+                    elemname.find('Envelope') != -1):
+                    bboxel = write_boundingbox(util.getqattr(recobj,
+                    self.context.md_core_model['mappings']['pycsw:BoundingBox']),
+                    self.context.namespaces)
+                    if bboxel is not None:
+                        record.append(bboxel)
+                else:
+                    value = util.getqattr(recobj, queryables[elemname]['dbcol'])
+                    if value:
+                        etree.SubElement(record,
+                        util.nspath_eval(elemname,
+                        self.context.namespaces)).text = value
+        elif 'elementsetname' in self.kvp:
+            if (self.kvp['elementsetname'] == 'full' and
+            util.getqattr(recobj, self.context.md_core_model['mappings']\
+            ['pycsw:Typename']) == 'csw:Record' and
+            util.getqattr(recobj, self.context.md_core_model['mappings']\
+            ['pycsw:Schema']) == 'http://www.opengis.net/cat/csw/2.0.2' and
+            util.getqattr(recobj, self.context.md_core_model['mappings']\
+            ['pycsw:Type']) != 'service'):
+                # dump record as is and exit
+                return etree.fromstring(util.getqattr(recobj,
+                self.context.md_core_model['mappings']['pycsw:XML']))
+
+            etree.SubElement(record,
+            util.nspath_eval('dc:identifier', self.context.namespaces)).text = \
+            util.getqattr(recobj,
+            self.context.md_core_model['mappings']['pycsw:Identifier'])
+
+            for i in ['dc:title', 'dc:type']:
+                val = util.getqattr(recobj, queryables[i]['dbcol'])
+                if not val:
+                    val = ''
+                etree.SubElement(record, util.nspath_eval(i,
+                self.context.namespaces)).text = val
+
+            if self.kvp['elementsetname'] in ['summary', 'full']:
+                # add summary elements
+                keywords = util.getqattr(recobj, queryables['dc:subject']['dbcol'])
+                if keywords is not None:
+                    for keyword in keywords.split(','):
+                        etree.SubElement(record,
+                        util.nspath_eval('dc:subject',
+                        self.context.namespaces)).text = keyword
+
+                val = util.getqattr(recobj, queryables['dc:format']['dbcol'])
+                if val:
+                    etree.SubElement(record,
+                    util.nspath_eval('dc:format',
+                    self.context.namespaces)).text = val
+
+                # links
+                rlinks = util.getqattr(recobj,
+                self.context.md_core_model['mappings']['pycsw:Links'])
+
+                if rlinks:
+                    links = rlinks.split('^')
+                    for link in links:
+                        linkset = link.split(',')
+                        etree.SubElement(record,
+                        util.nspath_eval('dct:references',
+                        self.context.namespaces),
+                        scheme=linkset[2]).text = linkset[-1]
+
+                for i in ['dc:relation', 'dct:modified', 'dct:abstract']:
+                    val = util.getqattr(recobj, queryables[i]['dbcol'])
+                    if val is not None:
+                        etree.SubElement(record,
+                        util.nspath_eval(i, self.context.namespaces)).text = val
+
+            if self.kvp['elementsetname'] == 'full':  # add full elements
+                for i in ['dc:date', 'dc:creator', \
+                'dc:publisher', 'dc:contributor', 'dc:source', \
+                'dc:language', 'dc:rights']:
+                    val = util.getqattr(recobj, queryables[i]['dbcol'])
+                    if val:
+                        etree.SubElement(record,
+                        util.nspath_eval(i, self.context.namespaces)).text = val
+
+            # always write out ows:BoundingBox
+            bboxel = write_boundingbox(getattr(recobj,
+            self.context.md_core_model['mappings']['pycsw:BoundingBox']),
+            self.context.namespaces)
+
+            if bboxel is not None:
+                record.append(bboxel)
+        return record
+
+    def _write_response(self):
+        ''' Generate response '''
+        # set HTTP response headers and XML declaration
+
+        xmldecl=''
+        appinfo=''
+
+        LOGGER.debug('Writing response.')
+
+        if hasattr(self, 'soap') and self.soap:
+            self._gen_soap_wrapper()
+
+        if (isinstance(self.kvp, dict) and 'outputformat' in self.kvp and
+            self.kvp['outputformat'] == 'application/json'):
+            self.contenttype = self.kvp['outputformat']
+            from pycsw.formats import fmt_json
+            response = fmt_json.exml2json(self.response,
+            self.context.namespaces, self.pretty_print)
+        else:  # it's XML
+            self.contenttype = self.mimetype
+            response = etree.tostring(self.response,
+            pretty_print=self.pretty_print)
+            xmldecl = '<?xml version="1.0" encoding="%s" standalone="no"?>\n' \
+            % 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()
+
+
+    def _gen_soap_wrapper(self):
+        ''' Generate SOAP wrapper '''
+        LOGGER.debug('Writing SOAP wrapper.')
+        node = etree.Element(util.nspath_eval('soapenv:Envelope',
+        self.context.namespaces), nsmap=self.context.namespaces)
+
+        node.attrib[util.nspath_eval('xsi:schemaLocation',
+        self.context.namespaces)] = '%s %s' % \
+        (self.context.namespaces['soapenv'], self.context.namespaces['soapenv'])
+
+        node2 = etree.SubElement(node, util.nspath_eval('soapenv:Body',
+        self.context.namespaces))
+
+        if hasattr(self, 'exception') and self.exception:
+            node3 = etree.SubElement(node2, util.nspath_eval('soapenv:Fault',
+                    self.context.namespaces))
+            node4 = etree.SubElement(node3, util.nspath_eval('soapenv:Code',
+                    self.context.namespaces))
+
+            etree.SubElement(node4, util.nspath_eval('soapenv:Value',
+            self.context.namespaces)).text = 'soap:Server'
+
+            node4 = etree.SubElement(node3, util.nspath_eval('soapenv:Reason',
+                    self.context.namespaces))
+
+            etree.SubElement(node4, util.nspath_eval('soapenv:Text',
+            self.context.namespaces)).text = 'A server exception was encountered.'
+
+            node4 = etree.SubElement(node3, util.nspath_eval('soapenv:Detail',
+                    self.context.namespaces))
+            node4.append(self.response)
+        else:
+            node2.append(self.response)
+
+        self.response = node
+
+    def _gen_manager(self):
+        ''' Update self.context.model with CSW-T advertising '''
+        if (self.config.has_option('manager', 'transactions') and
+            self.config.get('manager', 'transactions') == 'true'):
+            self.context.model['operations']['Transaction'] = \
+            {'methods': {'get': False, 'post': True}, 'parameters': {}}
+
+            self.context.model['operations']['Harvest'] = \
+            {'methods': {'get': False, 'post': True}, 'parameters': \
+            {'ResourceType': {'values': \
+            ['http://www.opengis.net/cat/csw/2.0.2',
+             'http://www.opengis.net/wms',
+             'http://www.opengis.net/wfs',
+             'http://www.opengis.net/wcs',
+             'http://www.opengis.net/wps/1.0.0',
+             'http://www.opengis.net/sos/1.0',
+             'http://www.opengis.net/sos/2.0',
+             'http://www.isotc211.org/2005/gmi',
+             'urn:geoss:waf',
+            ]}}}
+
+            self.csw_harvest_pagesize = 10
+            if self.config.has_option('manager', 'csw_harvest_pagesize'):
+                self.csw_harvest_pagesize = int(self.config.get('manager',
+                'csw_harvest_pagesize'))
+
+    def _parse_constraint(self, element):
+        ''' Parse csw:Constraint '''
+
+        query = {}
+
+        tmp = element.find(util.nspath_eval('ogc:Filter', self.context.namespaces))
+        if tmp is not None:
+            LOGGER.debug('Filter constraint specified.')
+            try:
+                query['type'] = 'filter'
+                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:
+                return 'Invalid Filter request: %s' % err
+        tmp = element.find(util.nspath_eval('csw:CqlText', self.context.namespaces))
+        if tmp is not None:
+            LOGGER.debug('CQL specified: %s.' % tmp.text)
+            query['type'] = 'cql'
+            query['where'] = self._cql_update_queryables_mappings(tmp.text,
+            self.repository.queryables['_all'])
+            query['values'] = {}
+        return query
+
+    def _test_manager(self):
+        ''' Verify that transactions are allowed '''
+
+        if self.config.get('manager', 'transactions') != 'true':
+            raise RuntimeError('CSW-T interface is disabled')
+
+        ipaddress = self.environ['REMOTE_ADDR']
+
+        if not self.config.has_option('manager', 'allowed_ips') or \
+        (self.config.has_option('manager', 'allowed_ips') and not 
+         util.ipaddress_in_whitelist(ipaddress,
+                        self.config.get('manager', 'allowed_ips').split(','))):
+            raise RuntimeError(
+            'CSW-T operations not allowed for this IP address: %s' % ipaddress)
+
+    def _cql_update_queryables_mappings(self, cql, mappings):
+        ''' Transform CQL query's properties to underlying DB columns '''
+        LOGGER.debug('Raw CQL text = %s.' % cql)
+        LOGGER.debug(str(mappings.keys()))
+        if cql is not None:
+            for key in mappings.keys():
+                try:
+                    cql = cql.replace(key, mappings[key]['dbcol'])
+                except:
+                    cql = cql.replace(key, mappings[key])
+            LOGGER.debug('Interpolated CQL text = %s.' % cql)
+            return cql
+
+    def _write_transactionsummary(self, inserted=0, updated=0, deleted=0):
+        ''' Write csw:TransactionSummary construct '''
+        node = etree.Element(util.nspath_eval('csw:TransactionSummary',
+               self.context.namespaces))
+
+        if 'requestid' in self.kvp and self.kvp['requestid'] is not None:
+            node.attrib['requestId'] = self.kvp['requestid']
+
+        etree.SubElement(node, util.nspath_eval('csw:totalInserted',
+        self.context.namespaces)).text = str(inserted)
+
+        etree.SubElement(node, util.nspath_eval('csw:totalUpdated',
+        self.context.namespaces)).text = str(updated)
+
+        etree.SubElement(node, util.nspath_eval('csw:totalDeleted',
+        self.context.namespaces)).text = str(deleted)
+
+        return node
+
+    def _write_acknowledgement(self, root=True):
+        ''' Generate csw:Acknowledgement '''
+        node = etree.Element(util.nspath_eval('csw:Acknowledgement',
+               self.context.namespaces),
+        nsmap = self.context.namespaces, timeStamp=util.get_today_and_now())
+
+        if root:
+            node.attrib[util.nspath_eval('xsi:schemaLocation',
+            self.context.namespaces)] = \
+            '%s %s/csw/2.0.2/CSW-discovery.xsd' % (self.context.namespaces['csw'], \
+            self.config.get('server', 'ogc_schemas_base'))
+
+        node1 = etree.SubElement(node, util.nspath_eval('csw:EchoedRequest',
+                self.context.namespaces))
+        if self.requesttype == 'POST':
+            node1.append(etree.fromstring(self.request))
+        else:  # GET
+            node2 = etree.SubElement(node1, util.nspath_eval('ows:Get',
+                    self.context.namespaces))
+
+            node2.text = self.request
+
+        if self.async:
+            etree.SubElement(node, util.nspath_eval('csw:RequestId',
+            self.context.namespaces)).text = self.kvp['requestid']
+
+        return node
+
+    def _process_responsehandler(self, xml):
+        ''' Process response handler '''
+
+        if self.kvp['responsehandler'] is not None:
+            LOGGER.debug('Processing responsehandler %s.' %
+            self.kvp['responsehandler'])
+
+            uprh = urlparse.urlparse(self.kvp['responsehandler'])
+
+            if uprh.scheme == 'mailto':  # email
+                import smtplib
+
+                LOGGER.debug('Email detected.')
+
+                smtp_host = 'localhost'
+                if self.config.has_option('server', 'smtp_host'):
+                    smtp_host = self.config.get('server', 'smtp_host')
+
+                body = 'Subject: pycsw %s results\n\n%s' % \
+                (self.kvp['request'], xml)
+
+                try:
+                    LOGGER.debug('Sending email.')
+                    msg = smtplib.SMTP(smtp_host)
+                    msg.sendmail(
+                    self.config.get('metadata:main', 'contact_email'),
+                    uprh.path, body)
+                    msg.quit()
+                    LOGGER.debug('Email sent successfully.')
+                except Exception, err:
+                    LOGGER.debug('Error processing email: %s.' % str(err))
+
+            elif uprh.scheme == 'ftp':
+                import ftplib
+
+                LOGGER.debug('FTP detected.')
+
+                try:
+                    LOGGER.debug('Sending to FTP server.')
+                    ftp = ftplib.FTP(uprh.hostname)
+                    if uprh.username is not None:
+                        ftp.login(uprh.username, uprh.password)
+                    ftp.storbinary('STOR %s' % uprh.path[1:], StringIO(xml))
+                    ftp.quit()
+                    LOGGER.debug('FTP sent successfully.')
+                except Exception, err:
+                    LOGGER.debug('Error processing FTP: %s.' % str(err))
+
+    def _write_verboseresponse(self, insertresults):
+        ''' show insert result identifiers '''
+        insertresult = etree.Element(util.nspath_eval('csw:InsertResult',
+        self.context.namespaces))
+        for ir in insertresults:
+            briefrec = etree.SubElement(insertresult,
+                       util.nspath_eval('csw:BriefRecord',
+                       self.context.namespaces))
+
+            etree.SubElement(briefrec,
+            util.nspath_eval('dc:identifier',
+            self.context.namespaces)).text = ir['identifier']
+
+            etree.SubElement(briefrec,
+            util.nspath_eval('dc:title',
+            self.context.namespaces)).text = ir['title']
+
+        return insertresult
+
+def write_boundingbox(bbox, nsmap):
+    ''' Generate ows:BoundingBox '''
+
+    if bbox is not None:
+        try:
+            bbox2 = util.wkt2geom(bbox)
+        except:
+            return None
+
+        if len(bbox2) == 4:
+            boundingbox = etree.Element(util.nspath_eval('ows:BoundingBox',
+            nsmap), crs='urn:x-ogc:def:crs:EPSG:6.11:4326',
+            dimensions='2')
+
+            etree.SubElement(boundingbox, util.nspath_eval('ows:LowerCorner',
+            nsmap)).text = '%s %s' % (bbox2[1], bbox2[0])
+
+            etree.SubElement(boundingbox, util.nspath_eval('ows:UpperCorner',
+            nsmap)).text = '%s %s' % (bbox2[3], bbox2[2])
+
+            return boundingbox
+        else:
+            return None
+    else:
+        return None
diff --git a/pycsw/sru.py b/pycsw/sru.py
new file mode 100644
index 0000000..d7788e6
--- /dev/null
+++ b/pycsw/sru.py
@@ -0,0 +1,215 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+from lxml import etree
+from pycsw import fes, util
+
+
+class Sru(object):
+    """SRU wrapper class"""
+    def __init__(self, context):
+        self.sru_version = '1.1'
+
+        self.namespaces = {
+            'zd': 'http://www.loc.gov/zing/srw/diagnostic/',
+            'sru': 'http://www.loc.gov/zing/srw/',
+            'zr': 'http://explain.z3950.org/dtd/2.1/',
+            'zs': 'http://www.loc.gov/zing/srw/',
+            'srw_dc': 'info:srw/schema/1/dc-schema'
+        }
+
+        self.mappings = {
+            'csw:Record': {
+                'schema': {
+                    'name': 'dc',
+                    'identifier': 'info:srw/cql-context-set/1/dc-v1.1',
+                },
+                'index': {
+                    # map OGC queryables to XPath expressions
+                    'title': '4',
+                    'creator': '1003',
+                    'subject': '29',
+                    'abstract': '62',
+                    'publisher': '1018',
+                    'contributor': 'TBD',
+                    'modified': 'TBD',
+                    'date': '30',
+                    'type': '1031',
+                    'format': '1034',
+                    'identifier': '12',
+                    'source': 'TBD',
+                    'language': 'TBD',
+                    'relation': 'TBD',
+                    'rights': 'TBD',
+                    # bbox and full text map to internal fixed columns
+                    #'ows:BoundingBox': 'bbox',
+                    #'csw:AnyText': 'xml'
+                }
+            }
+        }
+
+        self.context = context
+        self.context.namespaces.update(self.namespaces)
+
+    def request_sru2csw(self, kvpin):
+        """transform an SRU request into a CSW request"""
+
+        kvpout = {'service': 'CSW', 'version': '2.0.2', 'mode': 'sru'}
+
+        if 'operation' in kvpin:
+            if kvpin['operation'] == 'explain':
+                kvpout['request'] = 'GetCapabilities'
+            elif kvpin['operation'] == 'searchRetrieve':
+                kvpout['request'] = 'GetRecords'
+                if 'startrecord' in kvpin:
+                    kvpout['startposition'] = int(kvpin['startrecord'])
+                if 'maximumrecords' in kvpin:
+                    kvpout['maxrecords'] = int(kvpin['maximumrecords'])
+                else:
+                    kvpout['maxrecords'] = 0
+
+                # TODO: make smarter typename fetching
+                kvpout['typenames'] = 'csw:Record'
+                kvpout['elementsetname'] = 'brief'
+                kvpout['constraintlanguage'] = 'CQL_TEXT'
+                kvpout['resulttype'] = 'results'
+
+                if 'query' in kvpin:
+                    pname_in_query = False
+                    for coops in fes.MODEL['ComparisonOperators'].keys():
+                        if kvpin['query'].find(fes.MODEL['ComparisonOperators'][coops]['opvalue']) != -1:
+                            pname_in_query = True
+                            break
+
+                    kvpout['constraint'] = {'type': 'cql'}
+
+                    if not pname_in_query:
+                        kvpout['constraint'] = 'csw:AnyText like \'%%%s%%\'' % kvpin['query']
+                    else:
+                        kvpout['constraint'] = kvpin['query']
+        else:
+            kvpout['request'] = 'GetCapabilities'
+
+        return kvpout
+
+    def response_csw2sru(self, element, environ):
+        """transform a CSW response into an SRU response"""
+
+        if util.xmltag_split(element.tag) == 'Capabilities':  # explain
+            node = etree.Element(util.nspath_eval('sru:explainResponse', self.namespaces), nsmap=self.namespaces)
+
+            etree.SubElement(node, util.nspath_eval('sru:version', self.namespaces)).text = self.sru_version
+
+            record = etree.SubElement(node, util.nspath_eval('sru:record', self.namespaces))
+
+            etree.SubElement(record, util.nspath_eval('sru:recordPacking', self.namespaces)).text = 'XML'
+            etree.SubElement(record, util.nspath_eval('sru:recordSchema', self.namespaces)).text = 'http://explain.z3950.org/dtd/2.1/'
+
+            recorddata = etree.SubElement(record, util.nspath_eval('sru:recordData', self.namespaces))
+
+            explain = etree.SubElement(recorddata, util.nspath_eval('zr:explain', self.namespaces))
+
+            serverinfo = etree.SubElement(explain, util.nspath_eval('zr:serverInfo', self.namespaces), protocol='SRU', version=self.sru_version, transport='http', method='GET POST SOAP')
+
+            etree.SubElement(serverinfo, util.nspath_eval('zr:host', self.namespaces)).text = environ.get('HTTP_HOST', environ["SERVER_NAME"])  # WSGI allows for either of these
+            etree.SubElement(serverinfo, util.nspath_eval('zr:port', self.namespaces)).text = environ['SERVER_PORT']
+            etree.SubElement(serverinfo, util.nspath_eval('zr:database', self.namespaces)).text = 'pycsw'
+
+            databaseinfo = etree.SubElement(explain, util.nspath_eval('zr:databaseInfo', self.namespaces))
+
+            etree.SubElement(databaseinfo, util.nspath_eval('zr:title', self.namespaces), lang='en', primary='true').text = element.xpath('//ows:Title', namespaces=self.context.namespaces)[0].text
+            etree.SubElement(databaseinfo, util.nspath_eval('zr:description', self.namespaces), lang='en', primary='true').text = element.xpath('//ows:Abstract', namespaces=self.context.namespaces)[0].text
+
+            indexinfo = etree.SubElement(explain, util.nspath_eval('zr:indexInfo', self.namespaces))
+            etree.SubElement(indexinfo, util.nspath_eval('zr:set', self.namespaces), name='dc', identifier='info:srw/cql-context-set/1/dc-v1.1')
+
+            for key, value in self.mappings['csw:Record']['index'].iteritems():
+                zrindex = etree.SubElement(indexinfo, util.nspath_eval('zr:index', self.namespaces), id=value)
+                etree.SubElement(zrindex, util.nspath_eval('zr:title', self.namespaces)).text = key
+                zrmap = etree.SubElement(zrindex, util.nspath_eval('zr:map', self.namespaces))
+                etree.SubElement(zrmap, util.nspath_eval('zr:map', self.namespaces), set='dc').text = key
+
+            zrindex = etree.SubElement(indexinfo, util.nspath_eval('zr:index', self.namespaces))
+            zrmap = etree.SubElement(zrindex, util.nspath_eval('zr:map', self.namespaces))
+            etree.SubElement(zrmap, util.nspath_eval('zr:name', self.namespaces), set='dc').text = 'title222'
+
+            schemainfo = etree.SubElement(explain, util.nspath_eval('zr:schemaInfo', self.namespaces))
+            zrschema = etree.SubElement(schemainfo, util.nspath_eval('zr:schema', self.namespaces), name='dc', identifier='info:srw/schema/1/dc-v1.1')
+            etree.SubElement(zrschema, util.nspath_eval('zr:title', self.namespaces)).text = 'Simple Dublin Core'
+
+            configinfo = etree.SubElement(explain, util.nspath_eval('zr:configInfo', self.namespaces))
+            etree.SubElement(configinfo, util.nspath_eval('zr:default', self.namespaces), type='numberOfRecords').text = '0'
+
+        elif util.xmltag_split(element.tag) == 'GetRecordsResponse':
+
+            recpos = int(element.xpath('//@nextRecord')[0]) - int(element.xpath('//@numberOfRecordsReturned')[0])
+
+            node = etree.Element(util.nspath_eval('zs:searchRetrieveResponse', self.namespaces), nsmap=self.namespaces)
+            etree.SubElement(node, util.nspath_eval('zs:version', self.namespaces)).text = self.sru_version
+            etree.SubElement(node, util.nspath_eval('zs:numberOfRecords', self.namespaces)).text = element.xpath('//@numberOfRecordsMatched')[0]
+
+            for rec in element.xpath('//csw:BriefRecord', namespaces=self.context.namespaces):
+                record = etree.SubElement(node, util.nspath_eval('zs:record', self.namespaces))
+                etree.SubElement(node, util.nspath_eval('zs:recordSchema', self.namespaces)).text = 'info:srw/schema/1/dc-v1.1'
+                etree.SubElement(node, util.nspath_eval('zs:recordPacking', self.namespaces)).text = 'xml'
+
+                recorddata = etree.SubElement(record, util.nspath_eval('zs:recordData', self.namespaces))
+                rec.tag = util.nspath_eval('srw_dc:srw_dc', self.namespaces)
+                recorddata.append(rec)
+
+                etree.SubElement(record, util.nspath_eval('zs:recordPosition', self.namespaces)).text = str(recpos)
+                recpos += 1
+
+        elif util.xmltag_split(element.tag) == 'ExceptionReport':
+            node = self.exceptionreport2diagnostic(element)
+        return node
+
+    def exceptionreport2diagnostic(self, element):
+        """transform a CSW exception into an SRU diagnostic"""
+        node = etree.Element(
+            util.nspath_eval('zs:searchRetrieveResponse', self.namespaces), nsmap=self.namespaces)
+
+        etree.SubElement(node, util.nspath_eval('zs:version', self.namespaces)).text = self.sru_version
+
+        diagnostics = etree.SubElement(node, util.nspath_eval('zs:diagnostics', self.namespaces))
+
+        diagnostic = etree.SubElement(
+            diagnostics, util.nspath_eval('zs:diagnostic', self.namespaces))
+
+        etree.SubElement(diagnostic, util.nspath_eval('zd:diagnostic', self.namespaces)).text = \
+            'info:srw/diagnostic/1/7'
+
+        etree.SubElement(diagnostic, util.nspath_eval('zd:message', self.namespaces)).text = \
+            element.find(util.nspath_eval('ows:Exception/ows:ExceptionText', self.context.namespaces)).text
+
+        etree.SubElement(diagnostic, util.nspath_eval('zd:details', self.namespaces)).text = \
+            element.find(util.nspath_eval('ows:Exception', self.context.namespaces)).attrib.get('exceptionCode')
+
+        return node
diff --git a/pycsw/util.py b/pycsw/util.py
new file mode 100644
index 0000000..157fa97
--- /dev/null
+++ b/pycsw/util.py
@@ -0,0 +1,424 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#          Angelos Tzotsos <tzotsos at gmail.com>
+#
+# Copyright (c) 2010 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import time
+import datetime
+import logging
+import urllib2
+from lxml import etree
+from shapely.wkt import loads
+from owslib.util import http_post
+
+LOGGER = logging.getLogger(__name__)
+
+#Global variables for spatial ranking algorithm
+ranking_enabled = False
+ranking_pass = False
+ranking_query_geometry = ''
+
+def get_today_and_now():
+    """Get the date, right now, in ISO8601"""
+    return time.strftime('%Y-%m-%dT%H:%M:%SZ', time.localtime())
+
+
+def datetime2iso8601(value):
+    """Return a datetime value as ISO8601"""
+    if value is None:
+        return None
+    if isinstance(value, datetime.date):
+        return value.strftime('%Y-%m-%d')
+    if value.hour == 0 and value.minute == 0 and value.second == 0:
+        # YYYY-MM-DD only
+        return value.strftime('%Y-%m-%d')
+    else:
+        return value.strftime('%Y-%m-%dT%H:%M:%SZ')
+
+
+def get_time_iso2unix(isotime):
+    """Convert ISO8601 to UNIX timestamp"""
+    return int(time.mktime(time.strptime(
+        isotime, '%Y-%m-%dT%H:%M:%SZ'))) - time.timezone
+
+
+def get_version_integer(version):
+    """Get an integer of the OGC version value x.y.z"""
+    if version is not None:  # split and make integer
+        xyz = version.split('.')
+        if len(xyz) != 3:
+            return -1
+        try:
+            return int(xyz[0]) * 10000 + int(xyz[1]) * 100 + int(xyz[2])
+        except Exception, err:
+            raise RuntimeError('%s' % str(err))
+    else:  # not a valid version string
+        return -1
+
+
+def find_exml(val, attrib=False):
+    """Test that the XML value exists, return value, else return None"""
+    if val is not None:
+        if attrib:  # it's an XML attribute
+            return val
+        else:  # it's an XML value
+            return val.text
+    else:
+        return None
+
+
+def nspath_eval(xpath, nsmap):
+    """Return an etree friendly xpath"""
+    out = []
+    for chunks in xpath.split('/'):
+        namespace, element = chunks.split(':')
+        out.append('{%s}%s' % (nsmap[namespace], element))
+    return '/'.join(out)
+
+
+def xmltag_split(tag):
+    """Return XML element bare tag name (without prefix)"""
+    try:
+        return tag.split('}')[1]
+    except:
+        return tag
+
+
+def xmltag_split2(tag, namespaces, colon=False):
+    """Return XML namespace prefix of element"""
+    try:
+        nsuri = tag.split('}')[0].split('{')[1]
+        nsprefix = [key for key, value in namespaces.iteritems()
+                    if value == nsuri]
+        value = nsprefix[0]
+        if colon:
+            return '%s:' % nsprefix[0]
+        else:
+            return nsprefix[0]
+    except:
+        return ''
+
+
+def wkt2geom(wkt, bounds=True):
+    """return Shapely geometry object based on WKT/EWKT"""
+
+    geometry = None
+
+    if wkt.find('SRID') != -1:
+        wkt = wkt.split(';')[-1]
+
+    geometry = loads(wkt)
+
+    if bounds:
+        return geometry.envelope.bounds
+    else:
+        return geometry
+
+
+def bbox2wktpolygon(bbox):
+    """Return OGC WKT Polygon of a simple bbox string"""
+    tmp = bbox.split(',')
+    minx = float(tmp[0])
+    miny = float(tmp[1])
+    maxx = float(tmp[2])
+    maxy = float(tmp[3])
+    return 'POLYGON((%.2f %.2f, %.2f %.2f, %.2f %.2f, %.2f %.2f, %.2f %.2f))' \
+        % (minx, miny, minx, maxy, maxx, maxy, maxx, miny, minx, miny)
+
+
+def query_spatial(bbox_data_wkt, bbox_input_wkt, predicate, distance):
+    """perform spatial query"""
+
+    if bbox_data_wkt is None or bbox_input_wkt is None:
+        return 'false'
+
+    if predicate in ['beyond', 'dwithin'] and distance == 'false':
+        return 'false'
+
+    if bbox_data_wkt.find('SRID') != -1:  # it's EWKT; chop off 'SRID=\d+;'
+        bbox1 = loads(bbox_data_wkt.split(';')[-1])
+    else:
+        bbox1 = loads(bbox_data_wkt)
+
+    bbox2 = loads(bbox_input_wkt)
+
+    # map query to Shapely Binary Predicates:
+    if predicate == 'bbox':
+        result = bbox1.intersects(bbox2)
+    elif predicate == 'beyond':
+        result = bbox1.distance(bbox2) > float(distance)
+    elif predicate == 'contains':
+        result = bbox1.contains(bbox2)
+    elif predicate == 'crosses':
+        result = bbox1.crosses(bbox2)
+    elif predicate == 'disjoint':
+        result = bbox1.disjoint(bbox2)
+    elif predicate == 'dwithin':
+        result = bbox1.distance(bbox2) <= float(distance)
+    elif predicate == 'equals':
+        result = bbox1.equals(bbox2)
+    elif predicate == 'intersects':
+        result = bbox1.intersects(bbox2)
+    elif predicate == 'overlaps':
+        if bbox1.intersects(bbox2) and not bbox1.touches(bbox2):
+            result = True
+        else:
+            result = False
+    elif predicate == 'touches':
+        result = bbox1.touches(bbox2)
+    elif predicate == 'within':
+        result = bbox1.within(bbox2)
+    else:
+        raise RuntimeError('Invalid spatial query predicate: %s' % predicate)
+
+    if result:
+        return 'true'
+    else:
+        return 'false'
+
+
+def get_geometry_area(geometry):
+    """Derive area of a given geometry"""
+    try:
+        if geometry is not None:
+            return str(loads(geometry).area)
+        return '0'
+    except:
+        return '0'
+
+def get_spatial_overlay_rank(target_geometry, query_geometry):
+    """Derive spatial overlay rank for geospatial search as per Lanfear (2006)
+    http://pubs.usgs.gov/of/2006/1279/2006-1279.pdf"""
+    
+    from shapely.geometry.base import BaseGeometry
+    #TODO: Add those parameters to config file
+    kt = 1.0
+    kq = 1.0
+    if target_geometry is not None and query_geometry is not None:
+        try:
+            q_geom = loads(query_geometry)
+            t_geom = loads(target_geometry)
+            Q = q_geom.area
+            T = t_geom.area
+            if any(item == 0.0 for item in [Q, T]):
+                    LOGGER.warn('Geometry has no area')
+                    return '0'
+            X = t_geom.intersection(q_geom).area
+            if kt == 1.0 and kq == 1.0:
+                LOGGER.debug('Spatial Rank: %s', str((X/Q)*(X/T)))
+                return str((X/Q)*(X/T))
+            else:
+                LOGGER.debug('Spatial Rank: %s', str(((X/Q)**kq)*((X/T)**kt)))
+                return str(((X/Q)**kq)*((X/T)**kt))
+        except Exception, err:
+                LOGGER.warn('Cannot derive spatial overlay ranking %s', err)
+                return '0'
+    return '0'
+
+def bbox_from_polygons(bboxs):
+    """Derive an aggregated bbox from n polygons"""
+
+    from shapely.geometry import MultiPolygon
+
+    polys = []
+    for bbx in bboxs:
+        polys.append(loads(bbx))
+
+    try:
+        bbx = MultiPolygon(polys).bounds
+        bstr = '%.2f,%.2f,%.2f,%.2f' % (bbx[0], bbx[1], bbx[2], bbx[3])
+        return bbox2wktpolygon(bstr)
+    except Exception, err:
+        raise RuntimeError('Cannot aggregate polygons: %s' % str(err))
+
+
+def update_xpath(nsmap, xml, recprop):
+    """Update XML document XPath values"""
+
+    if isinstance(xml, unicode):  # not lxml serialized yet
+        xml = etree.fromstring(xml)
+
+    recprop = eval(recprop)
+    nsmap = eval(nsmap)
+    try:
+        nodes = xml.xpath(recprop['rp']['xpath'], namespaces=nsmap)
+        if len(nodes) > 0:  # matches
+            for node1 in nodes:
+                if node1.text != recprop['value']:  # values differ, update
+                    node1.text = recprop['value']
+    except Exception, err:
+        raise RuntimeError('ERROR: %s' % str(err))
+
+    return etree.tostring(xml)
+
+
+def transform_mappings(queryables, typename, reverse=False):
+    """transform metadata model mappings"""
+    if reverse:  # from csw:Record
+        for qbl in queryables.keys():
+            if qbl in typename.values():
+                tmp = [k for k, v in typename.iteritems() if v == qbl][0]
+                val = queryables[tmp]
+                queryables[qbl] = {}
+                queryables[qbl]['xpath'] = val['xpath']
+                queryables[qbl]['dbcol'] = val['dbcol']
+    else:  # to csw:Record
+        for qbl in queryables.keys():
+            if qbl in typename.keys():
+                queryables[qbl] = queryables[qbl]
+
+
+def get_anytext(bag):
+    """
+    generate bag of text for free text searches
+    accepts list of words, string of XML, or etree.Element
+    """
+
+    if isinstance(bag, list):  # list of words
+        return ' '.join(filter(None, bag)).strip()
+    else:  # xml
+        if isinstance(bag, unicode) or isinstance(bag, str):  # not serialized yet
+            bag = etree.fromstring(bag)
+            # get all XML element content
+        return ' '.join([value.strip() for value in bag.xpath('//text()')])
+
+
+def exml2dict(element, namespaces):
+    """Convert an lxml object to JSON
+        From:
+        http://bitbucket.org/smulloni/pesterfish/src/1578db946d74/pesterfish.py
+    """
+
+    jdict = dict(tag='%s%s' % (xmltag_split2(element.tag, namespaces, True),
+                               xmltag_split(element.tag)))
+    if element.text:
+        if element.text.find('\n') == -1:
+            jdict['text'] = element.text
+    if element.attrib:
+        jdict['attributes'] = dict(('%s%s' % (xmltag_split2(k, namespaces, True),
+                                   xmltag_split(k)), f(v) if hasattr(v, 'keys') else v)
+                                   for k, v in element.attrib.items())
+    children = element.getchildren()
+    if children:
+        jdict['children'] = map(lambda x: exml2dict(x, namespaces), children)
+    return jdict
+
+
+def getqattr(obj, name):
+    """get value of an object, safely"""
+    try:
+        value = getattr(obj, name)
+        if hasattr(value, '__call__'):  # function generated value
+            LOGGER.debug('attribute is a function')
+            if name.find('link') != -1:  # list of link tuple quadruplets
+                LOGGER.debug('attribute is a link')
+                return _linkify(value())
+            return value()
+        elif (isinstance(value, datetime.datetime)
+              or isinstance(value, datetime.date)):  # datetime object
+            LOGGER.debug('attribute is a date')
+            return datetime2iso8601(value)
+        return value
+    except:
+        return None
+
+
+def _linkify(value):
+    """create link format"""
+    out = []
+    for link in value:
+        out.append(','.join(list(link)))
+    return '^'.join(out)
+
+
+def http_request(method, url, request=None, timeout=30):
+    """Perform HTTP request"""
+    if method == 'POST':
+        return http_post(url, request, timeout=timeout)
+    else:  # GET
+        request = urllib2.Request(url)
+        request.add_header('User-Agent', 'pycsw (http://pycsw.org/)')
+        return urllib2.urlopen(request, timeout=timeout).read()
+
+def bind_url(url):
+    """binds an HTTP GET query string endpiont"""
+    if url.find('?') == -1: # like http://host/wms
+        binder = '?'
+
+    # if like http://host/wms?foo=bar& or http://host/wms?foo=bar
+    if url.find('=') != -1:
+        if url.find('&', -1) != -1: # like http://host/wms?foo=bar&
+            binder = ''
+        else: # like http://host/wms?foo=bar
+            binder = '&'
+
+    # if like http://host/wms?foo
+    if url.find('?') != -1:
+        if url.find('?', -1) != -1: # like http://host/wms?
+            binder = ''
+        elif url.find('&', -1) == -1: # like http://host/wms?foo=bar
+            binder = '&'
+    return '%s%s' % (url, binder)
+
+def ip_in_network_cidr(ip, net):
+    """decipher whether IP is within CIDR range"""
+    ipaddr = int(''.join([ '%02x' % int(x) for x in ip.split('.') ]), 16)
+    netstr, bits = net.split('/')
+    netaddr = int(''.join([ '%02x' % int(x) for x in netstr.split('.') ]), 16)
+    mask = (0xffffffff << (32 - int(bits))) & 0xffffffff
+    return (ipaddr & mask) == (netaddr & mask)
+
+def ipaddress_in_whitelist(ipaddress, whitelist):
+    """
+    decipher whether IP is in IP whitelist
+    IP whitelist is a list supporting:
+    - single IP address (e.g. 192.168.0.1)
+    - IP range using CIDR (e.g. 192.168.0/22)
+    - IP range using subnet wildcard (e.g. 192.168.0.*, 192.168.*)
+    """
+
+    if ipaddress in whitelist:
+        return True
+    else:
+        for white in whitelist:
+            if white.find('/') != -1:  # CIDR
+                if ip_in_network_cidr(ipaddress, white):
+                    return True
+            elif white.find('*') != -1:  # subnet wildcard
+                    if ipaddress.startswith(white.split('*')[0]):
+                        return True
+    return False
+
+def sniff_table(table):
+    """Checks whether repository.table is a schema namespaced"""
+    schema = None
+    table = table
+    if table.find('.') != - 1: 
+        schema, table = table.split('.')
+    return [schema, table]
diff --git a/requirements-dev.txt b/requirements-dev.txt
new file mode 100644
index 0000000..6eeb2fb
--- /dev/null
+++ b/requirements-dev.txt
@@ -0,0 +1,2 @@
+Paver==1.2.2
+sphinx
diff --git a/requirements-standalone.txt b/requirements-standalone.txt
new file mode 100644
index 0000000..716454a
--- /dev/null
+++ b/requirements-standalone.txt
@@ -0,0 +1,2 @@
+psycopg2
+SQLAlchemy>=0.6
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..28c2aa3
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,4 @@
+lxml==3.2.5
+Shapely==1.3.0
+pyproj==1.9.3
+OWSLib==0.8.7
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..cc49aa9
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,153 @@
+# -*- coding: iso-8859-15 -*-
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import os
+from distutils.core import setup
+import pycsw
+
+
+def is_package(path):
+    """Decipher whether a filepath is a Python package"""
+    return (
+        os.path.isdir(path) and
+        os.path.isfile(os.path.join(path, '__init__.py'))
+    )
+
+
+def find_packages(path, base=''):
+    """Find all packages in path"""
+    packages = {}
+    for item in os.listdir(path):
+        directory = os.path.join(path, item)
+        if is_package(directory):
+            if base:
+                module_name = "%(base)s.%(item)s" % vars()
+            else:
+                module_name = item
+            packages[module_name] = directory
+            packages.update(find_packages(directory, module_name))
+    return packages
+
+
+def find_packages_xsd(location='.'):
+    """
+    Figure out which packages need to be specified as package_data
+    keys (the ones with XML Schema documents
+    """
+    packages = []
+    for root, dirs, files in os.walk(location):
+        if 'schemas' in dirs:  # include as a package_data key
+            packages.append(root.replace(os.sep, '.').replace('..', ''))
+    return packages
+
+
+def get_package_data(location='.', forced_dir=None):
+    """Generate package_data dict"""
+    package_data = {}
+    for ploc in location:
+        # turn package identifier into filepath
+        filepath = ploc.replace('.', os.sep)
+        if forced_dir is not None:  # force os.walk to traverse subdir
+            filepath = '%s%sschemas' % (filepath, os.sep)
+        for root, dirs, files in os.walk(filepath):
+            if len(files) > 0:
+                # find all the XML Schema documents
+                xsds = filter(lambda x: x.find('.xsd') != -1, files)
+                if len(xsds) > 0:
+                    if ploc not in package_data:  # set key
+                        package_data[ploc] = []
+                    for xsd in xsds:  # add filename to list
+                        root2 = root.replace(filepath, '').split(os.sep)[1:]
+                        pathstr = '%s%s%s' % (os.sep.join(root2), os.sep, xsd)
+                        if forced_dir is not None:
+                            filename = 'schemas%s%s' % (os.sep, pathstr)
+                        else:
+                            filename = pathstr
+                        package_data[ploc].append(filename)
+    return package_data
+
+# ensure a fresh MANIFEST file is generated
+if (os.path.exists('MANIFEST')):
+    os.unlink('MANIFEST')
+
+# set setup.packages
+PACKAGES = find_packages('.').keys()
+
+# get package_data.keys()
+PACKAGE_DATA_XSD = find_packages_xsd('pycsw')
+
+# Because package 'pycsw' contains all other packages,
+# process it last, so that it doesn't set it's package_data
+# files to one already set in other packages
+ROOT_PACKAGE = PACKAGE_DATA_XSD.pop(0)
+
+# set package_data
+PACKAGE_DATA = get_package_data(PACKAGE_DATA_XSD)
+
+# update package_data for pycsw package
+PACKAGE_DATA.update(get_package_data([ROOT_PACKAGE], 'schemas'))
+
+# set the dependencies
+# GeoNode and OpenDataCatalog do not require SQLAlchemy
+INSTALL_REQUIRES = [line.strip() for line in open('requirements.txt')]
+
+KEYWORDS = ('pycsw csw catalogue catalog metadata discovery search'
+            ' ogc iso fgdc dif ebrim inspire')
+
+DESCRIPTION = 'pycsw is an OGC CSW server implementation written in Python'
+
+setup(
+    name='pycsw',
+    version=pycsw.__version__,
+    description=DESCRIPTION,
+    long_description=open('README.txt').read(),
+    license='MIT',
+    platforms='all',
+    keywords=KEYWORDS,
+    author='Tom Kralidis',
+    author_email='tomkralidis at gmail.com',
+    maintainer='Tom Kralidis',
+    maintainer_email='tomkralidis at gmail.com',
+    url='http://pycsw.org/',
+    install_requires=INSTALL_REQUIRES,
+    packages=PACKAGES,
+    package_data=PACKAGE_DATA,
+    scripts=[os.path.join('bin', 'pycsw-admin.py')],
+    classifiers=[
+        'Development Status :: 5 - Production/Stable',
+        'Environment :: Web Environment',
+        'Intended Audience :: Developers',
+        'Intended Audience :: Science/Research',
+        'License :: OSI Approved :: MIT License',
+        'Operating System :: OS Independent',
+        'Programming Language :: Python',
+        'Topic :: Scientific/Engineering :: GIS',
+    ]
+)
diff --git a/tests/README.txt b/tests/README.txt
new file mode 100644
index 0000000..6195fa9
--- /dev/null
+++ b/tests/README.txt
@@ -0,0 +1 @@
+See http://pycsw.org/docs/testing.html#tests
diff --git a/tests/expected/suites_apiso-inspire_get_GetCapabilities-lang.xml b/tests/expected/suites_apiso-inspire_get_GetCapabilities-lang.xml
new file mode 100644
index 0000000..ca08fe7
--- /dev/null
+++ b/tests/expected/suites_apiso-inspire_get_GetCapabilities-lang.xml
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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" xmlns: [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedISOQueryables">
+        <ows:Value>apiso:DistanceValue</ows:Value>
+        <ows:Value>apiso:Abstract</ows:Value>
+        <ows:Value>apiso:RevisionDate</ows:Value>
+        <ows:Value>apiso:Subject</ows:Value>
+        <ows:Value>apiso:KeywordType</ows:Value>
+        <ows:Value>apiso:Title</ows:Value>
+        <ows:Value>apiso:CRS</ows:Value>
+        <ows:Value>apiso:PublicationDate</ows:Value>
+        <ows:Value>apiso:Type</ows:Value>
+        <ows:Value>apiso:AlternateTitle</ows:Value>
+        <ows:Value>apiso:BoundingBox</ows:Value>
+        <ows:Value>apiso:AnyText</ows:Value>
+        <ows:Value>apiso:ParentIdentifier</ows:Value>
+        <ows:Value>apiso:Modified</ows:Value>
+        <ows:Value>apiso:Operation</ows:Value>
+        <ows:Value>apiso:Format</ows:Value>
+        <ows:Value>apiso:TempExtent_end</ows:Value>
+        <ows:Value>apiso:DistanceUOM</ows:Value>
+        <ows:Value>apiso:OrganisationName</ows:Value>
+        <ows:Value>apiso:ServiceType</ows:Value>
+        <ows:Value>apiso:TempExtent_begin</ows:Value>
+        <ows:Value>apiso:ResourceLanguage</ows:Value>
+        <ows:Value>apiso:ServiceTypeVersion</ows:Value>
+        <ows:Value>apiso:OperatesOn</ows:Value>
+        <ows:Value>apiso:Denominator</ows:Value>
+        <ows:Value>apiso:HasSecurityConstraints</ows:Value>
+        <ows:Value>apiso:OperatesOnIdentifier</ows:Value>
+        <ows:Value>apiso:GeographicDescriptionCode</ows:Value>
+        <ows:Value>apiso:Language</ows:Value>
+        <ows:Value>apiso:Identifier</ows:Value>
+        <ows:Value>apiso:OperatesOnName</ows:Value>
+        <ows:Value>apiso:TopicCategory</ows:Value>
+        <ows:Value>apiso:CreationDate</ows:Value>
+        <ows:Value>apiso:CouplingType</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="AdditionalQueryables">
+        <ows:Value>apiso:Lineage</ows:Value>
+        <ows:Value>apiso:Classification</ows:Value>
+        <ows:Value>apiso:Creator</ows:Value>
+        <ows:Value>apiso:Relation</ows:Value>
+        <ows:Value>apiso:OtherConstraints</ows:Value>
+        <ows:Value>apiso:SpecificationTitle</ows:Value>
+        <ows:Value>apiso:ResponsiblePartyRole</ows:Value>
+        <ows:Value>apiso:SpecificationDateType</ows:Value>
+        <ows:Value>apiso:Degree</ows:Value>
+        <ows:Value>apiso:Contributor</ows:Value>
+        <ows:Value>apiso:ConditionApplyingToAccessAndUse</ows:Value>
+        <ows:Value>apiso:SpecificationDate</ows:Value>
+        <ows:Value>apiso:AccessConstraints</ows:Value>
+        <ows:Value>apiso:Publisher</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+    <inspire_ds:ExtendedCapabilities xsi:schemaLocation="http://inspire.ec.europa.eu/schemas/inspire_ds/1.0 http://inspire.ec.europa.eu/schemas/inspire_ds/1.0/inspire_ds.xsd">
+      <inspire_common:ResourceLocator>
+        <inspire_common:URL>http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities</inspire_common:URL>
+        <inspire_common:MediaType>application/xml</inspire_common:MediaType>
+      </inspire_common:ResourceLocator>
+      <inspire_common:ResourceType>service</inspire_common:ResourceType>
+      <inspire_common:TemporalReference>
+        <inspire_common:TemporalExtent>
+          <inspire_common:IntervalOfDates>
+            <inspire_common:StartingDate>2011-02-01</inspire_common:StartingDate>
+            <inspire_common:EndDate>2011-03-30</inspire_common:EndDate>
+          </inspire_common:IntervalOfDates>
+        </inspire_common:TemporalExtent>
+      </inspire_common:TemporalReference>
+      <inspire_common:Conformity>
+        <inspire_common:Specification xsi:type="inspire_common:citationInspireInteroperabilityRegulation_eng">
+          <inspire_common:Title>COMMISSION REGULATION (EU) No 1089/2010 of 23 November 2010 implementing Directive 2007/2/EC of the European Parliament and of the Council as regards interoperability of spatial data sets and services</inspire_common:Title>
+          <inspire_common:DateOfPublication>2010-12-08</inspire_common:DateOfPublication>
+          <inspire_common:URI>OJ:L:2010:323:0011:0102:EN:PDF</inspire_common:URI>
+          <inspire_common:ResourceLocator>
+            <inspire_common:URL>http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2010:323:0011:0102:EN:PDF</inspire_common:URL>
+            <inspire_common:MediaType>application/pdf</inspire_common:MediaType>
+          </inspire_common:ResourceLocator>
+        </inspire_common:Specification>
+        <inspire_common:Degree>notEvaluated</inspire_common:Degree>
+      </inspire_common:Conformity>
+      <inspire_common:MetadataPointOfContact>
+        <inspire_common:OrganisationName>National Technical University of Athens</inspire_common:OrganisationName>
+        <inspire_common:EmailAddress>tzotsos at gmail.com</inspire_common:EmailAddress>
+      </inspire_common:MetadataPointOfContact>
+      <inspire_common:MetadataDate>2011-03-29</inspire_common:MetadataDate>
+      <inspire_common:SpatialDataServiceType>discovery</inspire_common:SpatialDataServiceType>
+      <inspire_common:MandatoryKeyword xsi:type="inspire_common:classificationOfSpatialDataService">
+        <inspire_common:KeywordValue>infoCatalogueService</inspire_common:KeywordValue>
+      </inspire_common:MandatoryKeyword>
+      <inspire_common:Keyword xsi:type="inspire_common:inspireTheme_eng">
+        <inspire_common:OriginatingControlledVocabulary>
+          <inspire_common:Title>GEMET - INSPIRE themes</inspire_common:Title>
+          <inspire_common:DateOfPublication>2008-06-01</inspire_common:DateOfPublication>
+        </inspire_common:OriginatingControlledVocabulary>
+        <inspire_common:KeywordValue>Utility and governmental services</inspire_common:KeywordValue>
+      </inspire_common:Keyword>
+      <inspire_common:SupportedLanguages>
+        <inspire_common:DefaultLanguage>
+          <inspire_common:Language>eng</inspire_common:Language>
+        </inspire_common:DefaultLanguage>
+        <inspire_common:SupportedLanguage>
+          <inspire_common:Language>eng</inspire_common:Language>
+        </inspire_common:SupportedLanguage>
+        <inspire_common:SupportedLanguage>
+          <inspire_common:Language>gre</inspire_common:Language>
+        </inspire_common:SupportedLanguage>
+      </inspire_common:SupportedLanguages>
+      <inspire_common:ResponseLanguage>
+        <inspire_common:Language>eng</inspire_common:Language>
+      </inspire_common:ResponseLanguage>
+    </inspire_ds:ExtendedCapabilities>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_apiso-inspire_get_GetCapabilities.xml b/tests/expected/suites_apiso-inspire_get_GetCapabilities.xml
new file mode 100644
index 0000000..ca08fe7
--- /dev/null
+++ b/tests/expected/suites_apiso-inspire_get_GetCapabilities.xml
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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" xmlns: [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedISOQueryables">
+        <ows:Value>apiso:DistanceValue</ows:Value>
+        <ows:Value>apiso:Abstract</ows:Value>
+        <ows:Value>apiso:RevisionDate</ows:Value>
+        <ows:Value>apiso:Subject</ows:Value>
+        <ows:Value>apiso:KeywordType</ows:Value>
+        <ows:Value>apiso:Title</ows:Value>
+        <ows:Value>apiso:CRS</ows:Value>
+        <ows:Value>apiso:PublicationDate</ows:Value>
+        <ows:Value>apiso:Type</ows:Value>
+        <ows:Value>apiso:AlternateTitle</ows:Value>
+        <ows:Value>apiso:BoundingBox</ows:Value>
+        <ows:Value>apiso:AnyText</ows:Value>
+        <ows:Value>apiso:ParentIdentifier</ows:Value>
+        <ows:Value>apiso:Modified</ows:Value>
+        <ows:Value>apiso:Operation</ows:Value>
+        <ows:Value>apiso:Format</ows:Value>
+        <ows:Value>apiso:TempExtent_end</ows:Value>
+        <ows:Value>apiso:DistanceUOM</ows:Value>
+        <ows:Value>apiso:OrganisationName</ows:Value>
+        <ows:Value>apiso:ServiceType</ows:Value>
+        <ows:Value>apiso:TempExtent_begin</ows:Value>
+        <ows:Value>apiso:ResourceLanguage</ows:Value>
+        <ows:Value>apiso:ServiceTypeVersion</ows:Value>
+        <ows:Value>apiso:OperatesOn</ows:Value>
+        <ows:Value>apiso:Denominator</ows:Value>
+        <ows:Value>apiso:HasSecurityConstraints</ows:Value>
+        <ows:Value>apiso:OperatesOnIdentifier</ows:Value>
+        <ows:Value>apiso:GeographicDescriptionCode</ows:Value>
+        <ows:Value>apiso:Language</ows:Value>
+        <ows:Value>apiso:Identifier</ows:Value>
+        <ows:Value>apiso:OperatesOnName</ows:Value>
+        <ows:Value>apiso:TopicCategory</ows:Value>
+        <ows:Value>apiso:CreationDate</ows:Value>
+        <ows:Value>apiso:CouplingType</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="AdditionalQueryables">
+        <ows:Value>apiso:Lineage</ows:Value>
+        <ows:Value>apiso:Classification</ows:Value>
+        <ows:Value>apiso:Creator</ows:Value>
+        <ows:Value>apiso:Relation</ows:Value>
+        <ows:Value>apiso:OtherConstraints</ows:Value>
+        <ows:Value>apiso:SpecificationTitle</ows:Value>
+        <ows:Value>apiso:ResponsiblePartyRole</ows:Value>
+        <ows:Value>apiso:SpecificationDateType</ows:Value>
+        <ows:Value>apiso:Degree</ows:Value>
+        <ows:Value>apiso:Contributor</ows:Value>
+        <ows:Value>apiso:ConditionApplyingToAccessAndUse</ows:Value>
+        <ows:Value>apiso:SpecificationDate</ows:Value>
+        <ows:Value>apiso:AccessConstraints</ows:Value>
+        <ows:Value>apiso:Publisher</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+    <inspire_ds:ExtendedCapabilities xsi:schemaLocation="http://inspire.ec.europa.eu/schemas/inspire_ds/1.0 http://inspire.ec.europa.eu/schemas/inspire_ds/1.0/inspire_ds.xsd">
+      <inspire_common:ResourceLocator>
+        <inspire_common:URL>http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities</inspire_common:URL>
+        <inspire_common:MediaType>application/xml</inspire_common:MediaType>
+      </inspire_common:ResourceLocator>
+      <inspire_common:ResourceType>service</inspire_common:ResourceType>
+      <inspire_common:TemporalReference>
+        <inspire_common:TemporalExtent>
+          <inspire_common:IntervalOfDates>
+            <inspire_common:StartingDate>2011-02-01</inspire_common:StartingDate>
+            <inspire_common:EndDate>2011-03-30</inspire_common:EndDate>
+          </inspire_common:IntervalOfDates>
+        </inspire_common:TemporalExtent>
+      </inspire_common:TemporalReference>
+      <inspire_common:Conformity>
+        <inspire_common:Specification xsi:type="inspire_common:citationInspireInteroperabilityRegulation_eng">
+          <inspire_common:Title>COMMISSION REGULATION (EU) No 1089/2010 of 23 November 2010 implementing Directive 2007/2/EC of the European Parliament and of the Council as regards interoperability of spatial data sets and services</inspire_common:Title>
+          <inspire_common:DateOfPublication>2010-12-08</inspire_common:DateOfPublication>
+          <inspire_common:URI>OJ:L:2010:323:0011:0102:EN:PDF</inspire_common:URI>
+          <inspire_common:ResourceLocator>
+            <inspire_common:URL>http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2010:323:0011:0102:EN:PDF</inspire_common:URL>
+            <inspire_common:MediaType>application/pdf</inspire_common:MediaType>
+          </inspire_common:ResourceLocator>
+        </inspire_common:Specification>
+        <inspire_common:Degree>notEvaluated</inspire_common:Degree>
+      </inspire_common:Conformity>
+      <inspire_common:MetadataPointOfContact>
+        <inspire_common:OrganisationName>National Technical University of Athens</inspire_common:OrganisationName>
+        <inspire_common:EmailAddress>tzotsos at gmail.com</inspire_common:EmailAddress>
+      </inspire_common:MetadataPointOfContact>
+      <inspire_common:MetadataDate>2011-03-29</inspire_common:MetadataDate>
+      <inspire_common:SpatialDataServiceType>discovery</inspire_common:SpatialDataServiceType>
+      <inspire_common:MandatoryKeyword xsi:type="inspire_common:classificationOfSpatialDataService">
+        <inspire_common:KeywordValue>infoCatalogueService</inspire_common:KeywordValue>
+      </inspire_common:MandatoryKeyword>
+      <inspire_common:Keyword xsi:type="inspire_common:inspireTheme_eng">
+        <inspire_common:OriginatingControlledVocabulary>
+          <inspire_common:Title>GEMET - INSPIRE themes</inspire_common:Title>
+          <inspire_common:DateOfPublication>2008-06-01</inspire_common:DateOfPublication>
+        </inspire_common:OriginatingControlledVocabulary>
+        <inspire_common:KeywordValue>Utility and governmental services</inspire_common:KeywordValue>
+      </inspire_common:Keyword>
+      <inspire_common:SupportedLanguages>
+        <inspire_common:DefaultLanguage>
+          <inspire_common:Language>eng</inspire_common:Language>
+        </inspire_common:DefaultLanguage>
+        <inspire_common:SupportedLanguage>
+          <inspire_common:Language>eng</inspire_common:Language>
+        </inspire_common:SupportedLanguage>
+        <inspire_common:SupportedLanguage>
+          <inspire_common:Language>gre</inspire_common:Language>
+        </inspire_common:SupportedLanguage>
+      </inspire_common:SupportedLanguages>
+      <inspire_common:ResponseLanguage>
+        <inspire_common:Language>eng</inspire_common:Language>
+      </inspire_common:ResponseLanguage>
+    </inspire_ds:ExtendedCapabilities>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_apiso_post_DescribeRecord.xml b/tests/expected/suites_apiso_post_DescribeRecord.xml
new file mode 100644
index 0000000..74f2d33
--- /dev/null
+++ b/tests/expected/suites_apiso_post_DescribeRecord.xml
@@ -0,0 +1,551 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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/xli [...]
+  <csw:SchemaComponent parentSchema="gmd.xsd" schemaLanguage="XMLSCHEMA" targetNamespace="http://www.isotc211.org/2005/gmd">
+    <xs:schema targetNamespace="http://www.isotc211.org/2005/gmd" elementFormDefault="qualified" version="0.1">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 01-26-2005 12:40:05 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../gmd/constraints.xsd"/>
+	<xs:include schemaLocation="../gmd/distribution.xsd"/>
+	<xs:include schemaLocation="../gmd/maintenance.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="AbstractMD_Identification_Type" abstract="true">
+		<xs:annotation>
+			<xs:documentation>Basic information about data</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="citation" type="gmd:CI_Citation_PropertyType"/>
+					<xs:element name="abstract" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="purpose" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="credit" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="status" type="gmd:MD_ProgressCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="pointOfContact" type="gmd:CI_ResponsibleParty_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceMaintenance" type="gmd:MD_MaintenanceInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="graphicOverview" type="gmd:MD_BrowseGraphic_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceFormat" type="gmd:MD_Format_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="descriptiveKeywords" type="gmd:MD_Keywords_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceSpecificUsage" type="gmd:MD_Usage_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="resourceConstraints" type="gmd:MD_Constraints_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="aggregationInfo" type="gmd:MD_AggregateInformation_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="AbstractMD_Identification" type="gmd:AbstractMD_Identification_Type" abstract="true"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Identification_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:AbstractMD_Identification"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_BrowseGraphic_Type">
+		<xs:annotation>
+			<xs:documentation>Graphic that provides an illustration of the dataset (should include a legend for the graphic)</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="fileName" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="fileDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="fileType" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_BrowseGraphic" type="gmd:MD_BrowseGraphic_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_BrowseGraphic_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_BrowseGraphic"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_DataIdentification_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_Identification_Type">
+				<xs:sequence>
+					<xs:element name="spatialRepresentationType" type="gmd:MD_SpatialRepresentationTypeCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="spatialResolution" type="gmd:MD_Resolution_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="language" type="gco:CharacterString_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="characterSet" type="gmd:MD_CharacterSetCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="topicCategory" type="gmd:MD_TopicCategoryCode_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="environmentDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="extent" type="gmd:EX_Extent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="supplementalInformation" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_DataIdentification" type="gmd:MD_DataIdentification_Type" substitutionGroup="gmd:AbstractMD_Identification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_DataIdentification_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_DataIdentification"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_ServiceIdentification_Type">
+		<xs:annotation>
+			<xs:documentation>See 19119 for further info</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_Identification_Type"/>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ServiceIdentification" type="gmd:MD_ServiceIdentification_Type" substitutionGroup="gmd:AbstractMD_Identification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ServiceIdentification_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ServiceIdentification"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_RepresentativeFraction_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="denominator" type="gco:Integer_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_RepresentativeFraction" type="gmd:MD_RepresentativeFraction_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_RepresentativeFraction_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_RepresentativeFraction"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Usage_Type">
+		<xs:annotation>
+			<xs:documentation>Brief description of ways in which the dataset is currently used.</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="specificUsage" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="usageDateTime" type="gco:DateTime_PropertyType" minOccurs="0"/>
+					<xs:element name="userDeterminedLimitations" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="userContactInfo" type="gmd:CI_ResponsibleParty_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Usage" type="gmd:MD_Usage_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Usage_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Usage"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Keywords_Type">
+		<xs:annotation>
+			<xs:documentation>Keywords, their type and reference source</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="keyword" type="gco:CharacterString_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="type" type="gmd:MD_KeywordTypeCode_PropertyType" minOccurs="0"/>
+					<xs:element name="thesaurusName" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Keywords" type="gmd:MD_Keywords_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Keywords_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Keywords"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="DS_Association_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence/>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="DS_Association" type="gmd:DS_Association_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_Association_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_Association"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_AggregateInformation_Type">
+		<xs:annotation>
+			<xs:documentation>Encapsulates the dataset aggregation information</xs:documentation>
+		</xs:annotation>
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="aggregateDataSetName" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
+					<xs:element name="aggregateDataSetIdentifier" type="gmd:MD_Identifier_PropertyType" minOccurs="0"/>
+					<xs:element name="associationType" type="gmd:DS_AssociationTypeCode_PropertyType"/>
+					<xs:element name="initiativeType" type="gmd:DS_InitiativeTypeCode_PropertyType" minOccurs="0"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_AggregateInformation" type="gmd:MD_AggregateInformation_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_AggregateInformation_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_AggregateInformation"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="MD_Resolution_Type">
+		<xs:choice>
+			<xs:element name="equivalentScale" type="gmd:MD_RepresentativeFraction_PropertyType"/>
+			<xs:element name="distance" type="gco:Distance_PropertyType"/>
+		</xs:choice>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_Resolution" type="gmd:MD_Resolution_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_Resolution_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_Resolution"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="MD_TopicCategoryCode_Type">
+		<xs:annotation>
+			<xs:documentation>High-level geospatial data thematic classification to assist in the grouping and search of available geospatial datasets</xs:documentation>
+		</xs:annotation>
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="farming"/>
+			<xs:enumeration value="biota"/>
+			<xs:enumeration value="boundaries"/>
+			<xs:enumeration value="climatologyMeteorologyAtmosphere"/>
+			<xs:enumeration value="economy"/>
+			<xs:enumeration value="elevation"/>
+			<xs:enumeration value="environment"/>
+			<xs:enumeration value="geoscientificInformation"/>
+			<xs:enumeration value="health"/>
+			<xs:enumeration value="imageryBaseMapsEarthCover"/>
+			<xs:enumeration value="intelligenceMilitary"/>
+			<xs:enumeration value="inlandWaters"/>
+			<xs:enumeration value="location"/>
+			<xs:enumeration value="oceans"/>
+			<xs:enumeration value="planningCadastre"/>
+			<xs:enumeration value="society"/>
+			<xs:enumeration value="structure"/>
+			<xs:enumeration value="transportation"/>
+			<xs:enumeration value="utilitiesCommunication"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="MD_TopicCategoryCode" type="gmd:MD_TopicCategoryCode_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_TopicCategoryCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_TopicCategoryCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_CharacterSetCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_CharacterSetCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_CharacterSetCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_SpatialRepresentationTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_SpatialRepresentationTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_SpatialRepresentationTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_ProgressCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_ProgressCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_ProgressCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="MD_KeywordTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="MD_KeywordTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:MD_KeywordTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DS_AssociationTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_AssociationTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_AssociationTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DS_InitiativeTypeCode" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DS_InitiativeTypeCode_PropertyType">
+		<xs:sequence minOccurs="0">
+			<xs:element ref="gmd:DS_InitiativeTypeCode"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
+  </csw:SchemaComponent>
+  <csw:SchemaComponent parentSchema="gmd.xsd" schemaLanguage="XMLSCHEMA" targetNamespace="http://www.isotc211.org/2005/gmd">
+    <xs:schema targetNamespace="http://www.isotc211.org/2005/srv" elementFormDefault="qualified" version="0.1">
+	<!-- ================================= Annotation ================================ -->
+	<xs:annotation>
+		<xs:documentation>This file was generated from ISO TC/211 UML class diagrams == 10-13-2006 11:14:04 ====== </xs:documentation>
+	</xs:annotation>
+	<!-- ================================== Imports ================================== -->
+	<xs:import namespace="http://www.isotc211.org/2005/gmd" schemaLocation="../gmd/identification.xsd"/>
+	<xs:import namespace="http://www.isotc211.org/2005/gco" schemaLocation="../gco/gco.xsd"/>
+	<xs:include schemaLocation="../srv/serviceModel.xsd"/>
+	<!-- ########################################################################### -->
+	<!-- ########################################################################### -->
+	<!-- ================================== Classes ================================= -->
+	<xs:complexType name="SV_Parameter_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:MemberName_Type"/>
+					<xs:element name="direction" type="srv:SV_ParameterDirection_PropertyType" minOccurs="0"/>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="optionality" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="repeatability" type="gco:Boolean_PropertyType"/>
+					<xs:element name="valueType" type="gco:TypeName_PropertyType"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_Parameter" type="srv:SV_Parameter_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_Parameter_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_Parameter" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_OperationMetadata_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="operationName" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="DCP" type="srv:DCPList_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="operationDescription" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="invocationName" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="parameters" type="srv:SV_Parameter_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="connectPoint" type="gmd:CI_OnlineResource_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="dependsOn" type="srv:SV_OperationMetadata_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_OperationMetadata" type="srv:SV_OperationMetadata_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_OperationMetadata_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_OperationMetadata" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_ServiceIdentification_Type">
+		<xs:complexContent>
+			<xs:extension base="gmd:AbstractMD_Identification_Type">
+				<xs:sequence>
+					<xs:element name="serviceType" type="gco:GenericName_PropertyType"/>
+					<xs:element name="serviceTypeVersion" type="gco:CharacterString_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="accessProperties" type="gmd:MD_StandardOrderProcess_PropertyType" minOccurs="0"/>
+					<xs:element name="restrictions" type="gmd:MD_Constraints_PropertyType" minOccurs="0"/>
+					<xs:element name="keywords" type="gmd:MD_Keywords_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="extent" type="gmd:EX_Extent_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="coupledResource" type="srv:SV_CoupledResource_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					<xs:element name="couplingType" type="srv:SV_CouplingType_PropertyType"/>
+					<xs:element name="containsOperations" type="srv:SV_OperationMetadata_PropertyType" maxOccurs="unbounded"/>
+					<xs:element name="operatesOn" type="gmd:MD_DataIdentification_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_ServiceIdentification" type="srv:SV_ServiceIdentification_Type" substitutionGroup="gmd:AbstractMD_Identification"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_ServiceIdentification_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_ServiceIdentification" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_OperationChain_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="operation" type="srv:SV_Operation_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_OperationChain" type="srv:SV_OperationChain_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_OperationChain_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_OperationChain" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_OperationChainMetadata_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="name" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="description" type="gco:CharacterString_PropertyType" minOccurs="0"/>
+					<xs:element name="operation" type="srv:SV_OperationMetadata_PropertyType" maxOccurs="unbounded"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_OperationChainMetadata" type="srv:SV_OperationChainMetadata_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_OperationChainMetadata_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_OperationChainMetadata" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:complexType name="SV_CoupledResource_Type">
+		<xs:complexContent>
+			<xs:extension base="gco:AbstractObject_Type">
+				<xs:sequence>
+					<xs:element name="operationName" type="gco:CharacterString_PropertyType"/>
+					<xs:element name="identifier" type="gco:CharacterString_PropertyType"/>
+					<xs:element ref="gco:ScopedName" minOccurs="0" maxOccurs="1"/>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_CoupledResource" type="srv:SV_CoupledResource_Type"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_CoupledResource_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_CoupledResource" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="gco:ObjectReference"/>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<xs:simpleType name="SV_ParameterDirection_Type">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="in"/>
+			<xs:enumeration value="out"/>
+			<xs:enumeration value="in/out"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- ........................................................................ -->
+	<xs:element name="SV_ParameterDirection" type="srv:SV_ParameterDirection_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_ParameterDirection_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_ParameterDirection" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="DCPList" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="DCPList_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:DCPList" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+	<!-- ........................................................................ -->
+	<xs:element name="SV_CouplingType" type="gco:CodeListValue_Type" substitutionGroup="gco:CharacterString"/>
+	<!-- ........................................................................ -->
+	<xs:complexType name="SV_CouplingType_PropertyType">
+		<xs:sequence>
+			<xs:element ref="srv:SV_CouplingType" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attribute ref="gco:nilReason"/>
+	</xs:complexType>
+	<!-- =========================================================================== -->
+</xs:schema>
+  </csw:SchemaComponent>
+</csw:DescribeRecordResponse>
diff --git a/tests/expected/suites_apiso_post_GetCapabilities.xml b/tests/expected/suites_apiso_post_GetCapabilities.xml
new file mode 100644
index 0000000..7c8548d
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetCapabilities.xml
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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" xmlns: [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedISOQueryables">
+        <ows:Value>apiso:DistanceValue</ows:Value>
+        <ows:Value>apiso:Abstract</ows:Value>
+        <ows:Value>apiso:RevisionDate</ows:Value>
+        <ows:Value>apiso:Subject</ows:Value>
+        <ows:Value>apiso:KeywordType</ows:Value>
+        <ows:Value>apiso:Title</ows:Value>
+        <ows:Value>apiso:CRS</ows:Value>
+        <ows:Value>apiso:PublicationDate</ows:Value>
+        <ows:Value>apiso:Type</ows:Value>
+        <ows:Value>apiso:AlternateTitle</ows:Value>
+        <ows:Value>apiso:BoundingBox</ows:Value>
+        <ows:Value>apiso:AnyText</ows:Value>
+        <ows:Value>apiso:ParentIdentifier</ows:Value>
+        <ows:Value>apiso:Modified</ows:Value>
+        <ows:Value>apiso:Operation</ows:Value>
+        <ows:Value>apiso:Format</ows:Value>
+        <ows:Value>apiso:TempExtent_end</ows:Value>
+        <ows:Value>apiso:DistanceUOM</ows:Value>
+        <ows:Value>apiso:OrganisationName</ows:Value>
+        <ows:Value>apiso:ServiceType</ows:Value>
+        <ows:Value>apiso:TempExtent_begin</ows:Value>
+        <ows:Value>apiso:ResourceLanguage</ows:Value>
+        <ows:Value>apiso:ServiceTypeVersion</ows:Value>
+        <ows:Value>apiso:OperatesOn</ows:Value>
+        <ows:Value>apiso:Denominator</ows:Value>
+        <ows:Value>apiso:HasSecurityConstraints</ows:Value>
+        <ows:Value>apiso:OperatesOnIdentifier</ows:Value>
+        <ows:Value>apiso:GeographicDescriptionCode</ows:Value>
+        <ows:Value>apiso:Language</ows:Value>
+        <ows:Value>apiso:Identifier</ows:Value>
+        <ows:Value>apiso:OperatesOnName</ows:Value>
+        <ows:Value>apiso:TopicCategory</ows:Value>
+        <ows:Value>apiso:CreationDate</ows:Value>
+        <ows:Value>apiso:CouplingType</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="AdditionalQueryables">
+        <ows:Value>apiso:Lineage</ows:Value>
+        <ows:Value>apiso:Classification</ows:Value>
+        <ows:Value>apiso:Creator</ows:Value>
+        <ows:Value>apiso:Relation</ows:Value>
+        <ows:Value>apiso:OtherConstraints</ows:Value>
+        <ows:Value>apiso:SpecificationTitle</ows:Value>
+        <ows:Value>apiso:ResponsiblePartyRole</ows:Value>
+        <ows:Value>apiso:SpecificationDateType</ows:Value>
+        <ows:Value>apiso:Degree</ows:Value>
+        <ows:Value>apiso:Contributor</ows:Value>
+        <ows:Value>apiso:ConditionApplyingToAccessAndUse</ows:Value>
+        <ows:Value>apiso:SpecificationDate</ows:Value>
+        <ows:Value>apiso:AccessConstraints</ows:Value>
+        <ows:Value>apiso:Publisher</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_apiso_post_GetDomain-property.xml b/tests/expected/suites_apiso_post_GetDomain-property.xml
new file mode 100644
index 0000000..43be0d0
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetDomain-property.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetDomainResponse 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" x [...]
+  <csw:DomainValues type="csw:Record">
+    <csw:PropertyName>apiso:TopicCategory</csw:PropertyName>
+    <csw:ListOfValues>
+      <csw:Value>climatologyMeteorologyAtmosphere</csw:Value>
+      <csw:Value>elevation</csw:Value>
+      <csw:Value>geoscientificInformation</csw:Value>
+    </csw:ListOfValues>
+  </csw:DomainValues>
+</csw:GetDomainResponse>
diff --git a/tests/expected/suites_apiso_post_GetRecordById-brief.xml b/tests/expected/suites_apiso_post_GetRecordById-brief.xml
new file mode 100644
index 0000000..9e345f9
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecordById-brief.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/xlin [...]
+  <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>de53e931-778a-4792-94ad-9fe507aca483</gco:CharacterString>
+    </gmd:fileIdentifier>
+    <gmd:hierarchyLevel>
+      <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+    </gmd:hierarchyLevel>
+    <gmd:identificationInfo>
+      <gmd:MD_DataIdentification id="de53e931-778a-4792-94ad-9fe507aca483">
+        <gmd:citation>
+          <gmd:CI_Citation>
+            <gmd:title>
+              <gco:CharacterString>Ortho</gco:CharacterString>
+            </gmd:title>
+            <gmd:date>
+              <gmd:CI_Date>
+                <gmd:date>
+                  <gco:Date>2000-01-01</gco:Date>
+                </gmd:date>
+                <gmd:dateType>
+                  <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication" codeSpace="ISOTC211/19115">publication</gmd:CI_DateTypeCode>
+                </gmd:dateType>
+              </gmd:CI_Date>
+            </gmd:date>
+          </gmd:CI_Citation>
+        </gmd:citation>
+        <gmd:extent>
+          <gmd:EX_Extent>
+            <gmd:geographicElement>
+              <gmd:EX_GeographicBoundingBox>
+                <gmd:westBoundLongitude>
+                  <gco:Decimal>21.48</gco:Decimal>
+                </gmd:westBoundLongitude>
+                <gmd:eastBoundLongitude>
+                  <gco:Decimal>21.53</gco:Decimal>
+                </gmd:eastBoundLongitude>
+                <gmd:southBoundLatitude>
+                  <gco:Decimal>39.76</gco:Decimal>
+                </gmd:southBoundLatitude>
+                <gmd:northBoundLatitude>
+                  <gco:Decimal>39.79</gco:Decimal>
+                </gmd:northBoundLatitude>
+              </gmd:EX_GeographicBoundingBox>
+            </gmd:geographicElement>
+          </gmd:EX_Extent>
+        </gmd:extent>
+      </gmd:MD_DataIdentification>
+    </gmd:identificationInfo>
+    <gmd:distributionInfo>
+      <gmd:MD_Distribution>
+        <gmd:transferOptions>
+          <gmd:MD_DigitalTransferOptions>
+            <gmd:onLine>
+              <gmd:CI_OnlineResource>
+                <gmd:linkage>
+                  <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                </gmd:linkage>
+                <gmd:protocol>
+                  <gco:CharacterString>None</gco:CharacterString>
+                </gmd:protocol>
+                <gmd:name>
+                  <gco:CharacterString>None</gco:CharacterString>
+                </gmd:name>
+                <gmd:description>
+                  <gco:CharacterString>None</gco:CharacterString>
+                </gmd:description>
+              </gmd:CI_OnlineResource>
+            </gmd:onLine>
+          </gmd:MD_DigitalTransferOptions>
+        </gmd:transferOptions>
+      </gmd:MD_Distribution>
+    </gmd:distributionInfo>
+  </gmd:MD_Metadata>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_apiso_post_GetRecordById-full-dc.xml b/tests/expected/suites_apiso_post_GetRecordById-full-dc.xml
new file mode 100644
index 0000000..fe1b7ff
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecordById-full-dc.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/xlin [...]
+  <csw:Record>
+    <dc:identifier>NS06agg</dc:identifier>
+    <dc:title>PacIOOS Nearshore Sensor 06: Pohnpei, Micronesia</dc:title>
+    <dc:type>dataset</dc:type>
+    <dc:subject>Oceans > Ocean Chemistry > Chlorophyll</dc:subject>
+    <dc:subject>Oceans > Ocean Optics > Turbidity</dc:subject>
+    <dc:subject>Oceans > Ocean Temperature > Water Temperature</dc:subject>
+    <dc:subject>Oceans > Salinity/Density > Conductivity</dc:subject>
+    <dc:subject>Oceans > Salinity/Density > Salinity</dc:subject>
+    <dc:subject>Oceans > Water Quality</dc:subject>
+    <dc:subject>Ocean &gt; Pacific Ocean &gt; Western Pacific Ocean &gt; Micronesia &gt; Federated States of Micronesia</dc:subject>
+    <dc:subject>Ocean &gt; Pacific Ocean &gt; United States of America &gt; Territories</dc:subject>
+    <dc:subject>Federated States of Micronesia &gt; Pohnpei &gt; Pohnpei Lagoon</dc:subject>
+    <dc:subject>Pacific Islands Ocean Observing System (PacIOOS)</dc:subject>
+    <dc:subject>Pacific Islands Ocean Observing System (PacIOOS)</dc:subject>
+    <dc:subject>sea_water_temperature</dc:subject>
+    <dc:subject>sea_water_electrical_conductivity</dc:subject>
+    <dc:subject>sea_water_turbidity</dc:subject>
+    <dc:subject>mass_concentration_of_chlorophyll_in_sea_water</dc:subject>
+    <dc:subject>sea_water_salinity</dc:subject>
+    <dc:subject>depth</dc:subject>
+    <dc:subject>latitude</dc:subject>
+    <dc:subject>longitude</dc:subject>
+    <dc:subject>time</dc:subject>
+    <dct:references scheme="None">http://oos.soest.hawaii.edu/thredds/idd/nss_pacioos.html?dataset=NS06agg</dct:references>
+    <dct:references scheme="None">http://oos.soest.hawaii.edu/thredds/dodsC/pacioos/nss/ns06agg.html</dct:references>
+    <dct:references scheme="None">http://pacioos.org/voyager/index.html?b=6.874279%2C158.077126%2C7.050468%2C158.369808&tz=pont&o=qual:2::p0NS06p1</dct:references>
+    <dct:references scheme="None">http://oos.soest.hawaii.edu/dchart/index.html?dsetid=54cd0688ada08d86748b9c5762509f</dct:references>
+    <dct:references scheme="None">http://oos.soest.hawaii.edu/erddap/tabledap/nss06_agg.graph?time%2Ctemperature&.draw=lines</dct:references>
+    <dct:references scheme="None">http://pacioos.org/focus/waterquality/wq_fsm.php</dct:references>
+    <dct:references scheme="None">http://oos.soest.hawaii.edu/thredds/dodsC/pacioos/nss/ns06agg</dct:references>
+    <dc:relation></dc:relation>
+    <dct:modified>2014-04-16</dct:modified>
+    <dct:abstract>The nearshore sensors are part of the Pacific Islands Ocean Observing System (PacIOOS) and are designed to measure a variety of ocean parameters at fixed point locations. NS06 is located at the dock in Pohnpei lagoon and is mounted to the bottom in about 1 meter of water. The instrument is a Sea-Bird Electronics model 16+ V2 coupled with a WET Labs ECO-FLNTUS combination sensor.</dct:abstract>
+    <dc:date>2014-04-16</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+      <ows:LowerCorner>6.96 158.22</ows:LowerCorner>
+      <ows:UpperCorner>6.96 158.22</ows:UpperCorner>
+    </ows:BoundingBox>
+  </csw:Record>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_apiso_post_GetRecordById-full.xml b/tests/expected/suites_apiso_post_GetRecordById-full.xml
new file mode 100644
index 0000000..c2444a0
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecordById-full.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/xlin [...]
+  <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd">
+	<gmd:fileIdentifier><gco:CharacterString>de53e931-778a-4792-94ad-9fe507aca483</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Ortho</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2000-01-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>de53e931-778a-4792-94ad-9fe507aca483</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_ortho_RAS_1998_284404.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Ortho</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>21.478784</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>21.527317</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>39.76001</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>39.790341</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent [...]
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_b18997ad-2b7c-4a6b-9fdc-390e5eb6b157" xsi:type="gml:TimePeriodType"><gml:beginPosition>1997-01-01</gml:beginPosition><gml:endPosition>1999-01-01</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_apiso_post_GetRecordById-srv-brief.xml b/tests/expected/suites_apiso_post_GetRecordById-srv-brief.xml
new file mode 100644
index 0000000..775b618
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecordById-srv-brief.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/xlin [...]
+  <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>3e9a8c05</gco:CharacterString>
+    </gmd:fileIdentifier>
+    <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:identificationInfo>
+      <srv:SV_ServiceIdentification id="3e9a8c05">
+        <gmd:citation>
+          <gmd:CI_Citation>
+            <gmd:title>
+              <gco:CharacterString>test Title</gco:CharacterString>
+            </gmd:title>
+            <gmd:date>
+              <gmd:CI_Date>
+                <gmd:date>
+                  <gco:Date>2011-04-19</gco:Date>
+                </gmd:date>
+                <gmd:dateType>
+                  <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                </gmd:dateType>
+              </gmd:CI_Date>
+            </gmd:date>
+          </gmd:CI_Citation>
+        </gmd:citation>
+        <srv:serviceType>
+          <gco:LocalName>view</gco:LocalName>
+        </srv:serviceType>
+        <srv:serviceTypeVersion>
+          <gco:CharacterString/>
+        </srv:serviceTypeVersion>
+        <srv:keywords>
+          <gmd:MD_Keywords>
+            <gmd:keyword>
+              <gco:CharacterString>Geographic viewer (humanGeographicViewer)</gco:CharacterString>
+            </gmd:keyword>
+            <gmd:keyword>
+              <gco:CharacterString>administration</gco:CharacterString>
+            </gmd:keyword>
+          </gmd:MD_Keywords>
+        </srv:keywords>
+        <srv:extent>
+          <gmd:EX_Extent>
+            <gmd:geographicElement>
+              <gmd:EX_GeographicBoundingBox>
+                <gmd:westBoundLongitude>
+                  <gco:Decimal>19.37</gco:Decimal>
+                </gmd:westBoundLongitude>
+                <gmd:eastBoundLongitude>
+                  <gco:Decimal>29.61</gco:Decimal>
+                </gmd:eastBoundLongitude>
+                <gmd:southBoundLatitude>
+                  <gco:Decimal>34.8</gco:Decimal>
+                </gmd:southBoundLatitude>
+                <gmd:northBoundLatitude>
+                  <gco:Decimal>41.75</gco:Decimal>
+                </gmd:northBoundLatitude>
+              </gmd:EX_GeographicBoundingBox>
+            </gmd:geographicElement>
+          </gmd:EX_Extent>
+        </srv:extent>
+      </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://aiolos.survey.ntua.gr/geoserver/wms</gmd:URL>
+                </gmd:linkage>
+                <gmd:protocol>
+                  <gco:CharacterString>None</gco:CharacterString>
+                </gmd:protocol>
+                <gmd:name>
+                  <gco:CharacterString>None</gco:CharacterString>
+                </gmd:name>
+                <gmd:description>
+                  <gco:CharacterString>None</gco:CharacterString>
+                </gmd:description>
+              </gmd:CI_OnlineResource>
+            </gmd:onLine>
+          </gmd:MD_DigitalTransferOptions>
+        </gmd:transferOptions>
+      </gmd:MD_Distribution>
+    </gmd:distributionInfo>
+  </gmd:MD_Metadata>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_apiso_post_GetRecords-all-csw-output.xml b/tests/expected/suites_apiso_post_GetRecords-all-csw-output.xml
new file mode 100644
index 0000000..9aea4a3
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecords-all-csw-output.xml
@@ -0,0 +1,399 @@
+<?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="6" numberOfRecordsMatched="17" numberOfRecordsReturned="5" recordSchema="http://www.isotc211.org/2005/gmd" elementSet="full">
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/srv http://schemas.opengis.net/iso/19139/20060504/srv/srv.xsd">
+<gmd:fileIdentifier>
+<gco:CharacterString>3e9a8c05</gco:CharacterString>
+</gmd:fileIdentifier>
+<gmd:language>
+<gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode>
+</gmd:language>
+<gmd:hierarchyLevel>
+<gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="service">service</gmd:MD_ScopeCode>
+</gmd:hierarchyLevel>
+<gmd:contact>
+<gmd:CI_ResponsibleParty>
+<gmd:organisationName>
+<gco:CharacterString>NTUA</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:address>
+<gmd:CI_Address>
+<gmd:electronicMailAddress>
+<gco:CharacterString>tzotsos at gmail.com</gco:CharacterString>
+</gmd:electronicMailAddress>
+</gmd:CI_Address>
+</gmd:address>
+</gmd:CI_Contact>
+</gmd:contactInfo>
+<gmd:role>
+<gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode" codeListValue="pointOfContact">pointOfContact</gmd:CI_RoleCode>
+</gmd:role>
+</gmd:CI_ResponsibleParty>
+</gmd:contact>
+<gmd:dateStamp>
+<gco:Date>2011-04-18</gco:Date>
+</gmd:dateStamp>
+<gmd:metadataStandardName>
+<gco:CharacterString>ISO19115</gco:CharacterString>
+</gmd:metadataStandardName>
+<gmd:metadataStandardVersion>
+<gco:CharacterString>2003/Cor.1:2006</gco:CharacterString>
+</gmd:metadataStandardVersion>
+<gmd:identificationInfo>
+<srv:SV_ServiceIdentification>
+<gmd:citation>
+<gmd:CI_Citation>
+<gmd:title>
+<gco:CharacterString>test Title</gco:CharacterString>
+</gmd:title>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>2011-04-19</gco:Date>
+</gmd:date>
+<gmd:dateType>
+<gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode>
+</gmd:dateType>
+</gmd:CI_Date>
+</gmd:date>
+<gmd:identifier>
+<gmd:RS_Identifier>
+<gmd:code>
+<gco:CharacterString>http://aiolos.survey.ntua.gr</gco:CharacterString>
+</gmd:code>
+<gmd:codeSpace>
+<gco:CharacterString>ogc</gco:CharacterString>
+</gmd:codeSpace>
+</gmd:RS_Identifier>
+</gmd:identifier>
+</gmd:CI_Citation>
+</gmd:citation>
+<gmd:abstract>
+<gco:CharacterString>test Abstract</gco:CharacterString>
+</gmd:abstract>
+<gmd:pointOfContact>
+<gmd:CI_ResponsibleParty>
+<gmd:organisationName>
+<gco:CharacterString>NTUA</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:address>
+<gmd:CI_Address>
+<gmd:electronicMailAddress>
+<gco:CharacterString>tzotsos at gmail.com</gco:CharacterString>
+</gmd:electronicMailAddress>
+</gmd:CI_Address>
+</gmd:address>
+</gmd:CI_Contact>
+</gmd:contactInfo>
+<gmd:role>
+<gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode" codeListValue="owner">owner</gmd:CI_RoleCode>
+</gmd:role>
+</gmd:CI_ResponsibleParty>
+</gmd:pointOfContact>
+<gmd:descriptiveKeywords>
+<gmd:MD_Keywords>
+<gmd:keyword>
+<gco:CharacterString>Geographic viewer (humanGeographicViewer)</gco:CharacterString>
+</gmd:keyword>
+</gmd:MD_Keywords>
+</gmd:descriptiveKeywords>
+<gmd:descriptiveKeywords>
+<gmd:MD_Keywords>
+<gmd:keyword>
+<gco:CharacterString>administration</gco:CharacterString>
+</gmd:keyword>
+<gmd:thesaurusName>
+<gmd:CI_Citation>
+<gmd:title>
+<gco:CharacterString>GEMET Themes, version 2.3</gco:CharacterString>
+</gmd:title>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>2011-04-18</gco:Date>
+</gmd:date>
+<gmd:dateType>
+<gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode>
+</gmd:dateType>
+</gmd:CI_Date>
+</gmd:date>
+</gmd:CI_Citation>
+</gmd:thesaurusName>
+</gmd:MD_Keywords>
+</gmd:descriptiveKeywords>
+<gmd:resourceConstraints>
+<gmd:MD_Constraints>
+<gmd:useLimitation>
+<gco:CharacterString>Conditions unknown</gco:CharacterString>
+</gmd:useLimitation>
+</gmd:MD_Constraints>
+</gmd:resourceConstraints>
+<gmd:resourceConstraints>
+<gmd:MD_LegalConstraints>
+<gmd:otherConstraints>
+<gco:CharacterString>no limitation</gco:CharacterString>
+</gmd:otherConstraints>
+</gmd:MD_LegalConstraints>
+</gmd:resourceConstraints>
+<gmd:extent>
+<gmd:EX_Extent>
+<gmd:geographicElement>
+<gmd:EX_GeographicBoundingBox>
+<gmd:westBoundLongitude>
+<gco:Decimal>19.37</gco:Decimal>
+</gmd:westBoundLongitude>
+<gmd:eastBoundLongitude>
+<gco:Decimal>29.61</gco:Decimal>
+</gmd:eastBoundLongitude>
+<gmd:southBoundLatitude>
+<gco:Decimal>34.80</gco:Decimal>
+</gmd:southBoundLatitude>
+<gmd:northBoundLatitude>
+<gco:Decimal>41.75</gco:Decimal>
+</gmd:northBoundLatitude>
+</gmd:EX_GeographicBoundingBox>
+</gmd:geographicElement>
+<gmd:temporalElement>
+<gmd:EX_TemporalExtent>
+<gmd:extent>
+<gml:TimePeriod gml:id="IDcd3b1c4f-b5f7-439a-afc4-3317a4cd89be" xsi:type="gml:TimePeriodType">
+<gml:beginPosition>2011-04-18</gml:beginPosition>
+<gml:endPosition>2011-04-20</gml:endPosition>
+</gml:TimePeriod>
+</gmd:extent>
+</gmd:EX_TemporalExtent>
+</gmd:temporalElement>
+</gmd:EX_Extent>
+</gmd:extent>
+<srv:serviceType>
+<gco:LocalName>view</gco:LocalName>
+</srv:serviceType>
+<srv:operatesOn href=""/>
+</srv:SV_ServiceIdentification>
+</gmd:identificationInfo>
+<gmd:distributionInfo>
+<gmd:MD_Distribution>
+<gmd:distributionFormat>
+<gmd:MD_Format>
+<gmd:name gco:nilReason="inapplicable"/>
+<gmd:version gco:nilReason="inapplicable"/>
+</gmd:MD_Format>
+</gmd:distributionFormat>
+<gmd:transferOptions>
+<gmd:MD_DigitalTransferOptions>
+<gmd:onLine>
+<gmd:CI_OnlineResource>
+<gmd:linkage>
+<gmd:URL>http://aiolos.survey.ntua.gr/geoserver/wms</gmd:URL>
+</gmd:linkage>
+</gmd:CI_OnlineResource>
+</gmd:onLine>
+</gmd:MD_DigitalTransferOptions>
+</gmd:transferOptions>
+</gmd:MD_Distribution>
+</gmd:distributionInfo>
+<gmd:dataQualityInfo>
+<gmd:DQ_DataQuality>
+<gmd:scope>
+<gmd:DQ_Scope>
+<gmd:level>
+<gmd:MD_ScopeCode codeListValue="service" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">service</gmd:MD_ScopeCode>
+</gmd:level>
+</gmd:DQ_Scope>
+</gmd:scope>
+<gmd:report>
+<gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type">
+<gmd:measureIdentification>
+<gmd:RS_Identifier>
+<gmd:code>
+<gco:CharacterString>Conformity_001</gco:CharacterString>
+</gmd:code>
+<gmd:codeSpace>
+<gco:CharacterString>INSPIRE</gco:CharacterString>
+</gmd:codeSpace>
+</gmd:RS_Identifier>
+</gmd:measureIdentification>
+<gmd:result>
+<gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type">
+<gmd:specification>
+<gmd:CI_Citation>
+<gmd:title>
+<gco:CharacterString>Corrigendum to INSPIRE Metadata Regulation published in the Official Journal of the European Union, L 328, page 83</gco:CharacterString>
+</gmd:title>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>2009-12-15</gco:Date>
+</gmd:date>
+<gmd:dateType>
+<gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode>
+</gmd:dateType>
+</gmd:CI_Date>
+</gmd:date>
+</gmd:CI_Citation>
+</gmd:specification>
+<gmd:explanation>
+<gco:CharacterString>See the referenced specification</gco:CharacterString>
+</gmd:explanation>
+<gmd:pass>
+<gco:Boolean>true</gco:Boolean>
+</gmd:pass>
+</gmd:DQ_ConformanceResult>
+</gmd:result>
+</gmd:DQ_DomainConsistency>
+</gmd:report>
+</gmd:DQ_DataQuality>
+</gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd">
+	<gmd:fileIdentifier><gco:CharacterString>366f6257-19eb-4f20-ba78-0698ac4aae77</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>366f6257-19eb-4f20-ba78-0698ac4aae77</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000012.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_034c77cc-d473-4f5b-a7b2-8cc067031e21" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd">
+	<gmd:fileIdentifier><gco:CharacterString>75a7eb5e-336e-453d-ab06-209b1070d396</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>75a7eb5e-336e-453d-ab06-209b1070d396</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000013.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_dab8420e-8f42-43e1-a536-81bfe473aafb" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd">
+	<gmd:fileIdentifier><gco:CharacterString>a7308c0a-b748-48e2-bab7-0a608a51d416</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>a7308c0a-b748-48e2-bab7-0a608a51d416</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000014.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_d9b49641-a998-4c82-a6e0-fe542e87cace" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd">
+	<gmd:fileIdentifier><gco:CharacterString>0173e0d7-6ea9-4407-b846-f29d6bfa9903</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>0173e0d7-6ea9-4407-b846-f29d6bfa9903</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000015.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_b3156b1e-f787-43a6-b0d0-3b3fcfdf9df9" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_apiso_post_GetRecords-all.xml b/tests/expected/suites_apiso_post_GetRecords-all.xml
new file mode 100644
index 0000000..9aea4a3
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecords-all.xml
@@ -0,0 +1,399 @@
+<?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="6" numberOfRecordsMatched="17" numberOfRecordsReturned="5" recordSchema="http://www.isotc211.org/2005/gmd" elementSet="full">
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/srv http://schemas.opengis.net/iso/19139/20060504/srv/srv.xsd">
+<gmd:fileIdentifier>
+<gco:CharacterString>3e9a8c05</gco:CharacterString>
+</gmd:fileIdentifier>
+<gmd:language>
+<gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode>
+</gmd:language>
+<gmd:hierarchyLevel>
+<gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="service">service</gmd:MD_ScopeCode>
+</gmd:hierarchyLevel>
+<gmd:contact>
+<gmd:CI_ResponsibleParty>
+<gmd:organisationName>
+<gco:CharacterString>NTUA</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:address>
+<gmd:CI_Address>
+<gmd:electronicMailAddress>
+<gco:CharacterString>tzotsos at gmail.com</gco:CharacterString>
+</gmd:electronicMailAddress>
+</gmd:CI_Address>
+</gmd:address>
+</gmd:CI_Contact>
+</gmd:contactInfo>
+<gmd:role>
+<gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode" codeListValue="pointOfContact">pointOfContact</gmd:CI_RoleCode>
+</gmd:role>
+</gmd:CI_ResponsibleParty>
+</gmd:contact>
+<gmd:dateStamp>
+<gco:Date>2011-04-18</gco:Date>
+</gmd:dateStamp>
+<gmd:metadataStandardName>
+<gco:CharacterString>ISO19115</gco:CharacterString>
+</gmd:metadataStandardName>
+<gmd:metadataStandardVersion>
+<gco:CharacterString>2003/Cor.1:2006</gco:CharacterString>
+</gmd:metadataStandardVersion>
+<gmd:identificationInfo>
+<srv:SV_ServiceIdentification>
+<gmd:citation>
+<gmd:CI_Citation>
+<gmd:title>
+<gco:CharacterString>test Title</gco:CharacterString>
+</gmd:title>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>2011-04-19</gco:Date>
+</gmd:date>
+<gmd:dateType>
+<gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode>
+</gmd:dateType>
+</gmd:CI_Date>
+</gmd:date>
+<gmd:identifier>
+<gmd:RS_Identifier>
+<gmd:code>
+<gco:CharacterString>http://aiolos.survey.ntua.gr</gco:CharacterString>
+</gmd:code>
+<gmd:codeSpace>
+<gco:CharacterString>ogc</gco:CharacterString>
+</gmd:codeSpace>
+</gmd:RS_Identifier>
+</gmd:identifier>
+</gmd:CI_Citation>
+</gmd:citation>
+<gmd:abstract>
+<gco:CharacterString>test Abstract</gco:CharacterString>
+</gmd:abstract>
+<gmd:pointOfContact>
+<gmd:CI_ResponsibleParty>
+<gmd:organisationName>
+<gco:CharacterString>NTUA</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:address>
+<gmd:CI_Address>
+<gmd:electronicMailAddress>
+<gco:CharacterString>tzotsos at gmail.com</gco:CharacterString>
+</gmd:electronicMailAddress>
+</gmd:CI_Address>
+</gmd:address>
+</gmd:CI_Contact>
+</gmd:contactInfo>
+<gmd:role>
+<gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode" codeListValue="owner">owner</gmd:CI_RoleCode>
+</gmd:role>
+</gmd:CI_ResponsibleParty>
+</gmd:pointOfContact>
+<gmd:descriptiveKeywords>
+<gmd:MD_Keywords>
+<gmd:keyword>
+<gco:CharacterString>Geographic viewer (humanGeographicViewer)</gco:CharacterString>
+</gmd:keyword>
+</gmd:MD_Keywords>
+</gmd:descriptiveKeywords>
+<gmd:descriptiveKeywords>
+<gmd:MD_Keywords>
+<gmd:keyword>
+<gco:CharacterString>administration</gco:CharacterString>
+</gmd:keyword>
+<gmd:thesaurusName>
+<gmd:CI_Citation>
+<gmd:title>
+<gco:CharacterString>GEMET Themes, version 2.3</gco:CharacterString>
+</gmd:title>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>2011-04-18</gco:Date>
+</gmd:date>
+<gmd:dateType>
+<gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode>
+</gmd:dateType>
+</gmd:CI_Date>
+</gmd:date>
+</gmd:CI_Citation>
+</gmd:thesaurusName>
+</gmd:MD_Keywords>
+</gmd:descriptiveKeywords>
+<gmd:resourceConstraints>
+<gmd:MD_Constraints>
+<gmd:useLimitation>
+<gco:CharacterString>Conditions unknown</gco:CharacterString>
+</gmd:useLimitation>
+</gmd:MD_Constraints>
+</gmd:resourceConstraints>
+<gmd:resourceConstraints>
+<gmd:MD_LegalConstraints>
+<gmd:otherConstraints>
+<gco:CharacterString>no limitation</gco:CharacterString>
+</gmd:otherConstraints>
+</gmd:MD_LegalConstraints>
+</gmd:resourceConstraints>
+<gmd:extent>
+<gmd:EX_Extent>
+<gmd:geographicElement>
+<gmd:EX_GeographicBoundingBox>
+<gmd:westBoundLongitude>
+<gco:Decimal>19.37</gco:Decimal>
+</gmd:westBoundLongitude>
+<gmd:eastBoundLongitude>
+<gco:Decimal>29.61</gco:Decimal>
+</gmd:eastBoundLongitude>
+<gmd:southBoundLatitude>
+<gco:Decimal>34.80</gco:Decimal>
+</gmd:southBoundLatitude>
+<gmd:northBoundLatitude>
+<gco:Decimal>41.75</gco:Decimal>
+</gmd:northBoundLatitude>
+</gmd:EX_GeographicBoundingBox>
+</gmd:geographicElement>
+<gmd:temporalElement>
+<gmd:EX_TemporalExtent>
+<gmd:extent>
+<gml:TimePeriod gml:id="IDcd3b1c4f-b5f7-439a-afc4-3317a4cd89be" xsi:type="gml:TimePeriodType">
+<gml:beginPosition>2011-04-18</gml:beginPosition>
+<gml:endPosition>2011-04-20</gml:endPosition>
+</gml:TimePeriod>
+</gmd:extent>
+</gmd:EX_TemporalExtent>
+</gmd:temporalElement>
+</gmd:EX_Extent>
+</gmd:extent>
+<srv:serviceType>
+<gco:LocalName>view</gco:LocalName>
+</srv:serviceType>
+<srv:operatesOn href=""/>
+</srv:SV_ServiceIdentification>
+</gmd:identificationInfo>
+<gmd:distributionInfo>
+<gmd:MD_Distribution>
+<gmd:distributionFormat>
+<gmd:MD_Format>
+<gmd:name gco:nilReason="inapplicable"/>
+<gmd:version gco:nilReason="inapplicable"/>
+</gmd:MD_Format>
+</gmd:distributionFormat>
+<gmd:transferOptions>
+<gmd:MD_DigitalTransferOptions>
+<gmd:onLine>
+<gmd:CI_OnlineResource>
+<gmd:linkage>
+<gmd:URL>http://aiolos.survey.ntua.gr/geoserver/wms</gmd:URL>
+</gmd:linkage>
+</gmd:CI_OnlineResource>
+</gmd:onLine>
+</gmd:MD_DigitalTransferOptions>
+</gmd:transferOptions>
+</gmd:MD_Distribution>
+</gmd:distributionInfo>
+<gmd:dataQualityInfo>
+<gmd:DQ_DataQuality>
+<gmd:scope>
+<gmd:DQ_Scope>
+<gmd:level>
+<gmd:MD_ScopeCode codeListValue="service" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">service</gmd:MD_ScopeCode>
+</gmd:level>
+</gmd:DQ_Scope>
+</gmd:scope>
+<gmd:report>
+<gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type">
+<gmd:measureIdentification>
+<gmd:RS_Identifier>
+<gmd:code>
+<gco:CharacterString>Conformity_001</gco:CharacterString>
+</gmd:code>
+<gmd:codeSpace>
+<gco:CharacterString>INSPIRE</gco:CharacterString>
+</gmd:codeSpace>
+</gmd:RS_Identifier>
+</gmd:measureIdentification>
+<gmd:result>
+<gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type">
+<gmd:specification>
+<gmd:CI_Citation>
+<gmd:title>
+<gco:CharacterString>Corrigendum to INSPIRE Metadata Regulation published in the Official Journal of the European Union, L 328, page 83</gco:CharacterString>
+</gmd:title>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>2009-12-15</gco:Date>
+</gmd:date>
+<gmd:dateType>
+<gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode>
+</gmd:dateType>
+</gmd:CI_Date>
+</gmd:date>
+</gmd:CI_Citation>
+</gmd:specification>
+<gmd:explanation>
+<gco:CharacterString>See the referenced specification</gco:CharacterString>
+</gmd:explanation>
+<gmd:pass>
+<gco:Boolean>true</gco:Boolean>
+</gmd:pass>
+</gmd:DQ_ConformanceResult>
+</gmd:result>
+</gmd:DQ_DomainConsistency>
+</gmd:report>
+</gmd:DQ_DataQuality>
+</gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd">
+	<gmd:fileIdentifier><gco:CharacterString>366f6257-19eb-4f20-ba78-0698ac4aae77</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>366f6257-19eb-4f20-ba78-0698ac4aae77</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000012.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_034c77cc-d473-4f5b-a7b2-8cc067031e21" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd">
+	<gmd:fileIdentifier><gco:CharacterString>75a7eb5e-336e-453d-ab06-209b1070d396</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>75a7eb5e-336e-453d-ab06-209b1070d396</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000013.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_dab8420e-8f42-43e1-a536-81bfe473aafb" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd">
+	<gmd:fileIdentifier><gco:CharacterString>a7308c0a-b748-48e2-bab7-0a608a51d416</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>a7308c0a-b748-48e2-bab7-0a608a51d416</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000014.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_d9b49641-a998-4c82-a6e0-fe542e87cace" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+    <gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd">
+	<gmd:fileIdentifier><gco:CharacterString>0173e0d7-6ea9-4407-b846-f29d6bfa9903</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>0173e0d7-6ea9-4407-b846-f29d6bfa9903</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000015.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_b3156b1e-f787-43a6-b0d0-3b3fcfdf9df9" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_apiso_post_GetRecords-cql-title.xml b/tests/expected/suites_apiso_post_GetRecords-cql-title.xml
new file mode 100644
index 0000000..2b6ebdf
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecords-cql-title.xml
@@ -0,0 +1,372 @@
+<?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="5" numberOfRecordsReturned="5" recordSchema="http://www.isotc211.org/2005/gmd" elementSet="brief">
+    <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>a2744b0c-becd-426a-95a8-46e9850ccc6d</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="a2744b0c-becd-426a-95a8-46e9850ccc6d">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>DTM</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-07</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>19.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>30.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>34.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>42.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>0dc824a6-b555-46c1-bd7b-bc66cb91a70f</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="0dc824a6-b555-46c1-bd7b-bc66cb91a70f">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>DTM</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-07</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>19.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>30.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>34.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>42.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>42c8e55a-2bf6-476d-a7c9-be3bcd697f13</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="42c8e55a-2bf6-476d-a7c9-be3bcd697f13">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>DTM</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-07</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>19.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>30.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>34.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>42.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>c3bf29d4-d60a-4959-a415-2c03fb0d4aef</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="c3bf29d4-d60a-4959-a415-2c03fb0d4aef">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>DTM</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-07</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>19.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>30.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>34.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>42.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>b8cc2388-5d0a-43d8-9473-0e86dd0396da</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="b8cc2388-5d0a-43d8-9473-0e86dd0396da">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>DTM</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-07</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>19.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>30.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>34.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>42.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</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_apiso_post_GetRecords-elementname.xml b/tests/expected/suites_apiso_post_GetRecords-elementname.xml
new file mode 100644
index 0000000..abb010f
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecords-elementname.xml
@@ -0,0 +1,388 @@
+<?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="6" numberOfRecordsMatched="17" numberOfRecordsReturned="5" recordSchema="http://www.isotc211.org/2005/gmd">
+    <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>3e9a8c05</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <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:identificationInfo>
+        <srv:SV_ServiceIdentification id="3e9a8c05">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>test Title</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2011-04-19</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <srv:serviceType>
+            <gco:LocalName>view</gco:LocalName>
+          </srv:serviceType>
+          <srv:serviceTypeVersion>
+            <gco:CharacterString/>
+          </srv:serviceTypeVersion>
+          <srv:keywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString>Geographic viewer (humanGeographicViewer)</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>administration</gco:CharacterString>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </srv:keywords>
+          <srv:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>19.37</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>29.61</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>34.8</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>41.75</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </srv:extent>
+        </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://aiolos.survey.ntua.gr/geoserver/wms</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>366f6257-19eb-4f20-ba78-0698ac4aae77</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="366f6257-19eb-4f20-ba78-0698ac4aae77">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>75a7eb5e-336e-453d-ab06-209b1070d396</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="75a7eb5e-336e-453d-ab06-209b1070d396">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>a7308c0a-b748-48e2-bab7-0a608a51d416</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="a7308c0a-b748-48e2-bab7-0a608a51d416">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>0173e0d7-6ea9-4407-b846-f29d6bfa9903</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="0173e0d7-6ea9-4407-b846-f29d6bfa9903">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</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_apiso_post_GetRecords-filter-anytext.xml b/tests/expected/suites_apiso_post_GetRecords-filter-anytext.xml
new file mode 100644
index 0000000..e301c72
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecords-filter-anytext.xml
@@ -0,0 +1,372 @@
+<?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="5" numberOfRecordsReturned="5" recordSchema="http://www.isotc211.org/2005/gmd" elementSet="brief">
+    <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>366f6257-19eb-4f20-ba78-0698ac4aae77</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="366f6257-19eb-4f20-ba78-0698ac4aae77">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>75a7eb5e-336e-453d-ab06-209b1070d396</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="75a7eb5e-336e-453d-ab06-209b1070d396">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>a7308c0a-b748-48e2-bab7-0a608a51d416</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="a7308c0a-b748-48e2-bab7-0a608a51d416">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>0173e0d7-6ea9-4407-b846-f29d6bfa9903</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="0173e0d7-6ea9-4407-b846-f29d6bfa9903">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>437ae0a2-06e2-4015-b296-a66e7f407bf2</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="437ae0a2-06e2-4015-b296-a66e7f407bf2">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</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_apiso_post_GetRecords-filter-bbox-csw-output.xml b/tests/expected/suites_apiso_post_GetRecords-filter-bbox-csw-output.xml
new file mode 100644
index 0000000..8b52e48
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecords-filter-bbox-csw-output.xml
@@ -0,0 +1,52 @@
+<?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="6" numberOfRecordsMatched="16" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>3e9a8c05</dc:identifier>
+      <dc:title>test Title</dc:title>
+      <dc:type>service</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>34.8 19.37</ows:LowerCorner>
+        <ows:UpperCorner>41.75 29.61</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>366f6257-19eb-4f20-ba78-0698ac4aae77</dc:identifier>
+      <dc:title>Aerial Photos</dc:title>
+      <dc:type>dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>38.0 20.0</ows:LowerCorner>
+        <ows:UpperCorner>40.0 24.0</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>75a7eb5e-336e-453d-ab06-209b1070d396</dc:identifier>
+      <dc:title>Aerial Photos</dc:title>
+      <dc:type>dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>38.0 20.0</ows:LowerCorner>
+        <ows:UpperCorner>40.0 24.0</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>a7308c0a-b748-48e2-bab7-0a608a51d416</dc:identifier>
+      <dc:title>Aerial Photos</dc:title>
+      <dc:type>dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>38.0 20.0</ows:LowerCorner>
+        <ows:UpperCorner>40.0 24.0</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>0173e0d7-6ea9-4407-b846-f29d6bfa9903</dc:identifier>
+      <dc:title>Aerial Photos</dc:title>
+      <dc:type>dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>38.0 20.0</ows:LowerCorner>
+        <ows:UpperCorner>40.0 24.0</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_apiso_post_GetRecords-filter-bbox.xml b/tests/expected/suites_apiso_post_GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..1d06953
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecords-filter-bbox.xml
@@ -0,0 +1,388 @@
+<?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="6" numberOfRecordsMatched="16" numberOfRecordsReturned="5" recordSchema="http://www.isotc211.org/2005/gmd" elementSet="brief">
+    <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>3e9a8c05</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <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:identificationInfo>
+        <srv:SV_ServiceIdentification id="3e9a8c05">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>test Title</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2011-04-19</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <srv:serviceType>
+            <gco:LocalName>view</gco:LocalName>
+          </srv:serviceType>
+          <srv:serviceTypeVersion>
+            <gco:CharacterString/>
+          </srv:serviceTypeVersion>
+          <srv:keywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString>Geographic viewer (humanGeographicViewer)</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>administration</gco:CharacterString>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </srv:keywords>
+          <srv:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>19.37</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>29.61</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>34.8</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>41.75</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </srv:extent>
+        </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://aiolos.survey.ntua.gr/geoserver/wms</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>366f6257-19eb-4f20-ba78-0698ac4aae77</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="366f6257-19eb-4f20-ba78-0698ac4aae77">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>75a7eb5e-336e-453d-ab06-209b1070d396</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="75a7eb5e-336e-453d-ab06-209b1070d396">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>a7308c0a-b748-48e2-bab7-0a608a51d416</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="a7308c0a-b748-48e2-bab7-0a608a51d416">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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>0173e0d7-6ea9-4407-b846-f29d6bfa9903</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <gmd:hierarchyLevel>
+        <gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset" codeSpace="ISOTC211/19115">dataset</gmd:MD_ScopeCode>
+      </gmd:hierarchyLevel>
+      <gmd:identificationInfo>
+        <gmd:MD_DataIdentification id="0173e0d7-6ea9-4407-b846-f29d6bfa9903">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>Aerial Photos</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2009-10-09</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>20.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>24.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>38.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>40.0</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </gmd:extent>
+        </gmd:MD_DataIdentification>
+      </gmd:identificationInfo>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.ypaat.gr</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</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_apiso_post_GetRecords-filter-servicetype.xml b/tests/expected/suites_apiso_post_GetRecords-filter-servicetype.xml
new file mode 100644
index 0000000..13846fd
--- /dev/null
+++ b/tests/expected/suites_apiso_post_GetRecords-filter-servicetype.xml
@@ -0,0 +1,96 @@
+<?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="brief">
+    <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>3e9a8c05</gco:CharacterString>
+      </gmd:fileIdentifier>
+      <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:identificationInfo>
+        <srv:SV_ServiceIdentification id="3e9a8c05">
+          <gmd:citation>
+            <gmd:CI_Citation>
+              <gmd:title>
+                <gco:CharacterString>test Title</gco:CharacterString>
+              </gmd:title>
+              <gmd:date>
+                <gmd:CI_Date>
+                  <gmd:date>
+                    <gco:Date>2011-04-19</gco:Date>
+                  </gmd:date>
+                  <gmd:dateType>
+                    <gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation" codeSpace="ISOTC211/19115">creation</gmd:CI_DateTypeCode>
+                  </gmd:dateType>
+                </gmd:CI_Date>
+              </gmd:date>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <srv:serviceType>
+            <gco:LocalName>view</gco:LocalName>
+          </srv:serviceType>
+          <srv:serviceTypeVersion>
+            <gco:CharacterString/>
+          </srv:serviceTypeVersion>
+          <srv:keywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString>Geographic viewer (humanGeographicViewer)</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>administration</gco:CharacterString>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </srv:keywords>
+          <srv:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>19.37</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>29.61</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>34.8</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>41.75</gco:Decimal>
+                  </gmd:northBoundLatitude>
+                </gmd:EX_GeographicBoundingBox>
+              </gmd:geographicElement>
+            </gmd:EX_Extent>
+          </srv:extent>
+        </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://aiolos.survey.ntua.gr/geoserver/wms</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>None</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>None</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_atom_get_opensearch.xml b/tests/expected/suites_atom_get_opensearch.xml
new file mode 100644
index 0000000..5552c40
--- /dev/null
+++ b/tests/expected/suites_atom_get_opensearch.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<atom:feed xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
+  <atom:id>http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg</atom:id>
+  <atom:title>pycsw Geospatial Catalogue</atom:title>
+  <opensearch:totalResults>12</opensearch:totalResults>
+  <opensearch:startIndex>1</opensearch:startIndex>
+  <opensearch:itemsPerPage>10</opensearch:itemsPerPage>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:category>Tourism--Greece</atom:category>
+    <atom:id>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f"/>
+    <atom:summary>Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.</atom:summary>
+    <atom:title>Lorem ipsum</atom:title>
+  </atom:entry>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:id>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd"/>
+    <atom:summary>Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.</atom:summary>
+    <georss:where>
+      <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+        <gml:exterior>
+          <gml:LinearRing>
+            <gml:posList>60.04 13.75 68.41 13.75 68.41 17.92 60.04 17.92 60.04 13.75</gml:posList>
+          </gml:LinearRing>
+        </gml:exterior>
+      </gml:Polygon>
+    </georss:where>
+  </atom:entry>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:category>Marine sediments</atom:category>
+    <atom:id>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493"/>
+    <atom:summary>Pellentesque tempus magna non sapien fringilla blandit.</atom:summary>
+    <atom:title>Maecenas enim</atom:title>
+  </atom:entry>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:category>Vegetation</atom:category>
+    <atom:id>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4"/>
+    <atom:title>Ut facilisis justo ut lacus</atom:title>
+  </atom:entry>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:category>Hydrography--Dictionaries</atom:category>
+    <atom:id>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec"/>
+    <atom:summary>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</atom:summary>
+    <atom:title>Aliquam fermentum purus quis arcu</atom:title>
+  </atom:entry>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:id>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e"/>
+    <atom:title>Vestibulum massa purus</atom:title>
+  </atom:entry>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:category>Physiography-Landforms</atom:category>
+    <atom:id>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357"/>
+    <atom:summary>Donec scelerisque pede ut nisl luctus accumsan. Quisque ultrices, lorem eget feugiat fringilla, lorem dui porttitor ante, cursus ultrices magna odio eu neque.</atom:summary>
+  </atom:entry>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:category>Vegetation-Cropland</atom:category>
+    <atom:id>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63"/>
+    <atom:summary>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</atom:summary>
+    <atom:title>Mauris sed neque</atom:title>
+    <georss:where>
+      <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+        <gml:exterior>
+          <gml:LinearRing>
+            <gml:posList>47.59 -4.1 51.22 -4.1 51.22 0.89 47.59 0.89 47.59 -4.1</gml:posList>
+          </gml:LinearRing>
+        </gml:exterior>
+      </gml:Polygon>
+    </georss:where>
+  </atom:entry>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:category>Hydrography-Oceanographic</atom:category>
+    <atom:id>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc"/>
+    <atom:title>Ñunç elementum</atom:title>
+    <georss:where>
+      <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+        <gml:exterior>
+          <gml:LinearRing>
+            <gml:posList>44.79 -6.17 51.13 -6.17 51.13 -2.23 44.79 -2.23 44.79 -6.17</gml:posList>
+          </gml:LinearRing>
+        </gml:exterior>
+      </gml:Polygon>
+    </georss:where>
+  </atom:entry>
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:id>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2"/>
+    <atom:title>Lorem ipsum dolor sit amet</atom:title>
+  </atom:entry>
+</atom:feed>
diff --git a/tests/expected/suites_atom_post_DescribeRecord.xml b/tests/expected/suites_atom_post_DescribeRecord.xml
new file mode 100644
index 0000000..04284a4
--- /dev/null
+++ b/tests/expected/suites_atom_post_DescribeRecord.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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/ [...]
diff --git a/tests/expected/suites_atom_post_GetCapabilities.xml b/tests/expected/suites_atom_post_GetCapabilities.xml
new file mode 100644
index 0000000..3815701
--- /dev/null
+++ b/tests/expected/suites_atom_post_GetCapabilities.xml
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_atom_post_GetRecords-filter-bbox.xml b/tests/expected/suites_atom_post_GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..8c758e2
--- /dev/null
+++ b/tests/expected/suites_atom_post_GetRecords-filter-bbox.xml
@@ -0,0 +1,38 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.w3.org/2005/Atom" elementSet="brief">
+    <atom:entry xmlns:georss="http://www.georss.org/georss" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+      <atom:category>Vegetation-Cropland</atom:category>
+      <atom:id>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</atom:id>
+      <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63"/>
+      <atom:summary>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</atom:summary>
+      <atom:title>Mauris sed neque</atom:title>
+      <georss:where>
+        <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+          <gml:exterior>
+            <gml:LinearRing>
+              <gml:posList>47.59 -4.1 51.22 -4.1 51.22 0.89 47.59 0.89 47.59 -4.1</gml:posList>
+            </gml:LinearRing>
+          </gml:exterior>
+        </gml:Polygon>
+      </georss:where>
+    </atom:entry>
+    <atom:entry xmlns:georss="http://www.georss.org/georss" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+      <atom:category>Hydrography-Oceanographic</atom:category>
+      <atom:id>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</atom:id>
+      <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc"/>
+      <atom:title>Ñunç elementum</atom:title>
+      <georss:where>
+        <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+          <gml:exterior>
+            <gml:LinearRing>
+              <gml:posList>44.79 -6.17 51.13 -6.17 51.13 -2.23 44.79 -2.23 44.79 -6.17</gml:posList>
+            </gml:LinearRing>
+          </gml:exterior>
+        </gml:Polygon>
+      </georss:where>
+    </atom:entry>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_get_27e17158-c57a-4493-92ac-dba8934cf462.xml b/tests/expected/suites_cite_get_27e17158-c57a-4493-92ac-dba8934cf462.xml
new file mode 100644
index 0000000..af1a3a4
--- /dev/null
+++ b/tests/expected/suites_cite_get_27e17158-c57a-4493-92ac-dba8934cf462.xml
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_27f69b66-5f05-4311-a89c-73ca55c2686b.xml b/tests/expected/suites_cite_get_27f69b66-5f05-4311-a89c-73ca55c2686b.xml
new file mode 100644
index 0000000..82d7b75
--- /dev/null
+++ b/tests/expected/suites_cite_get_27f69b66-5f05-4311-a89c-73ca55c2686b.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/c [...]
+  <csw:BriefRecord>
+    <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+    <dc:title>Lorem ipsum</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+  </csw:BriefRecord>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_cite_get_2ab7d1fa-885b-459f-80e4-b6282eab4f8c.xml b/tests/expected/suites_cite_get_2ab7d1fa-885b-459f-80e4-b6282eab4f8c.xml
new file mode 100644
index 0000000..af1a3a4
--- /dev/null
+++ b/tests/expected/suites_cite_get_2ab7d1fa-885b-459f-80e4-b6282eab4f8c.xml
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_37aa90e2-6ff0-420c-af15-8b9463099a73.xml b/tests/expected/suites_cite_get_37aa90e2-6ff0-420c-af15-8b9463099a73.xml
new file mode 100644
index 0000000..3778181
--- /dev/null
+++ b/tests/expected/suites_cite_get_37aa90e2-6ff0-420c-af15-8b9463099a73.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/c [...]
+  <csw:SummaryRecord>
+    <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+    <dc:title>Ñunç elementum</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:subject>Hydrography-Oceanographic</dc:subject>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+      <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+      <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+    </ows:BoundingBox>
+  </csw:SummaryRecord>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_cite_get_3a8a3c47-455f-4f49-9078-03119f3e70b3.xml b/tests/expected/suites_cite_get_3a8a3c47-455f-4f49-9078-03119f3e70b3.xml
new file mode 100644
index 0000000..af1a3a4
--- /dev/null
+++ b/tests/expected/suites_cite_get_3a8a3c47-455f-4f49-9078-03119f3e70b3.xml
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_4515831f-834a-4699-95f6-ab0c2cbfcfd0.xml b/tests/expected/suites_cite_get_4515831f-834a-4699-95f6-ab0c2cbfcfd0.xml
new file mode 100644
index 0000000..76a5a54
--- /dev/null
+++ b/tests/expected/suites_cite_get_4515831f-834a-4699-95f6-ab0c2cbfcfd0.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="MissingParameterValue" locator="id">
+    <ows:ExceptionText>Missing id parameter</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_get_477b23a3-baa9-47c8-9541-5fe27735ed49.xml b/tests/expected/suites_cite_get_477b23a3-baa9-47c8-9541-5fe27735ed49.xml
new file mode 100644
index 0000000..15b88f1
--- /dev/null
+++ b/tests/expected/suites_cite_get_477b23a3-baa9-47c8-9541-5fe27735ed49.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_48f26761-3a9d-48db-bee1-da089f5fb857.xml b/tests/expected/suites_cite_get_48f26761-3a9d-48db-bee1-da089f5fb857.xml
new file mode 100644
index 0000000..af1a3a4
--- /dev/null
+++ b/tests/expected/suites_cite_get_48f26761-3a9d-48db-bee1-da089f5fb857.xml
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_4e38092f-1586-44b8-988e-0acfa5855916.xml b/tests/expected/suites_cite_get_4e38092f-1586-44b8-988e-0acfa5855916.xml
new file mode 100644
index 0000000..ef68f28
--- /dev/null
+++ b/tests/expected/suites_cite_get_4e38092f-1586-44b8-988e-0acfa5855916.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="outputformat">
+    <ows:ExceptionText>Invalid outputformat parameter application/bogus_xml</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_get_55c38f00-2553-42c1-99ab-33edbb561ad7.xml b/tests/expected/suites_cite_get_55c38f00-2553-42c1-99ab-33edbb561ad7.xml
new file mode 100644
index 0000000..c2693ca
--- /dev/null
+++ b/tests/expected/suites_cite_get_55c38f00-2553-42c1-99ab-33edbb561ad7.xml
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_5ab5db18-c87a-4fbf-a8d8-b7289b09ac81.xml b/tests/expected/suites_cite_get_5ab5db18-c87a-4fbf-a8d8-b7289b09ac81.xml
new file mode 100644
index 0000000..3e2471b
--- /dev/null
+++ b/tests/expected/suites_cite_get_5ab5db18-c87a-4fbf-a8d8-b7289b09ac81.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="service">
+    <ows:ExceptionText>Invalid value for service: FOO.                    Value MUST be CSW</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_get_6a4f57ca-a1bd-4802-89c2-44860dbdb0f0.xml b/tests/expected/suites_cite_get_6a4f57ca-a1bd-4802-89c2-44860dbdb0f0.xml
new file mode 100644
index 0000000..b660099
--- /dev/null
+++ b/tests/expected/suites_cite_get_6a4f57ca-a1bd-4802-89c2-44860dbdb0f0.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/c [...]
+  <csw:SummaryRecord>
+    <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+    <dc:title>Ut facilisis justo ut lacus</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:subject>Vegetation</dc:subject>
+    <dc:relation>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:relation>
+  </csw:SummaryRecord>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_cite_get_6c375703-9c00-4aef-bec7-d2e964f849eb.xml b/tests/expected/suites_cite_get_6c375703-9c00-4aef-bec7-d2e964f849eb.xml
new file mode 100644
index 0000000..6cc4618
--- /dev/null
+++ b/tests/expected/suites_cite_get_6c375703-9c00-4aef-bec7-d2e964f849eb.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/c [...]
+  <atom:entry xmlns:georss="http://www.georss.org/georss" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+    <atom:category>Tourism--Greece</atom:category>
+    <atom:id>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</atom:id>
+    <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f"/>
+    <atom:summary>Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.</atom:summary>
+    <atom:title>Lorem ipsum</atom:title>
+  </atom:entry>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_cite_get_80f31def-4185-48b9-983a-960566918eae.xml b/tests/expected/suites_cite_get_80f31def-4185-48b9-983a-960566918eae.xml
new file mode 100644
index 0000000..af1a3a4
--- /dev/null
+++ b/tests/expected/suites_cite_get_80f31def-4185-48b9-983a-960566918eae.xml
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_8e2232ed-05d9-44ae-8b04-0911cbe6a507.xml b/tests/expected/suites_cite_get_8e2232ed-05d9-44ae-8b04-0911cbe6a507.xml
new file mode 100644
index 0000000..1154d5f
--- /dev/null
+++ b/tests/expected/suites_cite_get_8e2232ed-05d9-44ae-8b04-0911cbe6a507.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="VersionNegotiationFailed" locator="acceptversions">
+    <ows:ExceptionText>Invalid parameter value in acceptversions:                            2006.10.29. Value MUST be 2.0.2</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_get_9697f0aa-3b6a-4125-83a5-61e8826127c4.xml b/tests/expected/suites_cite_get_9697f0aa-3b6a-4125-83a5-61e8826127c4.xml
new file mode 100644
index 0000000..af1a3a4
--- /dev/null
+++ b/tests/expected/suites_cite_get_9697f0aa-3b6a-4125-83a5-61e8826127c4.xml
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_9bfd17fa-15dc-4a10-8fa7-b3cff7013dd7.xml b/tests/expected/suites_cite_get_9bfd17fa-15dc-4a10-8fa7-b3cff7013dd7.xml
new file mode 100644
index 0000000..f7e7fd5
--- /dev/null
+++ b/tests/expected/suites_cite_get_9bfd17fa-15dc-4a10-8fa7-b3cff7013dd7.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/c [...]
+  <csw:Record>
+    <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:title>Fuscé vitae ligulä</dc:title>
+    <dc:date>2003-05-09Z</dc:date>
+    <dc:subject>Land titles</dc:subject>
+    <dc:format>text/rtf</dc:format>
+    <dct:abstract>Morbi ultriçes, dui suscipit vestibulum prètium, velit ante pretium tortor, egët tincidunt pede odio ac nulla.</dct:abstract>
+</csw:Record>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_cite_get_b81c3595-06d6-4693-82ea-1ff8650755ac.xml b/tests/expected/suites_cite_get_b81c3595-06d6-4693-82ea-1ff8650755ac.xml
new file mode 100644
index 0000000..15857d5
--- /dev/null
+++ b/tests/expected/suites_cite_get_b81c3595-06d6-4693-82ea-1ff8650755ac.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/c [...]
diff --git a/tests/expected/suites_cite_get_ba5fc729-3b71-47a0-b7d0-42ec565cd185.xml b/tests/expected/suites_cite_get_ba5fc729-3b71-47a0-b7d0-42ec565cd185.xml
new file mode 100644
index 0000000..af1a3a4
--- /dev/null
+++ b/tests/expected/suites_cite_get_ba5fc729-3b71-47a0-b7d0-42ec565cd185.xml
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_c4ea754f-c158-4d8d-8253-dc8f86021b52.xml b/tests/expected/suites_cite_get_c4ea754f-c158-4d8d-8253-dc8f86021b52.xml
new file mode 100644
index 0000000..48cfa6c
--- /dev/null
+++ b/tests/expected/suites_cite_get_c4ea754f-c158-4d8d-8253-dc8f86021b52.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="MissingParameterValue" locator="service">
+    <ows:ExceptionText>Missing keyword: service</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_get_f4692ec5-9547-4a05-88ab-e6154af2640a.xml b/tests/expected/suites_cite_get_f4692ec5-9547-4a05-88ab-e6154af2640a.xml
new file mode 100644
index 0000000..af1a3a4
--- /dev/null
+++ b/tests/expected/suites_cite_get_f4692ec5-9547-4a05-88ab-e6154af2640a.xml
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_cite_get_f997f25e-c865-4d53-a362-0ed1846337f2.xml b/tests/expected/suites_cite_get_f997f25e-c865-4d53-a362-0ed1846337f2.xml
new file mode 100644
index 0000000..2682d35
--- /dev/null
+++ b/tests/expected/suites_cite_get_f997f25e-c865-4d53-a362-0ed1846337f2.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/c [...]
+  <csw:SummaryRecord>
+    <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:subject>Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+      <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+      <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+    </ows:BoundingBox>
+  </csw:SummaryRecord>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_cite_post_0c976d98-c896-4b10-b1fe-a22ef50434e7.xml b/tests/expected/suites_cite_post_0c976d98-c896-4b10-b1fe-a22ef50434e7.xml
new file mode 100644
index 0000000..9b6ce30
--- /dev/null
+++ b/tests/expected/suites_cite_post_0c976d98-c896-4b10-b1fe-a22ef50434e7.xml
@@ -0,0 +1,6 @@
+<?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="1" numberOfRecordsMatched="11" numberOfRecordsReturned="0" recordSchema="http://www.opengis.net/cat/csw/2.0.2"/>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_19d2a6ed-be28-4866-ae15-e3bb634486cb.xml b/tests/expected/suites_cite_post_19d2a6ed-be28-4866-ae15-e3bb634486cb.xml
new file mode 100644
index 0000000..81f85e5
--- /dev/null
+++ b/tests/expected/suites_cite_post_19d2a6ed-be28-4866-ae15-e3bb634486cb.xml
@@ -0,0 +1,55 @@
+<?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="8" numberOfRecordsReturned="8" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml b/tests/expected/suites_cite_post_1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml
new file mode 100644
index 0000000..d908020
--- /dev/null
+++ b/tests/expected/suites_cite_post_1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Acknowledgement 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/csdgm"  [...]
+  <csw:EchoedRequest>
+    <csw:GetRecords xmlns="http://www.occamlab.com/ctl" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="http://www.occamlab.com/te" xmlns:tec="java:com.occamlab.te.TECore" xmlns:tems="java:com.occamlab.te.web.MonitorServlet" xmlns:xi="http://www.w3.org/2001/XInclude" resultType="validate" service="CSW" version="2.0.2">
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>full</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike escapeChar="\" singleChar="." wildCard="*">
+          <ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+          <ogc:Literal>*lorem*</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
+  </csw:EchoedRequest>
+</csw:Acknowledgement>
diff --git a/tests/expected/suites_cite_post_1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml b/tests/expected/suites_cite_post_1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml
new file mode 100644
index 0000000..d9045b7
--- /dev/null
+++ b/tests/expected/suites_cite_post_1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="outputformat">
+    <ows:ExceptionText>Invalid outputFormat parameter value: application/xhtml+xml</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_post_1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml b/tests/expected/suites_cite_post_1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml
new file mode 100644
index 0000000..d68fd69
--- /dev/null
+++ b/tests/expected/suites_cite_post_1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="service">
+    <ows:ExceptionText>Invalid Constraint: Invalid Filter request: Invalid PropertyName: /dc:title.  '/dc:title'</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_post_2102a460-5d62-465f-9668-d70b3faafbfa.xml b/tests/expected/suites_cite_post_2102a460-5d62-465f-9668-d70b3faafbfa.xml
new file mode 100644
index 0000000..1abe27d
--- /dev/null
+++ b/tests/expected/suites_cite_post_2102a460-5d62-465f-9668-d70b3faafbfa.xml
@@ -0,0 +1,12 @@
+<?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="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_225f455a-0035-486b-a94e-fee7ae881b2b.xml b/tests/expected/suites_cite_post_225f455a-0035-486b-a94e-fee7ae881b2b.xml
new file mode 100644
index 0000000..d11aacf
--- /dev/null
+++ b/tests/expected/suites_cite_post_225f455a-0035-486b-a94e-fee7ae881b2b.xml
@@ -0,0 +1,17 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2006-03-26Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:date>2006-05-12Z</dc:date>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_2d53ffea-60e4-4652-abf5-36eb23042fd5.xml b/tests/expected/suites_cite_post_2d53ffea-60e4-4652-abf5-36eb23042fd5.xml
new file mode 100644
index 0000000..431b0a3
--- /dev/null
+++ b/tests/expected/suites_cite_post_2d53ffea-60e4-4652-abf5-36eb23042fd5.xml
@@ -0,0 +1,69 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>60.04 13.75</ows:LowerCorner>
+        <ows:UpperCorner>68.41 17.92</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_34a019a9-1581-42cb-9827-fbfdda2773b7.xml b/tests/expected/suites_cite_post_34a019a9-1581-42cb-9827-fbfdda2773b7.xml
new file mode 100644
index 0000000..0a80553
--- /dev/null
+++ b/tests/expected/suites_cite_post_34a019a9-1581-42cb-9827-fbfdda2773b7.xml
@@ -0,0 +1,6 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="0" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief"/>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_3e76fd38-e035-41c9-83dc-61356f680c97.xml b/tests/expected/suites_cite_post_3e76fd38-e035-41c9-83dc-61356f680c97.xml
new file mode 100644
index 0000000..cdf0856
--- /dev/null
+++ b/tests/expected/suites_cite_post_3e76fd38-e035-41c9-83dc-61356f680c97.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="schemalanguage">
+    <ows:ExceptionText>Invalid value for schemalanguage: http://purl.oclc.org/dsdl/schematron</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_post_418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml b/tests/expected/suites_cite_post_418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml
new file mode 100644
index 0000000..7adeba6
--- /dev/null
+++ b/tests/expected/suites_cite_post_418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml
@@ -0,0 +1,15 @@
+<?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">
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:date>2006-03-26Z</dc:date>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_420b745e-0c4b-404e-9f2d-61fa580ff05a.xml b/tests/expected/suites_cite_post_420b745e-0c4b-404e-9f2d-61fa580ff05a.xml
new file mode 100644
index 0000000..e4f64c8
--- /dev/null
+++ b/tests/expected/suites_cite_post_420b745e-0c4b-404e-9f2d-61fa580ff05a.xml
@@ -0,0 +1,22 @@
+<?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="3" numberOfRecordsReturned="3" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2005-10-24Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2006-03-26Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:date>2006-05-12Z</dc:date>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_4735d649-a2b1-42fd-a101-14e1d7e4607f.xml b/tests/expected/suites_cite_post_4735d649-a2b1-42fd-a101-14e1d7e4607f.xml
new file mode 100644
index 0000000..c2180b4
--- /dev/null
+++ b/tests/expected/suites_cite_post_4735d649-a2b1-42fd-a101-14e1d7e4607f.xml
@@ -0,0 +1,44 @@
+<?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="8" numberOfRecordsMatched="12" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="summary">
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:subject>Marine sediments</dc:subject>
+      <dc:format>application/xhtml+xml</dc:format>
+      <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <dc:subject>Vegetation</dc:subject>
+      <dc:relation>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:relation>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:subject>Hydrography--Dictionaries</dc:subject>
+      <dc:format>application/pdf</dc:format>
+      <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:format>image/jp2</dc:format>
+      <dc:relation>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:relation>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:subject>Physiography-Landforms</dc:subject>
+      <dct:abstract>Donec scelerisque pede ut nisl luctus accumsan. Quisque ultrices, lorem eget feugiat fringilla, lorem dui porttitor ante, cursus ultrices magna odio eu neque.</dct:abstract>
+    </csw:SummaryRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_5c5861bc-f742-40a5-9998-5342615d674b.xml b/tests/expected/suites_cite_post_5c5861bc-f742-40a5-9998-5342615d674b.xml
new file mode 100644
index 0000000..b5bea4f
--- /dev/null
+++ b/tests/expected/suites_cite_post_5c5861bc-f742-40a5-9998-5342615d674b.xml
@@ -0,0 +1,49 @@
+<?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="5" numberOfRecordsReturned="5" 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:Record>
+    <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography-Landforms</dc:subject>
+    <dct:spatial>FI-ES</dct:spatial>
+    <dct:abstract>Donec scelerisque pede ut nisl luctus accumsan. Quisque ultrices, lorem eget feugiat fringilla, lorem dui porttitor ante, cursus ultrices magna odio eu neque.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <dc:date>2006-03-26Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>47.595 -4.097</ows:LowerCorner>
+      <ows:UpperCorner>51.217 0.889</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:title>Lorem ipsum dolor sit amet</dc:title>
+    <dc:format>image/jpeg</dc:format>
+    <dct:spatial>IT-FI</dct:spatial>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography</dc:subject>
+    <dct:abstract>Suspendisse accumsan molestie lorem. Nullam velit turpis, mattis ut, varius bibendum, laoreet non, quam.</dct:abstract>
+    <dc:relation>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:relation>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml b/tests/expected/suites_cite_post_6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml
new file mode 100644
index 0000000..0dae426
--- /dev/null
+++ b/tests/expected/suites_cite_post_6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml
@@ -0,0 +1,89 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="summary">
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:subject>Tourism--Greece</dc:subject>
+      <dc:format>image/svg+xml</dc:format>
+      <dct:abstract>Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <dct:abstract>Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.</dct:abstract>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>60.04 13.75</ows:LowerCorner>
+        <ows:UpperCorner>68.41 17.92</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:subject>Marine sediments</dc:subject>
+      <dc:format>application/xhtml+xml</dc:format>
+      <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <dc:subject>Vegetation</dc:subject>
+      <dc:relation>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:relation>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:subject>Hydrography--Dictionaries</dc:subject>
+      <dc:format>application/pdf</dc:format>
+      <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:format>image/jp2</dc:format>
+      <dc:relation>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:relation>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:subject>Physiography-Landforms</dc:subject>
+      <dct:abstract>Donec scelerisque pede ut nisl luctus accumsan. Quisque ultrices, lorem eget feugiat fringilla, lorem dui porttitor ante, cursus ultrices magna odio eu neque.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:subject>Vegetation-Cropland</dc:subject>
+      <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:subject>Hydrography-Oceanographic</dc:subject>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:format>image/jpeg</dc:format>
+    </csw:SummaryRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml b/tests/expected/suites_cite_post_73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml
new file mode 100644
index 0000000..fc99d14
--- /dev/null
+++ b/tests/expected/suites_cite_post_73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml
@@ -0,0 +1,18 @@
+<?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:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Ñunç elementum</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Hydrography-Oceanographic</dc:subject>
+    <dc:date>2005-10-24Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>44.792 -6.171</ows:LowerCorner>
+      <ows:UpperCorner>51.126 -2.228</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_78297c88-4850-4927-adc6-511cd9a3d539.xml b/tests/expected/suites_cite_post_78297c88-4850-4927-adc6-511cd9a3d539.xml
new file mode 100644
index 0000000..7ee77c7
--- /dev/null
+++ b/tests/expected/suites_cite_post_78297c88-4850-4927-adc6-511cd9a3d539.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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/ [...]
+  <csw:SchemaComponent schemaLanguage="XMLSCHEMA" targetNamespace="http://www.opengis.net/cat/csw/2.0.2">
+    <xs:schema id="csw-record" targetNamespace="http://www.opengis.net/cat/csw/2.0.2" elementFormDefault="qualified" version="2.0.2 2010-01-22">
+   <xs:annotation>
+      <xs:appinfo>
+         <dc:identifier>http://schemas.opengis.net/csw/2.0.2/record.xsd</dc:identifier>
+      </xs:appinfo>
+      <xs:documentation xml:lang="en">
+         This schema defines the basic record types that must be supported
+         by all CSW implementations. These correspond to full, summary, and
+         brief views based on DCMI metadata terms.
+         
+         CSW is an OGC Standard.
+         Copyright (c) 2004,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+         To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </xs:documentation>
+   </xs:annotation>
+
+   <xs:import namespace="http://purl.org/dc/terms/" schemaLocation="rec-dcterms.xsd"/>
+   <xs:import namespace="http://purl.org/dc/elements/1.1/" schemaLocation="rec-dcmes.xsd"/>
+   <xs:import namespace="http://www.opengis.net/ows" schemaLocation="../../ows/1.0.0/owsAll.xsd"/>
+
+   <xs:element name="AbstractRecord" id="AbstractRecord" type="csw:AbstractRecordType" abstract="true"/>
+   <xs:complexType name="AbstractRecordType" id="AbstractRecordType" abstract="true"/>
+
+   <xs:element name="DCMIRecord" type="csw:DCMIRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="DCMIRecordType">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type encapsulates all of the standard DCMI metadata terms,
+            including the Dublin Core refinements; these terms may be mapped
+            to the profile-specific information model.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:group ref="dct:DCMI-terms"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="BriefRecord" type="csw:BriefRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="BriefRecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type defines a brief representation of the common record
+            format.  It extends AbstractRecordType to include only the
+             dc:identifier and dc:type properties.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:element ref="dc:identifier" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:title" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:type" minOccurs="0"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="SummaryRecord" type="csw:SummaryRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="SummaryRecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type defines a summary representation of the common record
+            format.  It extends AbstractRecordType to include the core
+            properties.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:element ref="dc:identifier" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:title" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:type" minOccurs="0"/>
+               <xs:element ref="dc:subject" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dc:format" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dc:relation" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:modified" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:abstract" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:spatial" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="Record" type="csw:RecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="RecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type extends DCMIRecordType to add ows:BoundingBox;
+            it may be used to specify a spatial envelope for the
+            catalogued resource.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:DCMIRecordType">
+            <xs:sequence>
+               <xs:element name="AnyText" type="csw:EmptyType" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+   <xs:complexType name="EmptyType"/>
+</xs:schema>
+  </csw:SchemaComponent>
+</csw:DescribeRecordResponse>
diff --git a/tests/expected/suites_cite_post_7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml b/tests/expected/suites_cite_post_7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml
new file mode 100644
index 0000000..8adbb25
--- /dev/null
+++ b/tests/expected/suites_cite_post_7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml
@@ -0,0 +1,48 @@
+<?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="6" numberOfRecordsMatched="12" numberOfRecordsReturned="5" recordSchema="http://www.w3.org/2005/Atom" elementSet="summary">
+    <atom:entry xmlns:georss="http://www.georss.org/georss" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+      <atom:category>Tourism--Greece</atom:category>
+      <atom:id>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</atom:id>
+      <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f"/>
+      <atom:summary>Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.</atom:summary>
+      <atom:title>Lorem ipsum</atom:title>
+    </atom:entry>
+    <atom:entry xmlns:georss="http://www.georss.org/georss" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+      <atom:id>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</atom:id>
+      <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd"/>
+      <atom:summary>Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.</atom:summary>
+      <georss:where>
+        <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+          <gml:exterior>
+            <gml:LinearRing>
+              <gml:posList>60.04 13.75 68.41 13.75 68.41 17.92 60.04 17.92 60.04 13.75</gml:posList>
+            </gml:LinearRing>
+          </gml:exterior>
+        </gml:Polygon>
+      </georss:where>
+    </atom:entry>
+    <atom:entry xmlns:georss="http://www.georss.org/georss" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+      <atom:category>Marine sediments</atom:category>
+      <atom:id>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</atom:id>
+      <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493"/>
+      <atom:summary>Pellentesque tempus magna non sapien fringilla blandit.</atom:summary>
+      <atom:title>Maecenas enim</atom:title>
+    </atom:entry>
+    <atom:entry xmlns:georss="http://www.georss.org/georss" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+      <atom:category>Vegetation</atom:category>
+      <atom:id>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</atom:id>
+      <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4"/>
+      <atom:title>Ut facilisis justo ut lacus</atom:title>
+    </atom:entry>
+    <atom:entry xmlns:georss="http://www.georss.org/georss" xsi:schemaLocation="http://www.w3.org/2005/Atom http://www.kbcafe.com/rss/atom.xsd.xml">
+      <atom:category>Hydrography--Dictionaries</atom:category>
+      <atom:id>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</atom:id>
+      <atom:link href="http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg?service=CSW&version=2.0.2&request=GetRepositoryItem&id=urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec"/>
+      <atom:summary>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</atom:summary>
+      <atom:title>Aliquam fermentum purus quis arcu</atom:title>
+    </atom:entry>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_7e2cd105-daec-4d25-bc8e-d49d21364912.xml b/tests/expected/suites_cite_post_7e2cd105-daec-4d25-bc8e-d49d21364912.xml
new file mode 100644
index 0000000..04284a4
--- /dev/null
+++ b/tests/expected/suites_cite_post_7e2cd105-daec-4d25-bc8e-d49d21364912.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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/ [...]
diff --git a/tests/expected/suites_cite_post_87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml b/tests/expected/suites_cite_post_87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml
new file mode 100644
index 0000000..fb246b2
--- /dev/null
+++ b/tests/expected/suites_cite_post_87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml
@@ -0,0 +1,50 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:date>2006-05-12Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2006-03-26Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2005-10-24Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml b/tests/expected/suites_cite_post_88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml
new file mode 100644
index 0000000..ace747b
--- /dev/null
+++ b/tests/expected/suites_cite_post_88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="outputformat">
+    <ows:ExceptionText>Invalid value for outputformat: text/sgml</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_post_898cd63b-2585-4ec0-8720-d554bd324174.xml b/tests/expected/suites_cite_post_898cd63b-2585-4ec0-8720-d554bd324174.xml
new file mode 100644
index 0000000..945dd21
--- /dev/null
+++ b/tests/expected/suites_cite_post_898cd63b-2585-4ec0-8720-d554bd324174.xml
@@ -0,0 +1,14 @@
+<?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="summary">
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:format>image/jp2</dc:format>
+      <dc:relation>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:relation>
+    </csw:SummaryRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml b/tests/expected/suites_cite_post_8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml
new file mode 100644
index 0000000..eed52f8
--- /dev/null
+++ b/tests/expected/suites_cite_post_8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml
@@ -0,0 +1,48 @@
+<?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="11" numberOfRecordsReturned="11" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_928c1896-52d4-4ac7-9832-f98e3eb65f02.xml b/tests/expected/suites_cite_post_928c1896-52d4-4ac7-9832-f98e3eb65f02.xml
new file mode 100644
index 0000000..6fcf294
--- /dev/null
+++ b/tests/expected/suites_cite_post_928c1896-52d4-4ac7-9832-f98e3eb65f02.xml
@@ -0,0 +1,17 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:date>2003-05-09Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2005-10-24Z</dc:date>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_93bdbb9d-2734-4f01-92fb-48634cca41de.xml b/tests/expected/suites_cite_post_93bdbb9d-2734-4f01-92fb-48634cca41de.xml
new file mode 100644
index 0000000..9212c38
--- /dev/null
+++ b/tests/expected/suites_cite_post_93bdbb9d-2734-4f01-92fb-48634cca41de.xml
@@ -0,0 +1,21 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml b/tests/expected/suites_cite_post_948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml
new file mode 100644
index 0000000..b8ced64
--- /dev/null
+++ b/tests/expected/suites_cite_post_948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml
@@ -0,0 +1,51 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:date>2006-05-12Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2006-03-26Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2005-10-24Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:date>2003-05-09Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml b/tests/expected/suites_cite_post_9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml
new file mode 100644
index 0000000..a4a8a5e
--- /dev/null
+++ b/tests/expected/suites_cite_post_9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="typename">
+    <ows:ExceptionText>Typename not qualified: Record</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_post_a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml b/tests/expected/suites_cite_post_a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml
new file mode 100644
index 0000000..431b0a3
--- /dev/null
+++ b/tests/expected/suites_cite_post_a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml
@@ -0,0 +1,69 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>60.04 13.75</ows:LowerCorner>
+        <ows:UpperCorner>68.41 17.92</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_ad61686c-d304-42d1-b845-8c1f3070c83e.xml b/tests/expected/suites_cite_post_ad61686c-d304-42d1-b845-8c1f3070c83e.xml
new file mode 100644
index 0000000..1585217
--- /dev/null
+++ b/tests/expected/suites_cite_post_ad61686c-d304-42d1-b845-8c1f3070c83e.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="NoApplicableCode" locator="service">
+    <ows:ExceptionText>Exception: the document is not valid.
+Error: Element '{http://www.opengis.net/foo}Filter': This element is not expected. Expected is one of ( {http://www.opengis.net/ogc}Filter, {http://www.opengis.net/cat/csw/2.0.2}CqlText ).</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_post_af39c020-7b1d-429c-b474-f45c3164cb79.xml b/tests/expected/suites_cite_post_af39c020-7b1d-429c-b474-f45c3164cb79.xml
new file mode 100644
index 0000000..3ea1e55
--- /dev/null
+++ b/tests/expected/suites_cite_post_af39c020-7b1d-429c-b474-f45c3164cb79.xml
@@ -0,0 +1,21 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="summary">
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:subject>Tourism--Greece</dc:subject>
+      <dc:format>image/svg+xml</dc:format>
+      <dct:abstract>Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:format>image/jpeg</dc:format>
+    </csw:SummaryRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml b/tests/expected/suites_cite_post_b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml
new file mode 100644
index 0000000..3c325b7
--- /dev/null
+++ b/tests/expected/suites_cite_post_b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml
@@ -0,0 +1,91 @@
+<?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="10" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="summary">
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <dct:abstract>Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.</dct:abstract>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>60.04 13.75</ows:LowerCorner>
+        <ows:UpperCorner>68.41 17.92</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:subject>Marine sediments</dc:subject>
+      <dc:format>application/xhtml+xml</dc:format>
+      <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <dc:subject>Vegetation</dc:subject>
+      <dc:relation>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:relation>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:subject>Hydrography--Dictionaries</dc:subject>
+      <dc:format>application/pdf</dc:format>
+      <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:format>image/jp2</dc:format>
+      <dc:relation>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:relation>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:subject>Physiography-Landforms</dc:subject>
+      <dct:abstract>Donec scelerisque pede ut nisl luctus accumsan. Quisque ultrices, lorem eget feugiat fringilla, lorem dui porttitor ante, cursus ultrices magna odio eu neque.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:subject>Vegetation-Cropland</dc:subject>
+      <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:subject>Hydrography-Oceanographic</dc:subject>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <dc:subject>Physiography</dc:subject>
+      <dc:relation>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:relation>
+      <dct:abstract>Suspendisse accumsan molestie lorem. Nullam velit turpis, mattis ut, varius bibendum, laoreet non, quam.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+      <dc:title>Fuscé vitae ligulä</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:subject>Land titles</dc:subject>
+      <dc:format>text/rtf</dc:format>
+      <dct:abstract>Morbi ultriçes, dui suscipit vestibulum prètium, velit ante pretium tortor, egët tincidunt pede odio ac nulla.</dct:abstract>
+    </csw:SummaryRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_ba9b0107-dcee-46ef-823a-a2e25a911a96.xml b/tests/expected/suites_cite_post_ba9b0107-dcee-46ef-823a-a2e25a911a96.xml
new file mode 100644
index 0000000..0b769a8
--- /dev/null
+++ b/tests/expected/suites_cite_post_ba9b0107-dcee-46ef-823a-a2e25a911a96.xml
@@ -0,0 +1,36 @@
+<?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="4" numberOfRecordsReturned="4" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="summary">
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:subject>Tourism--Greece</dc:subject>
+      <dc:format>image/svg+xml</dc:format>
+      <dct:abstract>Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:subject>Marine sediments</dc:subject>
+      <dc:format>application/xhtml+xml</dc:format>
+      <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:format>image/jp2</dc:format>
+      <dc:relation>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:relation>
+    </csw:SummaryRecord>
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:format>image/jpeg</dc:format>
+    </csw:SummaryRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_bb66ebc5-7121-48b5-9f53-b56537d9561b.xml b/tests/expected/suites_cite_post_bb66ebc5-7121-48b5-9f53-b56537d9561b.xml
new file mode 100644
index 0000000..01e95f5
--- /dev/null
+++ b/tests/expected/suites_cite_post_bb66ebc5-7121-48b5-9f53-b56537d9561b.xml
@@ -0,0 +1,19 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_c02d1c85-df9f-45ee-bea7-345c35e02a98.xml b/tests/expected/suites_cite_post_c02d1c85-df9f-45ee-bea7-345c35e02a98.xml
new file mode 100644
index 0000000..da4f933
--- /dev/null
+++ b/tests/expected/suites_cite_post_c02d1c85-df9f-45ee-bea7-345c35e02a98.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="service">
+    <ows:ExceptionText>Invalid Constraint: Invalid Filter request: 'NoneType' object has no attribute 'text'</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_post_c311a342-72e3-4983-be39-868e6ed9740f.xml b/tests/expected/suites_cite_post_c311a342-72e3-4983-be39-868e6ed9740f.xml
new file mode 100644
index 0000000..7ee77c7
--- /dev/null
+++ b/tests/expected/suites_cite_post_c311a342-72e3-4983-be39-868e6ed9740f.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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/ [...]
+  <csw:SchemaComponent schemaLanguage="XMLSCHEMA" targetNamespace="http://www.opengis.net/cat/csw/2.0.2">
+    <xs:schema id="csw-record" targetNamespace="http://www.opengis.net/cat/csw/2.0.2" elementFormDefault="qualified" version="2.0.2 2010-01-22">
+   <xs:annotation>
+      <xs:appinfo>
+         <dc:identifier>http://schemas.opengis.net/csw/2.0.2/record.xsd</dc:identifier>
+      </xs:appinfo>
+      <xs:documentation xml:lang="en">
+         This schema defines the basic record types that must be supported
+         by all CSW implementations. These correspond to full, summary, and
+         brief views based on DCMI metadata terms.
+         
+         CSW is an OGC Standard.
+         Copyright (c) 2004,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+         To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </xs:documentation>
+   </xs:annotation>
+
+   <xs:import namespace="http://purl.org/dc/terms/" schemaLocation="rec-dcterms.xsd"/>
+   <xs:import namespace="http://purl.org/dc/elements/1.1/" schemaLocation="rec-dcmes.xsd"/>
+   <xs:import namespace="http://www.opengis.net/ows" schemaLocation="../../ows/1.0.0/owsAll.xsd"/>
+
+   <xs:element name="AbstractRecord" id="AbstractRecord" type="csw:AbstractRecordType" abstract="true"/>
+   <xs:complexType name="AbstractRecordType" id="AbstractRecordType" abstract="true"/>
+
+   <xs:element name="DCMIRecord" type="csw:DCMIRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="DCMIRecordType">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type encapsulates all of the standard DCMI metadata terms,
+            including the Dublin Core refinements; these terms may be mapped
+            to the profile-specific information model.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:group ref="dct:DCMI-terms"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="BriefRecord" type="csw:BriefRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="BriefRecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type defines a brief representation of the common record
+            format.  It extends AbstractRecordType to include only the
+             dc:identifier and dc:type properties.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:element ref="dc:identifier" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:title" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:type" minOccurs="0"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="SummaryRecord" type="csw:SummaryRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="SummaryRecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type defines a summary representation of the common record
+            format.  It extends AbstractRecordType to include the core
+            properties.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:element ref="dc:identifier" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:title" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:type" minOccurs="0"/>
+               <xs:element ref="dc:subject" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dc:format" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dc:relation" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:modified" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:abstract" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:spatial" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="Record" type="csw:RecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="RecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type extends DCMIRecordType to add ows:BoundingBox;
+            it may be used to specify a spatial envelope for the
+            catalogued resource.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:DCMIRecordType">
+            <xs:sequence>
+               <xs:element name="AnyText" type="csw:EmptyType" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+   <xs:complexType name="EmptyType"/>
+</xs:schema>
+  </csw:SchemaComponent>
+</csw:DescribeRecordResponse>
diff --git a/tests/expected/suites_cite_post_c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml b/tests/expected/suites_cite_post_c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml
new file mode 100644
index 0000000..63e128a
--- /dev/null
+++ b/tests/expected/suites_cite_post_c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml
@@ -0,0 +1,27 @@
+<?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="3" numberOfRecordsReturned="3" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:date>2006-05-12Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:date>2006-03-26Z</dc:date>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:date>2005-10-24Z</dc:date>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_c8588f47-8e65-45f5-ad34-ff4524cad84d.xml b/tests/expected/suites_cite_post_c8588f47-8e65-45f5-ad34-ff4524cad84d.xml
new file mode 100644
index 0000000..8f3d3dc
--- /dev/null
+++ b/tests/expected/suites_cite_post_c8588f47-8e65-45f5-ad34-ff4524cad84d.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="service">
+    <ows:ExceptionText>Invalid Constraint: Invalid Filter request: Invalid ogc:PropertyName in spatial filter: dct:spatial</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_post_da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml b/tests/expected/suites_cite_post_da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml
new file mode 100644
index 0000000..d68fd69
--- /dev/null
+++ b/tests/expected/suites_cite_post_da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="service">
+    <ows:ExceptionText>Invalid Constraint: Invalid Filter request: Invalid PropertyName: /dc:title.  '/dc:title'</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_cite_post_dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml b/tests/expected/suites_cite_post_dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml
new file mode 100644
index 0000000..1e08613
--- /dev/null
+++ b/tests/expected/suites_cite_post_dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml
@@ -0,0 +1,22 @@
+<?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="3" numberOfRecordsReturned="3" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+      <dc:date>2003-05-09Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2005-10-24Z</dc:date>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <dc:date>2006-03-26Z</dc:date>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml b/tests/expected/suites_cite_post_dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml
new file mode 100644
index 0000000..431b0a3
--- /dev/null
+++ b/tests/expected/suites_cite_post_dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml
@@ -0,0 +1,69 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>60.04 13.75</ows:LowerCorner>
+        <ows:UpperCorner>68.41 17.92</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_e308f030-c097-4036-a838-44bad74c9ef7.xml b/tests/expected/suites_cite_post_e308f030-c097-4036-a838-44bad74c9ef7.xml
new file mode 100644
index 0000000..431b0a3
--- /dev/null
+++ b/tests/expected/suites_cite_post_e308f030-c097-4036-a838-44bad74c9ef7.xml
@@ -0,0 +1,69 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>60.04 13.75</ows:LowerCorner>
+        <ows:UpperCorner>68.41 17.92</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml b/tests/expected/suites_cite_post_e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml
new file mode 100644
index 0000000..431b0a3
--- /dev/null
+++ b/tests/expected/suites_cite_post_e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml
@@ -0,0 +1,69 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>60.04 13.75</ows:LowerCorner>
+        <ows:UpperCorner>68.41 17.92</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_f7976c55-a156-4421-8199-bc0487da4b0f.xml b/tests/expected/suites_cite_post_f7976c55-a156-4421-8199-bc0487da4b0f.xml
new file mode 100644
index 0000000..7ee77c7
--- /dev/null
+++ b/tests/expected/suites_cite_post_f7976c55-a156-4421-8199-bc0487da4b0f.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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/ [...]
+  <csw:SchemaComponent schemaLanguage="XMLSCHEMA" targetNamespace="http://www.opengis.net/cat/csw/2.0.2">
+    <xs:schema id="csw-record" targetNamespace="http://www.opengis.net/cat/csw/2.0.2" elementFormDefault="qualified" version="2.0.2 2010-01-22">
+   <xs:annotation>
+      <xs:appinfo>
+         <dc:identifier>http://schemas.opengis.net/csw/2.0.2/record.xsd</dc:identifier>
+      </xs:appinfo>
+      <xs:documentation xml:lang="en">
+         This schema defines the basic record types that must be supported
+         by all CSW implementations. These correspond to full, summary, and
+         brief views based on DCMI metadata terms.
+         
+         CSW is an OGC Standard.
+         Copyright (c) 2004,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+         To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </xs:documentation>
+   </xs:annotation>
+
+   <xs:import namespace="http://purl.org/dc/terms/" schemaLocation="rec-dcterms.xsd"/>
+   <xs:import namespace="http://purl.org/dc/elements/1.1/" schemaLocation="rec-dcmes.xsd"/>
+   <xs:import namespace="http://www.opengis.net/ows" schemaLocation="../../ows/1.0.0/owsAll.xsd"/>
+
+   <xs:element name="AbstractRecord" id="AbstractRecord" type="csw:AbstractRecordType" abstract="true"/>
+   <xs:complexType name="AbstractRecordType" id="AbstractRecordType" abstract="true"/>
+
+   <xs:element name="DCMIRecord" type="csw:DCMIRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="DCMIRecordType">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type encapsulates all of the standard DCMI metadata terms,
+            including the Dublin Core refinements; these terms may be mapped
+            to the profile-specific information model.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:group ref="dct:DCMI-terms"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="BriefRecord" type="csw:BriefRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="BriefRecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type defines a brief representation of the common record
+            format.  It extends AbstractRecordType to include only the
+             dc:identifier and dc:type properties.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:element ref="dc:identifier" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:title" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:type" minOccurs="0"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="SummaryRecord" type="csw:SummaryRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="SummaryRecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type defines a summary representation of the common record
+            format.  It extends AbstractRecordType to include the core
+            properties.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:element ref="dc:identifier" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:title" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:type" minOccurs="0"/>
+               <xs:element ref="dc:subject" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dc:format" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dc:relation" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:modified" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:abstract" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:spatial" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="Record" type="csw:RecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="RecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type extends DCMIRecordType to add ows:BoundingBox;
+            it may be used to specify a spatial envelope for the
+            catalogued resource.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:DCMIRecordType">
+            <xs:sequence>
+               <xs:element name="AnyText" type="csw:EmptyType" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+   <xs:complexType name="EmptyType"/>
+</xs:schema>
+  </csw:SchemaComponent>
+</csw:DescribeRecordResponse>
diff --git a/tests/expected/suites_cite_post_f7d79701-f10b-4087-a33c-f62df0a04fd1.xml b/tests/expected/suites_cite_post_f7d79701-f10b-4087-a33c-f62df0a04fd1.xml
new file mode 100644
index 0000000..431b0a3
--- /dev/null
+++ b/tests/expected/suites_cite_post_f7d79701-f10b-4087-a33c-f62df0a04fd1.xml
@@ -0,0 +1,69 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>60.04 13.75</ows:LowerCorner>
+        <ows:UpperCorner>68.41 17.92</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+      <dc:title>Vestibulum massa purus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml b/tests/expected/suites_cite_post_fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml
new file mode 100644
index 0000000..646e7bc
--- /dev/null
+++ b/tests/expected/suites_cite_post_fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml
@@ -0,0 +1,12 @@
+<?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="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+      <dc:title>Fuscé vitae ligulä</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_cite_post_fe20960f-a26c-4f13-852d-470a0d3233f9.xml b/tests/expected/suites_cite_post_fe20960f-a26c-4f13-852d-470a0d3233f9.xml
new file mode 100644
index 0000000..1abe27d
--- /dev/null
+++ b/tests/expected/suites_cite_post_fe20960f-a26c-4f13-852d-470a0d3233f9.xml
@@ -0,0 +1,12 @@
+<?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="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_get_GetCapabilities-invalid-request.xml b/tests/expected/suites_default_get_GetCapabilities-invalid-request.xml
new file mode 100644
index 0000000..57576eb
--- /dev/null
+++ b/tests/expected/suites_default_get_GetCapabilities-invalid-request.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="request">
+    <ows:ExceptionText>Invalid value for request: GetCapabilitiese</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_get_GetCapabilities.xml b/tests/expected/suites_default_get_GetCapabilities.xml
new file mode 100644
index 0000000..868be74
--- /dev/null
+++ b/tests/expected/suites_default_get_GetCapabilities.xml
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://demo.pycsw.org/gisdata/csw</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_default_get_GetRecords-all.xml b/tests/expected/suites_default_get_GetRecords-all.xml
new file mode 100644
index 0000000..41e198c
--- /dev/null
+++ b/tests/expected/suites_default_get_GetRecords-all.xml
@@ -0,0 +1,6 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full"/>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_get_GetRecords-sortby-asc.xml b/tests/expected/suites_default_get_GetRecords-sortby-asc.xml
new file mode 100644
index 0000000..2239e9b
--- /dev/null
+++ b/tests/expected/suites_default_get_GetRecords-sortby-asc.xml
@@ -0,0 +1,91 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+    <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dct:abstract>Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.</dct:abstract>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>60.042 13.754</ows:LowerCorner>
+      <ows:UpperCorner>68.410 17.920</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography-Landforms</dc:subject>
+    <dct:spatial>FI-ES</dct:spatial>
+    <dct:abstract>Donec scelerisque pede ut nisl luctus accumsan. Quisque ultrices, lorem eget feugiat fringilla, lorem dui porttitor ante, cursus ultrices magna odio eu neque.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography</dc:subject>
+    <dct:abstract>Suspendisse accumsan molestie lorem. Nullam velit turpis, mattis ut, varius bibendum, laoreet non, quam.</dct:abstract>
+    <dc:relation>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:relation>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+    <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:subject>Hydrography--Dictionaries</dc:subject>
+    <dc:format>application/pdf</dc:format>
+    <dc:date>2006-05-12Z</dc:date>
+    <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:title>Fuscé vitae ligulä</dc:title>
+    <dc:date>2003-05-09Z</dc:date>
+    <dc:subject>Land titles</dc:subject>
+    <dc:format>text/rtf</dc:format>
+    <dct:abstract>Morbi ultriçes, dui suscipit vestibulum prètium, velit ante pretium tortor, egët tincidunt pede odio ac nulla.</dct:abstract>
+</csw:Record>
+    <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:Record>
+    <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:title>Lorem ipsum dolor sit amet</dc:title>
+    <dc:format>image/jpeg</dc:format>
+    <dct:spatial>IT-FI</dct:spatial>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+    <dc:title>Maecenas enim</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:format>application/xhtml+xml</dc:format>
+    <dc:subject>Marine sediments</dc:subject>
+    <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <dc:date>2006-03-26Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>47.595 -4.097</ows:LowerCorner>
+      <ows:UpperCorner>51.217 0.889</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:title>Ut facilisis justo ut lacus</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation</dc:subject>
+    <dc:relation>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:relation>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_get_GetRecords-sortby-desc.xml b/tests/expected/suites_default_get_GetRecords-sortby-desc.xml
new file mode 100644
index 0000000..14b8267
--- /dev/null
+++ b/tests/expected/suites_default_get_GetRecords-sortby-desc.xml
@@ -0,0 +1,93 @@
+<?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="11" numberOfRecordsMatched="12" numberOfRecordsReturned="10" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+    <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Ñunç elementum</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Hydrography-Oceanographic</dc:subject>
+    <dc:date>2005-10-24Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>44.792 -6.171</ows:LowerCorner>
+      <ows:UpperCorner>51.126 -2.228</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:format>image/jp2</dc:format>
+    <dc:title>Vestibulum massa purus</dc:title>
+    <dc:relation>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:relation>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:title>Ut facilisis justo ut lacus</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation</dc:subject>
+    <dc:relation>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:relation>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <dc:date>2006-03-26Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>47.595 -4.097</ows:LowerCorner>
+      <ows:UpperCorner>51.217 0.889</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+    <dc:title>Maecenas enim</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:format>application/xhtml+xml</dc:format>
+    <dc:subject>Marine sediments</dc:subject>
+    <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:title>Lorem ipsum dolor sit amet</dc:title>
+    <dc:format>image/jpeg</dc:format>
+    <dct:spatial>IT-FI</dct:spatial>
+</csw:Record>
+    <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:Record>
+    <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:title>Fuscé vitae ligulä</dc:title>
+    <dc:date>2003-05-09Z</dc:date>
+    <dc:subject>Land titles</dc:subject>
+    <dc:format>text/rtf</dc:format>
+    <dct:abstract>Morbi ultriçes, dui suscipit vestibulum prètium, velit ante pretium tortor, egët tincidunt pede odio ac nulla.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+    <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:subject>Hydrography--Dictionaries</dc:subject>
+    <dc:format>application/pdf</dc:format>
+    <dc:date>2006-05-12Z</dc:date>
+    <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography</dc:subject>
+    <dct:abstract>Suspendisse accumsan molestie lorem. Nullam velit turpis, mattis ut, varius bibendum, laoreet non, quam.</dct:abstract>
+    <dc:relation>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:relation>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_get_GetRecords-sortby-invalid-order.xml b/tests/expected/suites_default_get_GetRecords-sortby-invalid-order.xml
new file mode 100644
index 0000000..f03af88
--- /dev/null
+++ b/tests/expected/suites_default_get_GetRecords-sortby-invalid-order.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="sortby">
+    <ows:ExceptionText>Invalid SortBy value: sort order must be "A" or "D"</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_get_GetRecords-sortby-invalid-propertyname.xml b/tests/expected/suites_default_get_GetRecords-sortby-invalid-propertyname.xml
new file mode 100644
index 0000000..d289193
--- /dev/null
+++ b/tests/expected/suites_default_get_GetRecords-sortby-invalid-propertyname.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="sortby">
+    <ows:ExceptionText>Invalid SortBy propertyname: dc:titlei</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_DescribeRecord-json.xml b/tests/expected/suites_default_post_DescribeRecord-json.xml
new file mode 100644
index 0000000..753cad5
--- /dev/null
+++ b/tests/expected/suites_default_post_DescribeRecord-json.xml
@@ -0,0 +1,408 @@
+{
+    "attributes": {
+        "xsi:schemaLocation": "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd"
+    }, 
+    "tag": "csw:DescribeRecordResponse", 
+    "children": [
+        {
+            "attributes": {
+                "schemaLanguage": "XMLSCHEMA", 
+                "targetNamespace": "http://www.opengis.net/cat/csw/2.0.2"
+            }, 
+            "tag": "csw:SchemaComponent", 
+            "children": [
+                {
+                    "attributes": {
+                        "version": "2.0.2 2010-01-22", 
+                        "targetNamespace": "http://www.opengis.net/cat/csw/2.0.2", 
+                        "id": "csw-record", 
+                        "elementFormDefault": "qualified"
+                    }, 
+                    "tag": "xs:schema", 
+                    "children": [
+                        {
+                            "tag": "xs:annotation", 
+                            "children": [
+                                {
+                                    "tag": "xs:appinfo", 
+                                    "children": [
+                                        {
+                                            "text": "http://schemas.opengis.net/csw/2.0.2/record.xsd", 
+                                            "tag": "dc:identifier"
+                                        }
+                                    ]
+                                }, 
+                                {
+                                    "attributes": {
+                                        "lang": "en"
+                                    }, 
+                                    "tag": "xs:documentation"
+                                }
+                            ]
+                        }, 
+                        {
+                            "attributes": {
+                                "schemaLocation": "rec-dcterms.xsd", 
+                                "namespace": "http://purl.org/dc/terms/"
+                            }, 
+                            "tag": "xs:import"
+                        }, 
+                        {
+                            "attributes": {
+                                "schemaLocation": "rec-dcmes.xsd", 
+                                "namespace": "http://purl.org/dc/elements/1.1/"
+                            }, 
+                            "tag": "xs:import"
+                        }, 
+                        {
+                            "attributes": {
+                                "schemaLocation": "../../ows/1.0.0/owsAll.xsd", 
+                                "namespace": "http://www.opengis.net/ows"
+                            }, 
+                            "tag": "xs:import"
+                        }, 
+                        {
+                            "attributes": {
+                                "abstract": "true", 
+                                "type": "csw:AbstractRecordType", 
+                                "name": "AbstractRecord", 
+                                "id": "AbstractRecord"
+                            }, 
+                            "tag": "xs:element"
+                        }, 
+                        {
+                            "attributes": {
+                                "abstract": "true", 
+                                "name": "AbstractRecordType", 
+                                "id": "AbstractRecordType"
+                            }, 
+                            "tag": "xs:complexType"
+                        }, 
+                        {
+                            "attributes": {
+                                "substitutionGroup": "csw:AbstractRecord", 
+                                "type": "csw:DCMIRecordType", 
+                                "name": "DCMIRecord"
+                            }, 
+                            "tag": "xs:element"
+                        }, 
+                        {
+                            "attributes": {
+                                "name": "DCMIRecordType"
+                            }, 
+                            "tag": "xs:complexType", 
+                            "children": [
+                                {
+                                    "tag": "xs:annotation", 
+                                    "children": [
+                                        {
+                                            "attributes": {
+                                                "lang": "en"
+                                            }, 
+                                            "tag": "xs:documentation"
+                                        }
+                                    ]
+                                }, 
+                                {
+                                    "tag": "xs:complexContent", 
+                                    "children": [
+                                        {
+                                            "attributes": {
+                                                "base": "csw:AbstractRecordType"
+                                            }, 
+                                            "tag": "xs:extension", 
+                                            "children": [
+                                                {
+                                                    "tag": "xs:sequence", 
+                                                    "children": [
+                                                        {
+                                                            "attributes": {
+                                                                "ref": "dct:DCMI-terms"
+                                                            }, 
+                                                            "tag": "xs:group"
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }, 
+                        {
+                            "attributes": {
+                                "substitutionGroup": "csw:AbstractRecord", 
+                                "type": "csw:BriefRecordType", 
+                                "name": "BriefRecord"
+                            }, 
+                            "tag": "xs:element"
+                        }, 
+                        {
+                            "attributes": {
+                                "name": "BriefRecordType", 
+                                "final": "#all"
+                            }, 
+                            "tag": "xs:complexType", 
+                            "children": [
+                                {
+                                    "tag": "xs:annotation", 
+                                    "children": [
+                                        {
+                                            "attributes": {
+                                                "lang": "en"
+                                            }, 
+                                            "tag": "xs:documentation"
+                                        }
+                                    ]
+                                }, 
+                                {
+                                    "tag": "xs:complexContent", 
+                                    "children": [
+                                        {
+                                            "attributes": {
+                                                "base": "csw:AbstractRecordType"
+                                            }, 
+                                            "tag": "xs:extension", 
+                                            "children": [
+                                                {
+                                                    "tag": "xs:sequence", 
+                                                    "children": [
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dc:identifier", 
+                                                                "minOccurs": "1"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dc:title", 
+                                                                "minOccurs": "1"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "ref": "dc:type", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "ows:BoundingBox", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }, 
+                        {
+                            "attributes": {
+                                "substitutionGroup": "csw:AbstractRecord", 
+                                "type": "csw:SummaryRecordType", 
+                                "name": "SummaryRecord"
+                            }, 
+                            "tag": "xs:element"
+                        }, 
+                        {
+                            "attributes": {
+                                "name": "SummaryRecordType", 
+                                "final": "#all"
+                            }, 
+                            "tag": "xs:complexType", 
+                            "children": [
+                                {
+                                    "tag": "xs:annotation", 
+                                    "children": [
+                                        {
+                                            "attributes": {
+                                                "lang": "en"
+                                            }, 
+                                            "tag": "xs:documentation"
+                                        }
+                                    ]
+                                }, 
+                                {
+                                    "tag": "xs:complexContent", 
+                                    "children": [
+                                        {
+                                            "attributes": {
+                                                "base": "csw:AbstractRecordType"
+                                            }, 
+                                            "tag": "xs:extension", 
+                                            "children": [
+                                                {
+                                                    "tag": "xs:sequence", 
+                                                    "children": [
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dc:identifier", 
+                                                                "minOccurs": "1"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dc:title", 
+                                                                "minOccurs": "1"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "ref": "dc:type", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dc:subject", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dc:format", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dc:relation", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dct:modified", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dct:abstract", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "dct:spatial", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "ows:BoundingBox", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }, 
+                        {
+                            "attributes": {
+                                "substitutionGroup": "csw:AbstractRecord", 
+                                "type": "csw:RecordType", 
+                                "name": "Record"
+                            }, 
+                            "tag": "xs:element"
+                        }, 
+                        {
+                            "attributes": {
+                                "name": "RecordType", 
+                                "final": "#all"
+                            }, 
+                            "tag": "xs:complexType", 
+                            "children": [
+                                {
+                                    "tag": "xs:annotation", 
+                                    "children": [
+                                        {
+                                            "attributes": {
+                                                "lang": "en"
+                                            }, 
+                                            "tag": "xs:documentation"
+                                        }
+                                    ]
+                                }, 
+                                {
+                                    "tag": "xs:complexContent", 
+                                    "children": [
+                                        {
+                                            "attributes": {
+                                                "base": "csw:DCMIRecordType"
+                                            }, 
+                                            "tag": "xs:extension", 
+                                            "children": [
+                                                {
+                                                    "tag": "xs:sequence", 
+                                                    "children": [
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "type": "csw:EmptyType", 
+                                                                "name": "AnyText", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }, 
+                                                        {
+                                                            "attributes": {
+                                                                "maxOccurs": "unbounded", 
+                                                                "ref": "ows:BoundingBox", 
+                                                                "minOccurs": "0"
+                                                            }, 
+                                                            "tag": "xs:element"
+                                                        }
+                                                    ]
+                                                }
+                                            ]
+                                        }
+                                    ]
+                                }
+                            ]
+                        }, 
+                        {
+                            "attributes": {
+                                "name": "EmptyType"
+                            }, 
+                            "tag": "xs:complexType"
+                        }
+                    ]
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/tests/expected/suites_default_post_DescribeRecord.xml b/tests/expected/suites_default_post_DescribeRecord.xml
new file mode 100644
index 0000000..7ee77c7
--- /dev/null
+++ b/tests/expected/suites_default_post_DescribeRecord.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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/ [...]
+  <csw:SchemaComponent schemaLanguage="XMLSCHEMA" targetNamespace="http://www.opengis.net/cat/csw/2.0.2">
+    <xs:schema id="csw-record" targetNamespace="http://www.opengis.net/cat/csw/2.0.2" elementFormDefault="qualified" version="2.0.2 2010-01-22">
+   <xs:annotation>
+      <xs:appinfo>
+         <dc:identifier>http://schemas.opengis.net/csw/2.0.2/record.xsd</dc:identifier>
+      </xs:appinfo>
+      <xs:documentation xml:lang="en">
+         This schema defines the basic record types that must be supported
+         by all CSW implementations. These correspond to full, summary, and
+         brief views based on DCMI metadata terms.
+         
+         CSW is an OGC Standard.
+         Copyright (c) 2004,2010 Open Geospatial Consortium, Inc. All Rights Reserved.
+         To obtain additional rights of use, visit http://www.opengeospatial.org/legal/ .
+      </xs:documentation>
+   </xs:annotation>
+
+   <xs:import namespace="http://purl.org/dc/terms/" schemaLocation="rec-dcterms.xsd"/>
+   <xs:import namespace="http://purl.org/dc/elements/1.1/" schemaLocation="rec-dcmes.xsd"/>
+   <xs:import namespace="http://www.opengis.net/ows" schemaLocation="../../ows/1.0.0/owsAll.xsd"/>
+
+   <xs:element name="AbstractRecord" id="AbstractRecord" type="csw:AbstractRecordType" abstract="true"/>
+   <xs:complexType name="AbstractRecordType" id="AbstractRecordType" abstract="true"/>
+
+   <xs:element name="DCMIRecord" type="csw:DCMIRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="DCMIRecordType">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type encapsulates all of the standard DCMI metadata terms,
+            including the Dublin Core refinements; these terms may be mapped
+            to the profile-specific information model.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:group ref="dct:DCMI-terms"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="BriefRecord" type="csw:BriefRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="BriefRecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type defines a brief representation of the common record
+            format.  It extends AbstractRecordType to include only the
+             dc:identifier and dc:type properties.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:element ref="dc:identifier" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:title" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:type" minOccurs="0"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="SummaryRecord" type="csw:SummaryRecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="SummaryRecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type defines a summary representation of the common record
+            format.  It extends AbstractRecordType to include the core
+            properties.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:AbstractRecordType">
+            <xs:sequence>
+               <xs:element ref="dc:identifier" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:title" minOccurs="1" maxOccurs="unbounded"/>
+               <xs:element ref="dc:type" minOccurs="0"/>
+               <xs:element ref="dc:subject" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dc:format" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dc:relation" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:modified" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:abstract" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="dct:spatial" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+
+   <xs:element name="Record" type="csw:RecordType" substitutionGroup="csw:AbstractRecord"/>
+   <xs:complexType name="RecordType" final="#all">
+      <xs:annotation>
+         <xs:documentation xml:lang="en">
+            This type extends DCMIRecordType to add ows:BoundingBox;
+            it may be used to specify a spatial envelope for the
+            catalogued resource.
+         </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+         <xs:extension base="csw:DCMIRecordType">
+            <xs:sequence>
+               <xs:element name="AnyText" type="csw:EmptyType" minOccurs="0" maxOccurs="unbounded"/>
+               <xs:element ref="ows:BoundingBox" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+         </xs:extension>
+      </xs:complexContent>
+   </xs:complexType>
+   <xs:complexType name="EmptyType"/>
+</xs:schema>
+  </csw:SchemaComponent>
+</csw:DescribeRecordResponse>
diff --git a/tests/expected/suites_default_post_Exception-GetRecords-badsrsname.xml b/tests/expected/suites_default_post_Exception-GetRecords-badsrsname.xml
new file mode 100644
index 0000000..3829071
--- /dev/null
+++ b/tests/expected/suites_default_post_Exception-GetRecords-badsrsname.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="service">
+    <ows:ExceptionText>Invalid Constraint: Invalid Filter request: Reprojection error: Invalid srsName "EPSG:226": Invalid source projection</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_Exception-GetRecords-elementname.xml b/tests/expected/suites_default_post_Exception-GetRecords-elementname.xml
new file mode 100644
index 0000000..dfe6ed6
--- /dev/null
+++ b/tests/expected/suites_default_post_Exception-GetRecords-elementname.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="elementname">
+    <ows:ExceptionText>Invalid ElementName parameter value: dc:foo</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_Exception-GetRecords-invalid-xml.xml b/tests/expected/suites_default_post_Exception-GetRecords-invalid-xml.xml
new file mode 100644
index 0000000..662c29e
--- /dev/null
+++ b/tests/expected/suites_default_post_Exception-GetRecords-invalid-xml.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="NoApplicableCode" locator="service">
+    <ows:ExceptionText>Exception: the document is not valid.
+Error: Element '{http://www.opengis.net/cat/csw/2.0.2}ElementNamefoo': This element is not expected. Expected is one of ( {http://www.opengis.net/cat/csw/2.0.2}ElementSetName, {http://www.opengis.net/cat/csw/2.0.2}ElementName ).</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_GetCapabilities-SOAP.xml b/tests/expected/suites_default_post_GetCapabilities-SOAP.xml
new file mode 100644
index 0000000..cafaee5
--- /dev/null
+++ b/tests/expected/suites_default_post_GetCapabilities-SOAP.xml
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<soapenv:Envelope 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/csdgm" xml [...]
+  <soapenv:Body>
+    <csw:Capabilities updateSequence="PYCSW_UPDATESEQUENCE" version="2.0.2" xsi:schemaLocation="http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd">
+      <ows:ServiceIdentification>
+        <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+        <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+        <ows:Keywords>
+          <ows:Keyword>catalogue</ows:Keyword>
+          <ows:Keyword>discovery</ows:Keyword>
+          <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+        </ows:Keywords>
+        <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+        <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+        <ows:Fees>None</ows:Fees>
+        <ows:AccessConstraints>None</ows:AccessConstraints>
+      </ows:ServiceIdentification>
+      <ows:ServiceProvider>
+        <ows:ProviderName>pycsw</ows:ProviderName>
+        <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+        <ows:ServiceContact>
+          <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+          <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+          <ows:ContactInfo>
+            <ows:Phone>
+              <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+              <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+            </ows:Phone>
+            <ows:Address>
+              <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+              <ows:City>Toronto</ows:City>
+              <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+              <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+              <ows:Country>Canada</ows:Country>
+              <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+            </ows:Address>
+            <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+            <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+            <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+          </ows:ContactInfo>
+          <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+        </ows:ServiceContact>
+      </ows:ServiceProvider>
+      <ows:OperationsMetadata>
+        <ows:Operation name="GetCapabilities">
+          <ows:DCP>
+            <ows:HTTP>
+              <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+              <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+            </ows:HTTP>
+          </ows:DCP>
+          <ows:Parameter name="sections">
+            <ows:Value>ServiceIdentification</ows:Value>
+            <ows:Value>ServiceProvider</ows:Value>
+            <ows:Value>OperationsMetadata</ows:Value>
+            <ows:Value>Filter_Capabilities</ows:Value>
+          </ows:Parameter>
+        </ows:Operation>
+        <ows:Operation name="GetRepositoryItem">
+          <ows:DCP>
+            <ows:HTTP>
+              <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+            </ows:HTTP>
+          </ows:DCP>
+        </ows:Operation>
+        <ows:Operation name="DescribeRecord">
+          <ows:DCP>
+            <ows:HTTP>
+              <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+              <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+            </ows:HTTP>
+          </ows:DCP>
+          <ows:Parameter name="schemaLanguage">
+            <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+            <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+          </ows:Parameter>
+          <ows:Parameter name="outputFormat">
+            <ows:Value>application/xml</ows:Value>
+            <ows:Value>application/json</ows:Value>
+          </ows:Parameter>
+          <ows:Parameter name="typeName">
+            <ows:Value>csw:Record</ows:Value>
+          </ows:Parameter>
+        </ows:Operation>
+        <ows:Operation name="GetDomain">
+          <ows:DCP>
+            <ows:HTTP>
+              <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+              <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+            </ows:HTTP>
+          </ows:DCP>
+          <ows:Parameter name="ParameterName">
+            <ows:Value>GetRecords.outputFormat</ows:Value>
+            <ows:Value>GetRecords.outputSchema</ows:Value>
+            <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+            <ows:Value>GetRecords.resultType</ows:Value>
+            <ows:Value>GetRecords.typeNames</ows:Value>
+            <ows:Value>GetRecords.ElementSetName</ows:Value>
+            <ows:Value>GetCapabilities.sections</ows:Value>
+            <ows:Value>GetRecordById.outputFormat</ows:Value>
+            <ows:Value>GetRecordById.outputSchema</ows:Value>
+            <ows:Value>GetRecordById.ElementSetName</ows:Value>
+            <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+            <ows:Value>DescribeRecord.outputFormat</ows:Value>
+            <ows:Value>DescribeRecord.typeName</ows:Value>
+          </ows:Parameter>
+        </ows:Operation>
+        <ows:Operation name="GetRecordById">
+          <ows:DCP>
+            <ows:HTTP>
+              <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+              <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+            </ows:HTTP>
+          </ows:DCP>
+          <ows:Parameter name="outputFormat">
+            <ows:Value>application/xml</ows:Value>
+            <ows:Value>application/json</ows:Value>
+          </ows:Parameter>
+          <ows:Parameter name="outputSchema">
+            <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+            <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+            <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+            <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+          </ows:Parameter>
+          <ows:Parameter name="ElementSetName">
+            <ows:Value>brief</ows:Value>
+            <ows:Value>summary</ows:Value>
+            <ows:Value>full</ows:Value>
+          </ows:Parameter>
+        </ows:Operation>
+        <ows:Operation name="GetRecords">
+          <ows:DCP>
+            <ows:HTTP>
+              <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+              <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+            </ows:HTTP>
+          </ows:DCP>
+          <ows:Parameter name="outputFormat">
+            <ows:Value>application/xml</ows:Value>
+            <ows:Value>application/json</ows:Value>
+          </ows:Parameter>
+          <ows:Parameter name="outputSchema">
+            <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+            <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+            <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+            <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+          </ows:Parameter>
+          <ows:Parameter name="CONSTRAINTLANGUAGE">
+            <ows:Value>FILTER</ows:Value>
+            <ows:Value>CQL_TEXT</ows:Value>
+          </ows:Parameter>
+          <ows:Parameter name="resultType">
+            <ows:Value>hits</ows:Value>
+            <ows:Value>results</ows:Value>
+            <ows:Value>validate</ows:Value>
+          </ows:Parameter>
+          <ows:Parameter name="typeNames">
+            <ows:Value>csw:Record</ows:Value>
+          </ows:Parameter>
+          <ows:Parameter name="ElementSetName">
+            <ows:Value>brief</ows:Value>
+            <ows:Value>summary</ows:Value>
+            <ows:Value>full</ows:Value>
+          </ows:Parameter>
+          <ows:Constraint name="SupportedDublinCoreQueryables">
+            <ows:Value>dc:contributor</ows:Value>
+            <ows:Value>dc:source</ows:Value>
+            <ows:Value>dc:language</ows:Value>
+            <ows:Value>dc:title</ows:Value>
+            <ows:Value>dc:subject</ows:Value>
+            <ows:Value>dc:creator</ows:Value>
+            <ows:Value>dc:type</ows:Value>
+            <ows:Value>ows:BoundingBox</ows:Value>
+            <ows:Value>dct:modified</ows:Value>
+            <ows:Value>dct:abstract</ows:Value>
+            <ows:Value>dc:relation</ows:Value>
+            <ows:Value>dc:date</ows:Value>
+            <ows:Value>dc:identifier</ows:Value>
+            <ows:Value>dc:publisher</ows:Value>
+            <ows:Value>dc:format</ows:Value>
+            <ows:Value>csw:AnyText</ows:Value>
+            <ows:Value>dc:rights</ows:Value>
+          </ows:Constraint>
+        </ows:Operation>
+        <ows:Parameter name="version">
+          <ows:Value>2.0.2</ows:Value>
+        </ows:Parameter>
+        <ows:Parameter name="service">
+          <ows:Value>CSW</ows:Value>
+        </ows:Parameter>
+        <ows:Constraint name="XPathQueryables">
+          <ows:Value>allowed</ows:Value>
+        </ows:Constraint>
+        <ows:Constraint name="PostEncoding">
+          <ows:Value>XML</ows:Value>
+          <ows:Value>SOAP</ows:Value>
+        </ows:Constraint>
+        <ows:Constraint name="FederatedCatalogues">
+          <ows:Value>http://demo.pycsw.org/gisdata/csw</ows:Value>
+        </ows:Constraint>
+      </ows:OperationsMetadata>
+      <ogc:Filter_Capabilities>
+        <ogc:Spatial_Capabilities>
+          <ogc:GeometryOperands>
+            <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+            <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+            <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+            <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+          </ogc:GeometryOperands>
+          <ogc:SpatialOperators>
+            <ogc:SpatialOperator name="BBOX"/>
+            <ogc:SpatialOperator name="Beyond"/>
+            <ogc:SpatialOperator name="Contains"/>
+            <ogc:SpatialOperator name="Crosses"/>
+            <ogc:SpatialOperator name="Disjoint"/>
+            <ogc:SpatialOperator name="DWithin"/>
+            <ogc:SpatialOperator name="Equals"/>
+            <ogc:SpatialOperator name="Intersects"/>
+            <ogc:SpatialOperator name="Overlaps"/>
+            <ogc:SpatialOperator name="Touches"/>
+            <ogc:SpatialOperator name="Within"/>
+          </ogc:SpatialOperators>
+        </ogc:Spatial_Capabilities>
+        <ogc:Scalar_Capabilities>
+          <ogc:LogicalOperators/>
+          <ogc:ComparisonOperators>
+            <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+            <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+            <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+            <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+            <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+            <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+            <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+            <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+            <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+          </ogc:ComparisonOperators>
+          <ogc:ArithmeticOperators>
+            <ogc:Functions>
+              <ogc:FunctionNames>
+                <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+                <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+                <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+                <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+                <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+                <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+              </ogc:FunctionNames>
+            </ogc:Functions>
+          </ogc:ArithmeticOperators>
+        </ogc:Scalar_Capabilities>
+        <ogc:Id_Capabilities>
+          <ogc:EID/>
+          <ogc:FID/>
+        </ogc:Id_Capabilities>
+      </ogc:Filter_Capabilities>
+    </csw:Capabilities>
+  </soapenv:Body>
+</soapenv:Envelope>
diff --git a/tests/expected/suites_default_post_GetCapabilities-sections.xml b/tests/expected/suites_default_post_GetCapabilities-sections.xml
new file mode 100644
index 0000000..85bccd9
--- /dev/null
+++ b/tests/expected/suites_default_post_GetCapabilities-sections.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_default_post_GetCapabilities-updatesequence.xml b/tests/expected/suites_default_post_GetCapabilities-updatesequence.xml
new file mode 100644
index 0000000..868be74
--- /dev/null
+++ b/tests/expected/suites_default_post_GetCapabilities-updatesequence.xml
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://demo.pycsw.org/gisdata/csw</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_default_post_GetCapabilities.xml b/tests/expected/suites_default_post_GetCapabilities.xml
new file mode 100644
index 0000000..868be74
--- /dev/null
+++ b/tests/expected/suites_default_post_GetCapabilities.xml
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://demo.pycsw.org/gisdata/csw</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_default_post_GetDomain-parameter.xml b/tests/expected/suites_default_post_GetDomain-parameter.xml
new file mode 100644
index 0000000..933f802
--- /dev/null
+++ b/tests/expected/suites_default_post_GetDomain-parameter.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetDomainResponse 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/csdgm [...]
+  <csw:DomainValues type="csw:Record">
+    <csw:ParameterName>GetRecords.CONSTRAINTLANGUAGE</csw:ParameterName>
+    <csw:ListOfValues>
+      <csw:Value>FILTER</csw:Value>
+      <csw:Value>CQL_TEXT</csw:Value>
+    </csw:ListOfValues>
+  </csw:DomainValues>
+</csw:GetDomainResponse>
diff --git a/tests/expected/suites_default_post_GetDomain-property.xml b/tests/expected/suites_default_post_GetDomain-property.xml
new file mode 100644
index 0000000..be5e24d
--- /dev/null
+++ b/tests/expected/suites_default_post_GetDomain-property.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetDomainResponse 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/csdgm [...]
+  <csw:DomainValues type="csw:Record">
+    <csw:PropertyName>dc:title</csw:PropertyName>
+    <csw:ListOfValues>
+      <csw:Value>Aliquam fermentum purus quis arcu</csw:Value>
+      <csw:Value>Fuscé vitae ligulä</csw:Value>
+      <csw:Value>Lorem ipsum</csw:Value>
+      <csw:Value>Lorem ipsum dolor sit amet</csw:Value>
+      <csw:Value>Maecenas enim</csw:Value>
+      <csw:Value>Mauris sed neque</csw:Value>
+      <csw:Value>Ut facilisis justo ut lacus</csw:Value>
+      <csw:Value>Vestibulum massa purus</csw:Value>
+      <csw:Value>Ñunç elementum</csw:Value>
+    </csw:ListOfValues>
+  </csw:DomainValues>
+</csw:GetDomainResponse>
diff --git a/tests/expected/suites_default_post_GetRecordById-json.xml b/tests/expected/suites_default_post_GetRecordById-json.xml
new file mode 100644
index 0000000..dcf76f2
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecordById-json.xml
@@ -0,0 +1,50 @@
+{
+    "attributes": {
+        "xsi:schemaLocation": "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd"
+    }, 
+    "tag": "csw:GetRecordByIdResponse", 
+    "children": [
+        {
+            "tag": "csw:SummaryRecord", 
+            "children": [
+                {
+                    "text": "urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63", 
+                    "tag": "dc:identifier"
+                }, 
+                {
+                    "text": "Mauris sed neque", 
+                    "tag": "dc:title"
+                }, 
+                {
+                    "text": "http://purl.org/dc/dcmitype/Dataset", 
+                    "tag": "dc:type"
+                }, 
+                {
+                    "text": "Vegetation-Cropland", 
+                    "tag": "dc:subject"
+                }, 
+                {
+                    "text": "Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.", 
+                    "tag": "dct:abstract"
+                }, 
+                {
+                    "attributes": {
+                        "crs": "urn:x-ogc:def:crs:EPSG:6.11:4326", 
+                        "dimensions": "2"
+                    }, 
+                    "tag": "ows:BoundingBox", 
+                    "children": [
+                        {
+                            "text": "47.59 -4.1", 
+                            "tag": "ows:LowerCorner"
+                        }, 
+                        {
+                            "text": "51.22 0.89", 
+                            "tag": "ows:UpperCorner"
+                        }
+                    ]
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/tests/expected/suites_default_post_GetRecordById.xml b/tests/expected/suites_default_post_GetRecordById.xml
new file mode 100644
index 0000000..2682d35
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecordById.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/c [...]
+  <csw:SummaryRecord>
+    <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:subject>Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+      <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+      <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+    </ows:BoundingBox>
+  </csw:SummaryRecord>
+</csw:GetRecordByIdResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-all-json.xml b/tests/expected/suites_default_post_GetRecords-all-json.xml
new file mode 100644
index 0000000..db4fa92
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-all-json.xml
@@ -0,0 +1,183 @@
+{
+    "attributes": {
+        "version": "2.0.2", 
+        "xsi:schemaLocation": "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd"
+    }, 
+    "tag": "csw:GetRecordsResponse", 
+    "children": [
+        {
+            "attributes": {
+                "timestamp": "PYCSW_TIMESTAMP"
+            }, 
+            "tag": "csw:SearchStatus"
+        }, 
+        {
+            "attributes": {
+                "numberOfRecordsReturned": "5", 
+                "nextRecord": "6", 
+                "numberOfRecordsMatched": "12", 
+                "elementSet": "full", 
+                "recordSchema": "http://www.opengis.net/cat/csw/2.0.2"
+            }, 
+            "tag": "csw:SearchResults", 
+            "children": [
+                {
+                    "tag": "csw:Record", 
+                    "children": [
+                        {
+                            "text": "urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f", 
+                            "tag": "dc:identifier"
+                        }, 
+                        {
+                            "text": "http://purl.org/dc/dcmitype/Image", 
+                            "tag": "dc:type"
+                        }, 
+                        {
+                            "text": "image/svg+xml", 
+                            "tag": "dc:format"
+                        }, 
+                        {
+                            "text": "Lorem ipsum", 
+                            "tag": "dc:title"
+                        }, 
+                        {
+                            "text": "GR-22", 
+                            "tag": "dct:spatial"
+                        }, 
+                        {
+                            "text": "Tourism--Greece", 
+                            "tag": "dc:subject"
+                        }, 
+                        {
+                            "text": "Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.", 
+                            "tag": "dct:abstract"
+                        }
+                    ]
+                }, 
+                {
+                    "tag": "csw:Record", 
+                    "children": [
+                        {
+                            "text": "urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd", 
+                            "tag": "dc:identifier"
+                        }, 
+                        {
+                            "text": "http://purl.org/dc/dcmitype/Service", 
+                            "tag": "dc:type"
+                        }, 
+                        {
+                            "text": "Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.", 
+                            "tag": "dct:abstract"
+                        }, 
+                        {
+                            "attributes": {
+                                "crs": "urn:x-ogc:def:crs:EPSG:6.11:4326"
+                            }, 
+                            "tag": "ows:BoundingBox", 
+                            "children": [
+                                {
+                                    "text": "60.042 13.754", 
+                                    "tag": "ows:LowerCorner"
+                                }, 
+                                {
+                                    "text": "68.410 17.920", 
+                                    "tag": "ows:UpperCorner"
+                                }
+                            ]
+                        }
+                    ]
+                }, 
+                {
+                    "tag": "csw:Record", 
+                    "children": [
+                        {
+                            "text": "urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493", 
+                            "tag": "dc:identifier"
+                        }, 
+                        {
+                            "text": "Maecenas enim", 
+                            "tag": "dc:title"
+                        }, 
+                        {
+                            "text": "http://purl.org/dc/dcmitype/Text", 
+                            "tag": "dc:type"
+                        }, 
+                        {
+                            "text": "application/xhtml+xml", 
+                            "tag": "dc:format"
+                        }, 
+                        {
+                            "text": "Marine sediments", 
+                            "tag": "dc:subject"
+                        }, 
+                        {
+                            "text": "Pellentesque tempus magna non sapien fringilla blandit.", 
+                            "tag": "dct:abstract"
+                        }
+                    ]
+                }, 
+                {
+                    "tag": "csw:Record", 
+                    "children": [
+                        {
+                            "text": "urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4", 
+                            "tag": "dc:identifier"
+                        }, 
+                        {
+                            "text": "http://purl.org/dc/dcmitype/Service", 
+                            "tag": "dc:type"
+                        }, 
+                        {
+                            "text": "Ut facilisis justo ut lacus", 
+                            "tag": "dc:title"
+                        }, 
+                        {
+                            "text": "Vegetation", 
+                            "tag": "dc:subject", 
+                            "attributes": {
+                                "scheme": "http://www.digest.org/2.1"
+                            }
+                        }, 
+                        {
+                            "text": "urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63", 
+                            "tag": "dc:relation"
+                        }
+                    ]
+                }, 
+                {
+                    "tag": "csw:Record", 
+                    "children": [
+                        {
+                            "text": "urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec", 
+                            "tag": "dc:identifier"
+                        }, 
+                        {
+                            "text": "Aliquam fermentum purus quis arcu", 
+                            "tag": "dc:title"
+                        }, 
+                        {
+                            "text": "http://purl.org/dc/dcmitype/Text", 
+                            "tag": "dc:type"
+                        }, 
+                        {
+                            "text": "Hydrography--Dictionaries", 
+                            "tag": "dc:subject"
+                        }, 
+                        {
+                            "text": "application/pdf", 
+                            "tag": "dc:format"
+                        }, 
+                        {
+                            "text": "2006-05-12Z", 
+                            "tag": "dc:date"
+                        }, 
+                        {
+                            "text": "Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.", 
+                            "tag": "dct:abstract"
+                        }
+                    ]
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/tests/expected/suites_default_post_GetRecords-all-resulttype-hits.xml b/tests/expected/suites_default_post_GetRecords-all-resulttype-hits.xml
new file mode 100644
index 0000000..f0533f6
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-all-resulttype-hits.xml
@@ -0,0 +1,6 @@
+<?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="6" numberOfRecordsMatched="12" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full"/>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-all-resulttype-validate.xml b/tests/expected/suites_default_post_GetRecords-all-resulttype-validate.xml
new file mode 100644
index 0000000..4cb7cc8
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-all-resulttype-validate.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Acknowledgement 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/csdgm"  [...]
+  <csw:EchoedRequest>
+    <csw:GetRecords service="CSW" version="2.0.2" resultType="validate" startPosition="1" maxRecords="5" outputFormat="application/xml" outputSchema="http://www.opengis.net/cat/csw/2.0.2" xsi:schemaLocation="http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
+  </csw:EchoedRequest>
+</csw:Acknowledgement>
diff --git a/tests/expected/suites_default_post_GetRecords-all-sortby-bbox.xml b/tests/expected/suites_default_post_GetRecords-all-sortby-bbox.xml
new file mode 100644
index 0000000..5337e97
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-all-sortby-bbox.xml
@@ -0,0 +1,56 @@
+<?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="6" numberOfRecordsMatched="12" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+    <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dct:abstract>Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.</dct:abstract>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>60.042 13.754</ows:LowerCorner>
+      <ows:UpperCorner>68.410 17.920</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Ñunç elementum</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Hydrography-Oceanographic</dc:subject>
+    <dc:date>2005-10-24Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>44.792 -6.171</ows:LowerCorner>
+      <ows:UpperCorner>51.126 -2.228</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <dc:date>2006-03-26Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>47.595 -4.097</ows:LowerCorner>
+      <ows:UpperCorner>51.217 0.889</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <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:Record>
+    <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+    <dc:title>Maecenas enim</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:format>application/xhtml+xml</dc:format>
+    <dc:subject>Marine sediments</dc:subject>
+    <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-all.xml b/tests/expected/suites_default_post_GetRecords-all.xml
new file mode 100644
index 0000000..0e44641
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-all.xml
@@ -0,0 +1,49 @@
+<?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="6" numberOfRecordsMatched="12" numberOfRecordsReturned="5" 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:Record>
+    <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dct:abstract>Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.</dct:abstract>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>60.042 13.754</ows:LowerCorner>
+      <ows:UpperCorner>68.410 17.920</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+    <dc:title>Maecenas enim</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:format>application/xhtml+xml</dc:format>
+    <dc:subject>Marine sediments</dc:subject>
+    <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:title>Ut facilisis justo ut lacus</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation</dc:subject>
+    <dc:relation>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:relation>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+    <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:subject>Hydrography--Dictionaries</dc:subject>
+    <dc:format>application/pdf</dc:format>
+    <dc:date>2006-05-12Z</dc:date>
+    <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-cql-title.xml b/tests/expected/suites_default_post_GetRecords-cql-title.xml
new file mode 100644
index 0000000..a9585ef
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-cql-title.xml
@@ -0,0 +1,17 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-distributedsearch.xml b/tests/expected/suites_default_post_GetRecords-distributedsearch.xml
new file mode 100644
index 0000000..856274d
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-distributedsearch.xml
@@ -0,0 +1,17 @@
+<?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="brief">
+    <!-- 1 result from http://demo.pycsw.org/gisdata/csw -->
+    <csw:BriefRecord xmlns:inspire_common="http://inspire.ec.europa.eu/schemas/common/1.0" xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:srv="http://www.isotc211.org/2005/srv" xmlns:inspire_ds="http://inspire.ec.europa.eu/schemas/inspire_ds/1.0" xmlns:wrs="http://www.opengis.net/cat/wrs/1.0">
+      <dc:identifier>urn:uuid:b0a1c48a-f765-11e1-bf69-aa0000ae6bfc</dc:identifier>
+      <dc:title>Aquifers</dc:title>
+      <dc:type>vector digital data</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>32.55 -117.6</ows:LowerCorner>
+        <ows:UpperCorner>33.51 -116.08</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-elementname.xml b/tests/expected/suites_default_post_GetRecords-elementname.xml
new file mode 100644
index 0000000..4c52475
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-elementname.xml
@@ -0,0 +1,20 @@
+<?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="6" numberOfRecordsMatched="12" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2">
+    <csw:Record>
+      <dc:title>Lorem ipsum</dc:title>
+    </csw:Record>
+    <csw:Record/>
+    <csw:Record>
+      <dc:title>Maecenas enim</dc:title>
+    </csw:Record>
+    <csw:Record>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+    </csw:Record>
+    <csw:Record>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-end.xml b/tests/expected/suites_default_post_GetRecords-end.xml
new file mode 100644
index 0000000..f7311c1
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-end.xml
@@ -0,0 +1,30 @@
+<?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="12" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+    <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:title>Lorem ipsum dolor sit amet</dc:title>
+    <dc:format>image/jpeg</dc:format>
+    <dct:spatial>IT-FI</dct:spatial>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography</dc:subject>
+    <dct:abstract>Suspendisse accumsan molestie lorem. Nullam velit turpis, mattis ut, varius bibendum, laoreet non, quam.</dct:abstract>
+    <dc:relation>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:relation>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:title>Fuscé vitae ligulä</dc:title>
+    <dc:date>2003-05-09Z</dc:date>
+    <dc:subject>Land titles</dc:subject>
+    <dc:format>text/rtf</dc:format>
+    <dct:abstract>Morbi ultriçes, dui suscipit vestibulum prètium, velit ante pretium tortor, egët tincidunt pede odio ac nulla.</dct:abstract>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-and-bbox-freetext.xml b/tests/expected/suites_default_post_GetRecords-filter-and-bbox-freetext.xml
new file mode 100644
index 0000000..a21b883
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-and-bbox-freetext.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="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-and-nested-or.xml b/tests/expected/suites_default_post_GetRecords-filter-and-nested-or.xml
new file mode 100644
index 0000000..d24c0a1
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-and-nested-or.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:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+    <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:subject>Hydrography--Dictionaries</dc:subject>
+    <dc:format>application/pdf</dc:format>
+    <dc:date>2006-05-12Z</dc:date>
+    <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-and-nested-or2.xml b/tests/expected/suites_default_post_GetRecords-filter-and-nested-or2.xml
new file mode 100644
index 0000000..30f9498
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-and-nested-or2.xml
@@ -0,0 +1,23 @@
+<?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="2" numberOfRecordsReturned="2" 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:Record>
+    <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:title>Lorem ipsum dolor sit amet</dc:title>
+    <dc:format>image/jpeg</dc:format>
+    <dct:spatial>IT-FI</dct:spatial>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-anytext-and-not.xml b/tests/expected/suites_default_post_GetRecords-filter-anytext-and-not.xml
new file mode 100644
index 0000000..e73b39f
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-anytext-and-not.xml
@@ -0,0 +1,15 @@
+<?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="summary">
+    <csw:SummaryRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      <dc:subject>Tourism--Greece</dc:subject>
+      <dc:format>image/svg+xml</dc:format>
+      <dct:abstract>Quisque lacus diam, placerat mollis, pharetra in, commodo sed, augue. Duis iaculis arcu vel arcu.</dct:abstract>
+    </csw:SummaryRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-anytext-equal.xml b/tests/expected/suites_default_post_GetRecords-filter-anytext-equal.xml
new file mode 100644
index 0000000..5054dae
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-anytext-equal.xml
@@ -0,0 +1,36 @@
+<?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="5" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-anytext.xml b/tests/expected/suites_default_post_GetRecords-filter-anytext.xml
new file mode 100644
index 0000000..5054dae
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-anytext.xml
@@ -0,0 +1,36 @@
+<?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="5" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+      <dc:title>Lorem ipsum dolor sit amet</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-bbox-reproject.xml b/tests/expected/suites_default_post_GetRecords-filter-bbox-reproject.xml
new file mode 100644
index 0000000..98f5882
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-bbox-reproject.xml
@@ -0,0 +1,25 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-bbox-sortby.xml b/tests/expected/suites_default_post_GetRecords-filter-bbox-sortby.xml
new file mode 100644
index 0000000..cf74a0d
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-bbox-sortby.xml
@@ -0,0 +1,25 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-bbox.xml b/tests/expected/suites_default_post_GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..98f5882
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-bbox.xml
@@ -0,0 +1,25 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-between.xml b/tests/expected/suites_default_post_GetRecords-filter-between.xml
new file mode 100644
index 0000000..e4d16a4
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-between.xml
@@ -0,0 +1,49 @@
+<?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="5" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+    <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+    <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:subject>Hydrography--Dictionaries</dc:subject>
+    <dc:format>application/pdf</dc:format>
+    <dc:date>2006-05-12Z</dc:date>
+    <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:title>Fuscé vitae ligulä</dc:title>
+    <dc:date>2003-05-09Z</dc:date>
+    <dc:subject>Land titles</dc:subject>
+    <dc:format>text/rtf</dc:format>
+    <dct:abstract>Morbi ultriçes, dui suscipit vestibulum prètium, velit ante pretium tortor, egët tincidunt pede odio ac nulla.</dct:abstract>
+</csw:Record>
+    <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:Record>
+    <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:title>Lorem ipsum dolor sit amet</dc:title>
+    <dc:format>image/jpeg</dc:format>
+    <dct:spatial>IT-FI</dct:spatial>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+    <dc:title>Maecenas enim</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:format>application/xhtml+xml</dc:format>
+    <dc:subject>Marine sediments</dc:subject>
+    <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-function-bad.xml b/tests/expected/suites_default_post_GetRecords-filter-function-bad.xml
new file mode 100644
index 0000000..f16dab9
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-function-bad.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="service">
+    <ows:ExceptionText>Invalid Constraint: Invalid Filter request: Invalid ogc:Function: foo</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-function.xml b/tests/expected/suites_default_post_GetRecords-filter-function.xml
new file mode 100644
index 0000000..6a9d175
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-function.xml
@@ -0,0 +1,12 @@
+<?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="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-not-bbox.xml b/tests/expected/suites_default_post_GetRecords-filter-not-bbox.xml
new file mode 100644
index 0000000..63df9c1
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-not-bbox.xml
@@ -0,0 +1,36 @@
+<?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="6" numberOfRecordsMatched="10" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+      <dc:title>Lorem ipsum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+      <dc:title></dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>60.04 13.75</ows:LowerCorner>
+        <ows:UpperCorner>68.41 17.92</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+      <dc:title>Maecenas enim</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+      <dc:title>Ut facilisis justo ut lacus</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+      <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-or-bbox-freetext.xml b/tests/expected/suites_default_post_GetRecords-filter-or-bbox-freetext.xml
new file mode 100644
index 0000000..98f5882
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-or-bbox-freetext.xml
@@ -0,0 +1,25 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="brief">
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+      <dc:title>Mauris sed neque</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>47.59 -4.1</ows:LowerCorner>
+        <ows:UpperCorner>51.22 0.89</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+    <csw:BriefRecord>
+      <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+      <dc:title>Ñunç elementum</dc:title>
+      <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>44.79 -6.17</ows:LowerCorner>
+        <ows:UpperCorner>51.13 -2.23</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:BriefRecord>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-or-nested-and.xml b/tests/expected/suites_default_post_GetRecords-filter-or-nested-and.xml
new file mode 100644
index 0000000..f8f0c4d
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-or-nested-and.xml
@@ -0,0 +1,60 @@
+<?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="6" numberOfRecordsReturned="6" 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:Record>
+    <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:format>image/jp2</dc:format>
+    <dc:title>Vestibulum massa purus</dc:title>
+    <dc:relation>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:relation>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography-Landforms</dc:subject>
+    <dct:spatial>FI-ES</dct:spatial>
+    <dct:abstract>Donec scelerisque pede ut nisl luctus accumsan. Quisque ultrices, lorem eget feugiat fringilla, lorem dui porttitor ante, cursus ultrices magna odio eu neque.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <dc:date>2006-03-26Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>47.595 -4.097</ows:LowerCorner>
+      <ows:UpperCorner>51.217 0.889</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Ñunç elementum</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Hydrography-Oceanographic</dc:subject>
+    <dc:date>2005-10-24Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>44.792 -6.171</ows:LowerCorner>
+      <ows:UpperCorner>51.126 -2.228</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:title>Lorem ipsum dolor sit amet</dc:title>
+    <dc:format>image/jpeg</dc:format>
+    <dct:spatial>IT-FI</dct:spatial>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-filter-or-title-abstract.xml b/tests/expected/suites_default_post_GetRecords-filter-or-title-abstract.xml
new file mode 100644
index 0000000..25b13ee
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-filter-or-title-abstract.xml
@@ -0,0 +1,19 @@
+<?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:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <dc:date>2006-03-26Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>47.595 -4.097</ows:LowerCorner>
+      <ows:UpperCorner>51.217 0.889</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_GetRecords-maxrecords.xml b/tests/expected/suites_default_post_GetRecords-maxrecords.xml
new file mode 100644
index 0000000..be156e1
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-maxrecords.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="2" numberOfRecordsMatched="12" 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_default_post_GetRecords-requestid.xml b/tests/expected/suites_default_post_GetRecords-requestid.xml
new file mode 100644
index 0000000..b2de9d8
--- /dev/null
+++ b/tests/expected/suites_default_post_GetRecords-requestid.xml
@@ -0,0 +1,50 @@
+<?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:RequestId>ce74a6c8-677a-42b3-a07c-ce44df8ce7ab</csw:RequestId>
+  <csw:SearchStatus timestamp="PYCSW_TIMESTAMP"/>
+  <csw:SearchResults nextRecord="6" numberOfRecordsMatched="12" numberOfRecordsReturned="5" 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:Record>
+    <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dct:abstract>Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.</dct:abstract>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>60.042 13.754</ows:LowerCorner>
+      <ows:UpperCorner>68.410 17.920</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+    <dc:title>Maecenas enim</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:format>application/xhtml+xml</dc:format>
+    <dc:subject>Marine sediments</dc:subject>
+    <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:title>Ut facilisis justo ut lacus</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation</dc:subject>
+    <dc:relation>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:relation>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+    <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:subject>Hydrography--Dictionaries</dc:subject>
+    <dc:format>application/pdf</dc:format>
+    <dc:date>2006-05-12Z</dc:date>
+    <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_default_post_Harvest-default.xml b/tests/expected/suites_default_post_Harvest-default.xml
new file mode 100644
index 0000000..f9fe731
--- /dev/null
+++ b/tests/expected/suites_default_post_Harvest-default.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="OperationNotSupported" locator="request">
+    <ows:ExceptionText>Harvest operations are not supported</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_Harvest-response-handler.xml b/tests/expected/suites_default_post_Harvest-response-handler.xml
new file mode 100644
index 0000000..f9fe731
--- /dev/null
+++ b/tests/expected/suites_default_post_Harvest-response-handler.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="OperationNotSupported" locator="request">
+    <ows:ExceptionText>Harvest operations are not supported</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_Transaction-delete.xml b/tests/expected/suites_default_post_Transaction-delete.xml
new file mode 100644
index 0000000..131e251
--- /dev/null
+++ b/tests/expected/suites_default_post_Transaction-delete.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="InvalidParameterValue" locator="service">
+    <ows:ExceptionText>Invalid Constraint: Invalid Filter request: Invalid PropertyName: apiso:Identifier.  'apiso:Identifier'</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_Transaction-insert.xml b/tests/expected/suites_default_post_Transaction-insert.xml
new file mode 100644
index 0000000..c2449ce
--- /dev/null
+++ b/tests/expected/suites_default_post_Transaction-insert.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="OperationNotSupported" locator="request">
+    <ows:ExceptionText>Transaction operations are not supported</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_Transaction-update-full.xml b/tests/expected/suites_default_post_Transaction-update-full.xml
new file mode 100644
index 0000000..c2449ce
--- /dev/null
+++ b/tests/expected/suites_default_post_Transaction-update-full.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="OperationNotSupported" locator="request">
+    <ows:ExceptionText>Transaction operations are not supported</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_default_post_Transaction-update-recordproperty.xml b/tests/expected/suites_default_post_Transaction-update-recordproperty.xml
new file mode 100644
index 0000000..c2449ce
--- /dev/null
+++ b/tests/expected/suites_default_post_Transaction-update-recordproperty.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<ows:ExceptionReport 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/csdgm"  [...]
+  <ows:Exception exceptionCode="OperationNotSupported" locator="request">
+    <ows:ExceptionText>Transaction operations are not supported</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_dif_post_DescribeRecord.xml b/tests/expected/suites_dif_post_DescribeRecord.xml
new file mode 100644
index 0000000..04284a4
--- /dev/null
+++ b/tests/expected/suites_dif_post_DescribeRecord.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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/ [...]
diff --git a/tests/expected/suites_dif_post_GetCapabilities.xml b/tests/expected/suites_dif_post_GetCapabilities.xml
new file mode 100644
index 0000000..bd10682
--- /dev/null
+++ b/tests/expected/suites_dif_post_GetCapabilities.xml
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_dif_post_GetRecords-filter-bbox.xml b/tests/expected/suites_dif_post_GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..ea169c6
--- /dev/null
+++ b/tests/expected/suites_dif_post_GetRecords-filter-bbox.xml
@@ -0,0 +1,71 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" elementSet="brief">
+    <dif:DIF xsi:schemaLocation="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/ http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/dif.xsd">
+      <dif:Entry_ID>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dif:Entry_ID>
+      <dif:Entry_Title>Mauris sed neque</dif:Entry_Title>
+      <dif:Data_Set_Citation>
+        <dif:Dataset_Creator/>
+        <dif:Dataset_Release_Date/>
+        <dif:Dataset_Publisher/>
+        <dif:Data_Presentation_Form/>
+      </dif:Data_Set_Citation>
+      <dif:ISO_Topic_Category/>
+      <dif:Keyword>Vegetation-Cropland</dif:Keyword>
+      <dif:Temporal_Coverage>
+        <dif:Start_Date/>
+        <dif:End_Date/>
+      </dif:Temporal_Coverage>
+      <dif:Spatial_Coverage>
+        <dif:Southernmost_Latitude>47.59</dif:Southernmost_Latitude>
+        <dif:Northernmost_Latitude>51.22</dif:Northernmost_Latitude>
+        <dif:Westernmost_Longitude>-4.1</dif:Westernmost_Longitude>
+        <dif:Easternmost_Longitude>0.89</dif:Easternmost_Longitude>
+      </dif:Spatial_Coverage>
+      <dif:Access_Constraints/>
+      <dif:Data_Set_Language/>
+      <dif:Originating_Center/>
+      <dif:Summary>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dif:Summary>
+      <dif:DIF_Creation_Date/>
+      <dif:Related_URL>
+        <dif:URL/>
+      </dif:Related_URL>
+      <dif:Metadata_Name>CEOS IDN DIF</dif:Metadata_Name>
+      <dif:Metadata_Version>9.7</dif:Metadata_Version>
+    </dif:DIF>
+    <dif:DIF xsi:schemaLocation="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/ http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/dif.xsd">
+      <dif:Entry_ID>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dif:Entry_ID>
+      <dif:Entry_Title>Ñunç elementum</dif:Entry_Title>
+      <dif:Data_Set_Citation>
+        <dif:Dataset_Creator/>
+        <dif:Dataset_Release_Date/>
+        <dif:Dataset_Publisher/>
+        <dif:Data_Presentation_Form/>
+      </dif:Data_Set_Citation>
+      <dif:ISO_Topic_Category/>
+      <dif:Keyword>Hydrography-Oceanographic</dif:Keyword>
+      <dif:Temporal_Coverage>
+        <dif:Start_Date/>
+        <dif:End_Date/>
+      </dif:Temporal_Coverage>
+      <dif:Spatial_Coverage>
+        <dif:Southernmost_Latitude>44.79</dif:Southernmost_Latitude>
+        <dif:Northernmost_Latitude>51.13</dif:Northernmost_Latitude>
+        <dif:Westernmost_Longitude>-6.17</dif:Westernmost_Longitude>
+        <dif:Easternmost_Longitude>-2.23</dif:Easternmost_Longitude>
+      </dif:Spatial_Coverage>
+      <dif:Access_Constraints/>
+      <dif:Data_Set_Language/>
+      <dif:Originating_Center/>
+      <dif:Summary></dif:Summary>
+      <dif:DIF_Creation_Date/>
+      <dif:Related_URL>
+        <dif:URL/>
+      </dif:Related_URL>
+      <dif:Metadata_Name>CEOS IDN DIF</dif:Metadata_Name>
+      <dif:Metadata_Version>9.7</dif:Metadata_Version>
+    </dif:DIF>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_ebrim_post_DescribeRecord.xml b/tests/expected/suites_ebrim_post_DescribeRecord.xml
new file mode 100644
index 0000000..21f4d9b
--- /dev/null
+++ b/tests/expected/suites_ebrim_post_DescribeRecord.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ows="http://www.open [...]
+  <csw:SchemaComponent schemaLanguage="XMLSCHEMA" targetNamespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0">
+    <xs:schema xmlns:xmime="http://www.w3.org/2005/05/xmlmime" id="wrs" targetNamespace="http://www.opengis.net/cat/wrs/1.0" elementFormDefault="qualified" version="1.0.1">
+
+  <xs:annotation>
+    <xs:appinfo xmlns:sch="http://www.ascc.net/xml/schematron">
+      <sch:pattern id="ComplexSlotValuesPattern" name="ComplexSlotValuesPattern">
+        <sch:rule context="//wrs:ValueList">
+          <sch:report test="rim:Value">rim:Value not allowed in this context: expected wrs:AnyValue.</sch:report>
+        </sch:rule>
+      </sch:pattern>
+    </xs:appinfo>
+    <xs:documentation xml:lang="en">
+    Schema for CSW-ebRIM catalogue profile (OGC 07-110r3).
+    </xs:documentation>
+  </xs:annotation>
+    
+  <xs:import namespace="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" schemaLocation="http://docs.oasis-open.org/regrep/v3.0/schema/rim.xsd"/>
+  <xs:import namespace="http://www.opengis.net/cat/csw/2.0.2" schemaLocation="../../../../../../../../../../../../pycsw/schemas/ogc/csw/2.0.2/CSW-publication.xsd"/>
+  <xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="../../../../../../../../../../../../pycsw/schemas/w3c/1999/xlink.xsd"/>
+  <xs:import namespace="http://www.opengis.net/ogc" schemaLocation="../../../../../../../../../../../../pycsw/schemas/ogc/filter/1.1.0/filter.xsd"/>
+    
+  <xs:element name="Capabilities" type="csw:CapabilitiesType"/>
+  <xs:element name="RecordId" type="wrs:RecordIdType" substitutionGroup="ogc:_Id" id="RecordId">
+    <xs:annotation>
+    <xs:documentation xml:lang="en">
+    A general record identifier, expressed as an absolute URI that maps to 
+    the rim:RegistryObject/@id attribute. It substitutes for the ogc:_Id 
+    element in an OGC filter expression.
+    </xs:documentation>
+    </xs:annotation>
+  </xs:element>
+  <xs:complexType name="RecordIdType" id="RecordIdType">
+    <xs:complexContent mixed="true">
+      <xs:extension base="ogc:AbstractIdType"/>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <xs:element name="ExtrinsicObject" type="wrs:ExtrinsicObjectType" substitutionGroup="rim:ExtrinsicObject"/>
+  <xs:complexType name="ExtrinsicObjectType">
+    <xs:annotation>
+      <xs:documentation xml:lang="en">
+      Extends rim:ExtrinsicObjectType to add the following:
+      1. MTOM/XOP based attachment support.
+      2. XLink based reference to a part in a multipart/related message 
+         structure.
+      NOTE: This content model is planned for RegRep 4.0.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:complexContent>
+      <xs:extension base="rim:ExtrinsicObjectType">
+        <xs:choice minOccurs="0" maxOccurs="1">
+          <xs:element name="repositoryItemRef" type="wrs:SimpleLinkType"/>
+          <xs:element name="repositoryItem" type="xsd:base64Binary" xmime:expectedContentTypes="*/*"/>
+        </xs:choice>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  
+  <xs:element name="ValueList" type="wrs:ValueListType" substitutionGroup="rim:ValueList"/>
+  <xs:complexType name="ValueListType">
+    <xs:annotation>
+      <xs:documentation xml:lang="en">Allows complex slot values.</xs:documentation>
+    </xs:annotation>
+    <xs:complexContent>
+      <xs:extension base="rim:ValueListType">
+        <xs:sequence minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="wrs:AnyValue"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:element name="AnyValue" type="wrs:AnyValueType"/>
+  <xs:complexType name="AnyValueType" mixed="true">
+    <xs:sequence>
+      <xs:any minOccurs="0"/>
+    </xs:sequence>
+  </xs:complexType>
+  
+  <xs:complexType name="SimpleLinkType" id="SimpleLinkType">
+    <xs:annotation>
+      <xs:documentation xml:lang="en">
+      Incorporates the attributes defined for use in simple XLink elements.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:attributeGroup ref="xlink:simpleAttrs"/>
+  </xs:complexType>
+</xs:schema>
+  </csw:SchemaComponent>
+</csw:DescribeRecordResponse>
diff --git a/tests/expected/suites_ebrim_post_GetCapabilities.xml b/tests/expected/suites_ebrim_post_GetCapabilities.xml
new file mode 100644
index 0000000..b89462b
--- /dev/null
+++ b/tests/expected/suites_ebrim_post_GetCapabilities.xml
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" 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/ow [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>rim:RegistryObject</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>rim:RegistryObject</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_ebrim_post_GetRecords-filter-bbox.xml b/tests/expected/suites_ebrim_post_GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..b59cecc
--- /dev/null
+++ b/tests/expected/suites_ebrim_post_GetRecords-filter-bbox.xml
@@ -0,0 +1,13 @@
+<?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:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" 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. [...]
+  <csw:SearchStatus timestamp="PYCSW_TIMESTAMP"/>
+  <csw:SearchResults nextRecord="0" numberOfRecordsMatched="2" numberOfRecordsReturned="2" recordSchema="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" elementSet="brief">
+    <rim:ExtrinsicObject xsi:schemaLocation="http://www.opengis.net/cat/wrs/1.0 http://schemas.opengis.net/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim.xsd" id="urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63" lid="urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63" objectType="http://purl.org/dc/dcmitype/Dataset" status="urn:oasis:names:tc:ebxml-regrep:StatusType:Submitted">
+      <rim:VersionInfo versionName=""/>
+    </rim:ExtrinsicObject>
+    <rim:ExtrinsicObject xsi:schemaLocation="http://www.opengis.net/cat/wrs/1.0 http://schemas.opengis.net/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim.xsd" id="urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc" lid="urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc" objectType="http://purl.org/dc/dcmitype/Dataset" status="urn:oasis:names:tc:ebxml-regrep:StatusType:Submitted">
+      <rim:VersionInfo versionName=""/>
+    </rim:ExtrinsicObject>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_fgdc_post_DescribeRecord.xml b/tests/expected/suites_fgdc_post_DescribeRecord.xml
new file mode 100644
index 0000000..04284a4
--- /dev/null
+++ b/tests/expected/suites_fgdc_post_DescribeRecord.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:DescribeRecordResponse 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/ [...]
diff --git a/tests/expected/suites_fgdc_post_GetCapabilities.xml b/tests/expected/suites_fgdc_post_GetCapabilities.xml
new file mode 100644
index 0000000..5bf0ec2
--- /dev/null
+++ b/tests/expected/suites_fgdc_post_GetCapabilities.xml
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_fgdc_post_GetRecords-filter-bbox.xml b/tests/expected/suites_fgdc_post_GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..22574f4
--- /dev/null
+++ b/tests/expected/suites_fgdc_post_GetRecords-filter-bbox.xml
@@ -0,0 +1,123 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/csdgm" elementSet="brief">
+    <metadata xsi:noNamespaceSchemaLocation="http://www.fgdc.gov/metadata/fgdc-std-001-1998.xsd">
+      <idinfo>
+        <datasetid>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</datasetid>
+        <citation>
+          <citeinfo>
+            <title>Mauris sed neque</title>
+            <publinfo>
+              <publish></publish>
+            </publinfo>
+            <origin></origin>
+            <geoform></geoform>
+            <onlink></onlink>
+          </citeinfo>
+        </citation>
+        <keywords>
+          <theme>
+            <themekey>Vegetation-Cropland</themekey>
+          </theme>
+        </keywords>
+        <accconst></accconst>
+        <descript>
+          <abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</abstract>
+        </descript>
+        <spdom>
+          <bounding>
+            <westbc>-4.1</westbc>
+            <eastbc>0.89</eastbc>
+            <northbc>51.22</northbc>
+            <southbc>47.59</southbc>
+          </bounding>
+        </spdom>
+        <datacred></datacred>
+        <spdoinfo>
+          <direct>http://purl.org/dc/dcmitype/Dataset</direct>
+        </spdoinfo>
+      </idinfo>
+      <distinfo>
+        <stdorder>
+          <digform>
+            <digtinfo>
+              <formname></formname>
+            </digtinfo>
+          </digform>
+        </stdorder>
+      </distinfo>
+      <lineage>
+        <srcinfo>
+          <srccite>
+            <citeinfo>
+              <title></title>
+            </citeinfo>
+          </srccite>
+        </srcinfo>
+      </lineage>
+      <metainfo>
+        <metd></metd>
+      </metainfo>
+    </metadata>
+    <metadata xsi:noNamespaceSchemaLocation="http://www.fgdc.gov/metadata/fgdc-std-001-1998.xsd">
+      <idinfo>
+        <datasetid>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</datasetid>
+        <citation>
+          <citeinfo>
+            <title>Ñunç elementum</title>
+            <publinfo>
+              <publish></publish>
+            </publinfo>
+            <origin></origin>
+            <geoform></geoform>
+            <onlink></onlink>
+          </citeinfo>
+        </citation>
+        <keywords>
+          <theme>
+            <themekey>Hydrography-Oceanographic</themekey>
+          </theme>
+        </keywords>
+        <accconst></accconst>
+        <descript>
+          <abstract></abstract>
+        </descript>
+        <spdom>
+          <bounding>
+            <westbc>-6.17</westbc>
+            <eastbc>-2.23</eastbc>
+            <northbc>51.13</northbc>
+            <southbc>44.79</southbc>
+          </bounding>
+        </spdom>
+        <datacred></datacred>
+        <spdoinfo>
+          <direct>http://purl.org/dc/dcmitype/Dataset</direct>
+        </spdoinfo>
+      </idinfo>
+      <distinfo>
+        <stdorder>
+          <digform>
+            <digtinfo>
+              <formname></formname>
+            </digtinfo>
+          </digform>
+        </stdorder>
+      </distinfo>
+      <lineage>
+        <srcinfo>
+          <srccite>
+            <citeinfo>
+              <title></title>
+            </citeinfo>
+          </srccite>
+        </srcinfo>
+      </lineage>
+      <metainfo>
+        <metd></metd>
+      </metainfo>
+    </metadata>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_harvesting_get_Exception-Harvest-invalid-resourcetype.xml b/tests/expected/suites_harvesting_get_Exception-Harvest-invalid-resourcetype.xml
new file mode 100644
index 0000000..c3656bd
--- /dev/null
+++ b/tests/expected/suites_harvesting_get_Exception-Harvest-invalid-resourcetype.xml
@@ -0,0 +1,7 @@
+<?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="InvalidParameterValue" locator="resourcetype">
+    <ows:ExceptionText>Invalid resource type parameter: http://www.opengis.net/wms1234.            Allowable resourcetype values: http://www.opengis.net/cat/csw/2.0.2,http://www.opengis.net/wms,http://www.opengis.net/wfs,http://www.opengis.net/wcs,http://www.opengis.net/wps/1.0.0,http://www.opengis.net/sos/1.0,http://www.opengis.net/sos/2.0,http://www.isotc211.org/2005/gmi,urn:geoss:waf,http://www.isotc211.org/2005/gmd,http://www.isotc211.org/schemas/2005/gmd/,http://www.w3.org/2005/Atom [...]
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_harvesting_get_Exception-Harvest-missing-resourcetype.xml b/tests/expected/suites_harvesting_get_Exception-Harvest-missing-resourcetype.xml
new file mode 100644
index 0000000..f46e81b
--- /dev/null
+++ b/tests/expected/suites_harvesting_get_Exception-Harvest-missing-resourcetype.xml
@@ -0,0 +1,7 @@
+<?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="MissingParameterValue" locator="resourcetype">
+    <ows:ExceptionText>Missing resourcetype parameter</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_harvesting_get_Exception-Harvest-missing-source.xml b/tests/expected/suites_harvesting_get_Exception-Harvest-missing-source.xml
new file mode 100644
index 0000000..bbdf15c
--- /dev/null
+++ b/tests/expected/suites_harvesting_get_Exception-Harvest-missing-source.xml
@@ -0,0 +1,7 @@
+<?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="MissingParameterValue" locator="source">
+    <ows:ExceptionText>Missing source parameter</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_harvesting_get_Exception-Harvest-waf-bad-value.xml b/tests/expected/suites_harvesting_get_Exception-Harvest-waf-bad-value.xml
new file mode 100644
index 0000000..5d7ad42
--- /dev/null
+++ b/tests/expected/suites_harvesting_get_Exception-Harvest-waf-bad-value.xml
@@ -0,0 +1,7 @@
+<?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: unknown url type: badvalue</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_harvesting_get_Exception-Harvest-waf-no-records-found.xml b/tests/expected/suites_harvesting_get_Exception-Harvest-waf-no-records-found.xml
new file mode 100644
index 0000000..5904e69
--- /dev/null
+++ b/tests/expected/suites_harvesting_get_Exception-Harvest-waf-no-records-found.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>0</csw:totalInserted>
+      <csw:totalUpdated>0</csw:totalUpdated>
+      <csw:totalDeleted>0</csw:totalDeleted>
+    </csw:TransactionSummary>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Clear-000-delete-all.xml b/tests/expected/suites_harvesting_post_Clear-000-delete-all.xml
new file mode 100644
index 0000000..381db66
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Clear-000-delete-all.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_harvesting_post_Exception-Havest-csw-404.xml b/tests/expected/suites_harvesting_post_Exception-Havest-csw-404.xml
new file mode 100644
index 0000000..b981c03
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Exception-Havest-csw-404.xml
@@ -0,0 +1,7 @@
+<?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: HTTP Error 404: Not Found</ows:ExceptionText>
+  </ows:Exception>
+</ows:ExceptionReport>
diff --git a/tests/expected/suites_harvesting_post_GetCapabilities.xml b/tests/expected/suites_harvesting_post_GetCapabilities.xml
new file mode 100644
index 0000000..7ebcc33
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_GetCapabilities.xml
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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" xmlns: [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedISOQueryables">
+        <ows:Value>apiso:DistanceValue</ows:Value>
+        <ows:Value>apiso:Abstract</ows:Value>
+        <ows:Value>apiso:RevisionDate</ows:Value>
+        <ows:Value>apiso:Subject</ows:Value>
+        <ows:Value>apiso:KeywordType</ows:Value>
+        <ows:Value>apiso:Title</ows:Value>
+        <ows:Value>apiso:CRS</ows:Value>
+        <ows:Value>apiso:PublicationDate</ows:Value>
+        <ows:Value>apiso:Type</ows:Value>
+        <ows:Value>apiso:AlternateTitle</ows:Value>
+        <ows:Value>apiso:BoundingBox</ows:Value>
+        <ows:Value>apiso:AnyText</ows:Value>
+        <ows:Value>apiso:ParentIdentifier</ows:Value>
+        <ows:Value>apiso:Modified</ows:Value>
+        <ows:Value>apiso:Operation</ows:Value>
+        <ows:Value>apiso:Format</ows:Value>
+        <ows:Value>apiso:TempExtent_end</ows:Value>
+        <ows:Value>apiso:DistanceUOM</ows:Value>
+        <ows:Value>apiso:OrganisationName</ows:Value>
+        <ows:Value>apiso:ServiceType</ows:Value>
+        <ows:Value>apiso:TempExtent_begin</ows:Value>
+        <ows:Value>apiso:ResourceLanguage</ows:Value>
+        <ows:Value>apiso:ServiceTypeVersion</ows:Value>
+        <ows:Value>apiso:OperatesOn</ows:Value>
+        <ows:Value>apiso:Denominator</ows:Value>
+        <ows:Value>apiso:HasSecurityConstraints</ows:Value>
+        <ows:Value>apiso:OperatesOnIdentifier</ows:Value>
+        <ows:Value>apiso:GeographicDescriptionCode</ows:Value>
+        <ows:Value>apiso:Language</ows:Value>
+        <ows:Value>apiso:Identifier</ows:Value>
+        <ows:Value>apiso:OperatesOnName</ows:Value>
+        <ows:Value>apiso:TopicCategory</ows:Value>
+        <ows:Value>apiso:CreationDate</ows:Value>
+        <ows:Value>apiso:CouplingType</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="AdditionalQueryables">
+        <ows:Value>apiso:Lineage</ows:Value>
+        <ows:Value>apiso:Classification</ows:Value>
+        <ows:Value>apiso:Creator</ows:Value>
+        <ows:Value>apiso:Relation</ows:Value>
+        <ows:Value>apiso:OtherConstraints</ows:Value>
+        <ows:Value>apiso:SpecificationTitle</ows:Value>
+        <ows:Value>apiso:ResponsiblePartyRole</ows:Value>
+        <ows:Value>apiso:SpecificationDateType</ows:Value>
+        <ows:Value>apiso:Degree</ows:Value>
+        <ows:Value>apiso:Contributor</ows:Value>
+        <ows:Value>apiso:ConditionApplyingToAccessAndUse</ows:Value>
+        <ows:Value>apiso:SpecificationDate</ows:Value>
+        <ows:Value>apiso:AccessConstraints</ows:Value>
+        <ows:Value>apiso:Publisher</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.isotc211.org/schemas/2005/gmd/</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_harvesting_post_GetDomain-parameter.xml b/tests/expected/suites_harvesting_post_GetDomain-parameter.xml
new file mode 100644
index 0000000..01db252
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_GetDomain-parameter.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetDomainResponse 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" x [...]
+  <csw:DomainValues type="csw:Record">
+    <csw:ParameterName>Harvest.ResourceType</csw:ParameterName>
+    <csw:ListOfValues>
+      <csw:Value>http://www.opengis.net/cat/csw/2.0.2</csw:Value>
+      <csw:Value>http://www.opengis.net/wms</csw:Value>
+      <csw:Value>http://www.opengis.net/wfs</csw:Value>
+      <csw:Value>http://www.opengis.net/wcs</csw:Value>
+      <csw:Value>http://www.opengis.net/wps/1.0.0</csw:Value>
+      <csw:Value>http://www.opengis.net/sos/1.0</csw:Value>
+      <csw:Value>http://www.opengis.net/sos/2.0</csw:Value>
+      <csw:Value>http://www.isotc211.org/2005/gmi</csw:Value>
+      <csw:Value>urn:geoss:waf</csw:Value>
+      <csw:Value>http://www.isotc211.org/2005/gmd</csw:Value>
+      <csw:Value>http://www.isotc211.org/schemas/2005/gmd/</csw:Value>
+      <csw:Value>http://www.w3.org/2005/Atom</csw:Value>
+      <csw:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</csw:Value>
+      <csw:Value>http://www.opengis.net/cat/csw/csdgm</csw:Value>
+    </csw:ListOfValues>
+  </csw:DomainValues>
+</csw:GetDomainResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-csw.xml b/tests/expected/suites_harvesting_post_Harvest-csw.xml
new file mode 100644
index 0000000..cf1366c
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-csw.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>13</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>pycsw Geospatial Catalogue OGC CITE demo and Reference Implementation</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>Lorem ipsum</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>Maecenas enim</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>Ut facilisis justo ut lacus</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>Vestibulum massa purus</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>Mauris sed neque</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>Ñunç elementum</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>Lorem ipsum dolor sit amet</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>Fuscé vitae ligulä</dc:title>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-dc.xml b/tests/expected/suites_harvesting_post_Harvest-dc.xml
new file mode 100644
index 0000000..db4ed11
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-dc.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>1</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>Image2000 Product 1 (at1) Multispectral</dc:title>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-fgdc.xml b/tests/expected/suites_harvesting_post_Harvest-fgdc.xml
new file mode 100644
index 0000000..c4671a3
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-fgdc.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>1</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>CPC Merged Analysis of Precipitation Standard [POL 88.75 -88.75 180 -180]</dc:title>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-iso.xml b/tests/expected/suites_harvesting_post_Harvest-iso.xml
new file mode 100644
index 0000000..06537f5
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-iso.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>1</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>Wasserkörper Linien</dc:title>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-rdf.xml b/tests/expected/suites_harvesting_post_Harvest-rdf.xml
new file mode 100644
index 0000000..567c312
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-rdf.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>1</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>Website_gdb</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
new file mode 100644
index 0000000..a4e2dfe
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-sos100.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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:totalUpdated>0</csw:totalUpdated>
+      <csw:totalDeleted>0</csw:totalDeleted>
+    </csw:TransactionSummary>
+    <csw:InsertResult>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>Northeastern Regional Association of Coastal Ocean Observing Systems</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-CML</dc:identifier>
+        <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>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-SMB-MO-04</dc:identifier>
+        <dc:title>Mooring SMB-MO-04 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (SmartBay) located Pilot Boarding Station, Red Island Shoal, Placentia Bay, NL, CA</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-LDLC3</dc:identifier>
+        <dc:title>Mooring LDLC3 data from the LISICOS (LISICOS) located New London Ledge Light</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-CDIP154</dc:identifier>
+        <dc:title>Mooring CDIP154 data from the COOA (UNH-COOA-CDIP) located Block Island, RI</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-CDIP176</dc:identifier>
+        <dc:title>Mooring CDIP176 data from the COOA (UNH-COOA-CDIP) located Halifax Harbor, CA</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-ARTG</dc:identifier>
+        <dc:title>Mooring ARTG data from the LISICOS (LISICOS) located North of Smithtown Bay</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-M01</dc:identifier>
+        <dc:title>Mooring M01 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located Jordan Basin</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-N01</dc:identifier>
+        <dc:title>Mooring N01 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located Northeast Channel</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-44039</dc:identifier>
+        <dc:title>Mooring 44039 data from the LISICOS (LISICOS) located Central Long Island Sound</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-SMB-MO-01</dc:identifier>
+        <dc:title>Mooring SMB-MO-01 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (SmartBay) located Mouth of Placentia Bay, NL, Canada</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-SMB-MO-05</dc:identifier>
+        <dc:title>Mooring SMB-MO-05 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (SmartBay) located Come By Chance Point, Placentia Bay, NL, CA</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-D02</dc:identifier>
+        <dc:title>Mooring D02 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located Lower Harpswell Sound</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-E02</dc:identifier>
+        <dc:title>Mooring E02 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located DeepCwind Test Site</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-E01</dc:identifier>
+        <dc:title>Mooring E01 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located Central Maine Shelf</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-B01</dc:identifier>
+        <dc:title>Mooring B01 data from the Northeastern Regional Association of Coastal Ocean Observing Systems (Univ. of Maine) located Western Maine Shelf</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-EXRX</dc:identifier>
+        <dc:title>Mooring EXRX data from the LISICOS (LISICOS) located Execution Rocks Long Island Sound</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-44098</dc:identifier>
+        <dc:title>Mooring 44098 data from the COOA (UNH-COOA) located Jeffrey's Ledge</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-WLIS</dc:identifier>
+        <dc:title>Mooring WLIS data from the LISICOS (LISICOS) located Western Long Island Sound</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-CO2</dc:identifier>
+        <dc:title>Mooring CO2 data from the COOA (UNH-COOA) located Appledore Island</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>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-MDS02</dc:identifier>
+        <dc:title>Mooring MDS02 data from the URI (Univ. of Rhode Is.) located SAMP MD S</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-GREAT_BAY</dc:identifier>
+        <dc:title>Mooring GREAT_BAY data from the COOA (UNH-COOA) located Great Bay, NH</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-I01</dc:identifier>
+        <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-44060</dc:identifier>
+        <dc:title>Mooring 44060 data from the LISICOS (LISICOS) located Eastern Long Island Sound</dc:title>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-sos200.xml b/tests/expected/suites_harvesting_post_Harvest-sos200.xml
new file mode 100644
index 0000000..d5d99f9
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-sos200.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>2</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>GIN SOS</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-GW_LEVEL</dc:identifier>
+        <dc:title/>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-waf.xml b/tests/expected/suites_harvesting_post_Harvest-waf.xml
new file mode 100644
index 0000000..dc67736
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-waf.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>3</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>CPC Merged Analysis of Precipitation Standard [POL 88.75 -88.75 180 -180]</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>Image2000 Product 1 (at1) Multispectral</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+        <dc:title>NOAA_RNC</dc:title>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-wcs.xml b/tests/expected/suites_harvesting_post_Harvest-wcs.xml
new file mode 100644
index 0000000..fb27f88
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-wcs.xml
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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: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>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_09</dc:identifier>
+        <dc:title>snow water equivalent, September (1987-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>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-snow_water_equivalent_03</dc:identifier>
+        <dc:title>snow water equivalent, March (1988-2003)</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>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-wfs.xml b/tests/expected/suites_harvesting_post_Harvest-wfs.xml
new file mode 100644
index 0000000..1229007
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-wfs.xml
@@ -0,0 +1,7 @@
+<?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>
diff --git a/tests/expected/suites_harvesting_post_Harvest-wms.xml b/tests/expected/suites_harvesting_post_Harvest-wms.xml
new file mode 100644
index 0000000..b018325
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-wms.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>10</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>Wisconsin Lake Clarity</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-Highways</dc:identifier>
+        <dc:title>Highways</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-LakesTSI</dc:identifier>
+        <dc:title>LakesTSI</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-LakeClarity</dc:identifier>
+        <dc:title>Wisconsin Lake Clarity</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-LakesTSI_0305</dc:identifier>
+        <dc:title>LakesTSI_0305</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-Relief</dc:identifier>
+        <dc:title>Relief</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-LakeNames_0305</dc:identifier>
+        <dc:title>LakeNames_0305</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-Roads</dc:identifier>
+        <dc:title>Roads</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-LakeNames</dc:identifier>
+        <dc:title>LakeNames</dc:title>
+      </csw:BriefRecord>
+      <csw:BriefRecord>
+        <dc:identifier>PYCSW_IDENTIFIER-Counties</dc:identifier>
+        <dc:title>Counties</dc:title>
+      </csw:BriefRecord>
+    </csw:InsertResult>
+  </csw:TransactionResponse>
+</csw:HarvestResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-wps.xml b/tests/expected/suites_harvesting_post_Harvest-wps.xml
new file mode 100644
index 0000000..a402ca6
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-wps.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<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>1</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>Geo Data Portal WPS Implementation</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
new file mode 100644
index 0000000..ec8229f
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-ows-dc.xml
@@ -0,0 +1,146 @@
+<?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="6" numberOfRecordsReturned="5" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>pycsw Geospatial Catalogue OGC CITE demo and Reference Implementation</dc:title>
+      <dc:type>service</dc:type>
+      <dc:subject>ogc</dc:subject>
+      <dc:subject>cite</dc:subject>
+      <dc:subject>compliance</dc:subject>
+      <dc:subject>interoperability</dc:subject>
+      <dc:subject>reference implementation</dc:subject>
+      <dc:format>CSW</dc:format>
+      <dct:references scheme="OGC:CSW">http://demo.pycsw.org/cite/csw</dct:references>
+      <dct:abstract>pycsw is an OGC CSW server implementation written in Python. pycsw fully implements the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web]. Initial development started in 2010 (more formally announced in 2011). The project is certified OGC Compliant, and is an OGC Reference Implementation. pycsw allows for the publishing and discovery of geospatial metadata. Existing repositories of geospatial metadata can also be exposed via OGC:CS [...]
+      <dc:creator>Lastname, Firstname</dc:creator>
+      <dc:publisher>Organization Name</dc:publisher>
+      <dc:contributor>Lastname, Firstname</dc:contributor>
+      <dc:source>http://demo.pycsw.org/cite/csw</dc:source>
+      <dc:rights>None</dc:rights>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>Northeastern Regional Association of Coastal Ocean Observing Systems</dc:title>
+      <dc:type>service</dc:type>
+      <dc:subject>NERACOOS</dc:subject>
+      <dc:subject>SOS</dc:subject>
+      <dc:subject>OCEANOGRAPHY</dc:subject>
+      <dc:subject>Ocean Observations</dc:subject>
+      <dc:subject>Gulf of Maine</dc:subject>
+      <dc:subject>Long Island Sound</dc:subject>
+      <dc:subject>Narragansett Bay</dc:subject>
+      <dc:subject>Cape Cod</dc:subject>
+      <dc:subject>Boston Harbor</dc:subject>
+      <dc:subject>Buzzards Bay</dc:subject>
+      <dc:subject>Weather</dc:subject>
+      <dc:subject>Ocean Currents</dc:subject>
+      <dc:subject>Water Temperature</dc:subject>
+      <dc:subject>Salinity</dc:subject>
+      <dc:subject>Winds</dc:subject>
+      <dc:subject>Waves</dc:subject>
+      <dc:subject>Ocean Color</dc:subject>
+      <dc:subject>GoMOOS</dc:subject>
+      <dc:subject>LISICOS</dc:subject>
+      <dc:subject>Univ. of New Hampshire</dc:subject>
+      <dc:subject>MVCO</dc:subject>
+      <dc:subject>Air Temperature</dc:subject>
+      <dc:format>OGC:SOS</dc:format>
+      <dct:references scheme="OGC:SOS">http://www.neracoos.org/cgi-bin/sos/V1.0/oostethys_sos.cgi</dct:references>
+      <dct:abstract>NERACOOS supports data collected from buoys in the Gulf of Maine and Long Island Sound. The six Gulf of Maine buoys carry a comprehensive sensor suite that includes the full complement of meteorological sensors carried by the standard NDBC buoys, and in addition commonly include atmospheric visibility, surface currents, water-column current profiles, temperature and conductivity, and fluorescence (for chlorophyll a estimation) and backscatter at multiple depths.  In L [...]
+      <dc:creator>Eric Bridger</dc:creator>
+      <dc:publisher>NERACOOS</dc:publisher>
+      <dc:contributor>Eric Bridger</dc:contributor>
+      <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:UpperCorner>47.79 -54.05</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>GIN SOS</dc:title>
+      <dc:type>service</dc:type>
+      <dc:subject>groundwater level</dc:subject>
+      <dc:subject>monitoring</dc:subject>
+      <dc:subject>timeseries</dc:subject>
+      <dc:subject>Alberta</dc:subject>
+      <dc:subject>Ontario</dc:subject>
+      <dc:subject>Nova Scotia</dc:subject>
+      <dc:format>OGC:SOS</dc:format>
+      <dct:references scheme="OGC:SOS">http://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</dct:references>
+      <dct:abstract>Historical groundwater  level  monitoring stations from Alberta, Ontario and Nova Scotia. This SOS web service delivers the data using OGC's WaterML 2.0. The SOS service federates data from various  provincial  sources and publishes  them as a single service.   Many monitoring stations also have water well characteristics available  through the  GIN WFS  web service.</dct:abstract>
+      <dc:creator>Boyan Brodaric</dc:creator>
+      <dc:publisher>Geological Survey of Canada, Earth Sciences Sector, Natural Resources Canada, Government of Canada</dc:publisher>
+      <dc:contributor>Boyan Brodaric</dc:contributor>
+      <dc:source>http://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</dc:source>
+      <dc:rights>NONE</dc:rights>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>41.0 -120.0</ows:LowerCorner>
+        <ows:UpperCorner>60.0 -60.0</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>Atlas of the Cryosphere: Northern Hemisphere</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: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>
+      <dc:rights>
+    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:BoundingBox>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>Wisconsin Lake Clarity</dc:title>
+      <dc:type>service</dc:type>
+      <dc:subject>SSEC</dc:subject>
+      <dc:subject>PAW</dc:subject>
+      <dc:subject>remote sensing</dc:subject>
+      <dc:subject>meteorology</dc:subject>
+      <dc:subject>atmospheric science</dc:subject>
+      <dc:subject>University of Wisconsin</dc:subject>
+      <dc:subject>Madison</dc:subject>
+      <dc:subject>weather</dc:subject>
+      <dc:subject>land</dc:subject>
+      <dc:format>OGC:WMS</dc:format>
+      <dct:references scheme="OGC:WMS">http://wmsserv2.ssec.wisc.edu/cgi-bin/mapserv?map=/home/wms/data/mapfiles/lakestsi.map</dct:references>
+      <dct:abstract>General: This server hosts a set of experimental OGC Web Services of remote sensing data products for use in a broad range of both desktop and mobile device clients.</dct:abstract>
+      <dc:creator>Dr. Sam Batzli</dc:creator>
+      <dc:publisher>Space Science and Engineering Center, University of Wisconsin-Madison</dc:publisher>
+      <dc:contributor>Dr. Sam Batzli</dc:contributor>
+      <dc:source>http://wmsserv2.ssec.wisc.edu/cgi-bin/mapserv?map=/home/wms/data/mapfiles/lakestsi.map</dc:source>
+      <dc:rights>The following attribution is required if published or reproduced: Source: Space Science and Engineering Center, University of Wisconsin-Madison</dc:rights>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>42.41 -93.03</ows:LowerCorner>
+        <ows:UpperCorner>47.13 -86.64</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml
new file mode 100644
index 0000000..96c31fb
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml
@@ -0,0 +1,30 @@
+<?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.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>GIN SOS</dc:title>
+      <dc:type>service</dc:type>
+      <dc:subject>groundwater level</dc:subject>
+      <dc:subject>monitoring</dc:subject>
+      <dc:subject>timeseries</dc:subject>
+      <dc:subject>Alberta</dc:subject>
+      <dc:subject>Ontario</dc:subject>
+      <dc:subject>Nova Scotia</dc:subject>
+      <dc:format>OGC:SOS</dc:format>
+      <dct:references scheme="OGC:SOS">http://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</dct:references>
+      <dct:abstract>Historical groundwater  level  monitoring stations from Alberta, Ontario and Nova Scotia. This SOS web service delivers the data using OGC's WaterML 2.0. The SOS service federates data from various  provincial  sources and publishes  them as a single service.   Many monitoring stations also have water well characteristics available  through the  GIN WFS  web service.</dct:abstract>
+      <dc:creator>Boyan Brodaric</dc:creator>
+      <dc:publisher>Geological Survey of Canada, Earth Sciences Sector, Natural Resources Canada, Government of Canada</dc:publisher>
+      <dc:contributor>Boyan Brodaric</dc:contributor>
+      <dc:source>http://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</dc:source>
+      <dc:rights>NONE</dc:rights>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>41.0 -120.0</ows:LowerCorner>
+        <ows:UpperCorner>60.0 -60.0</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
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
new file mode 100644
index 0000000..b05073e
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-dc.xml
@@ -0,0 +1,69 @@
+<?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="2" numberOfRecordsReturned="2" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>Northeastern Regional Association of Coastal Ocean Observing Systems</dc:title>
+      <dc:type>service</dc:type>
+      <dc:subject>NERACOOS</dc:subject>
+      <dc:subject>SOS</dc:subject>
+      <dc:subject>OCEANOGRAPHY</dc:subject>
+      <dc:subject>Ocean Observations</dc:subject>
+      <dc:subject>Gulf of Maine</dc:subject>
+      <dc:subject>Long Island Sound</dc:subject>
+      <dc:subject>Narragansett Bay</dc:subject>
+      <dc:subject>Cape Cod</dc:subject>
+      <dc:subject>Boston Harbor</dc:subject>
+      <dc:subject>Buzzards Bay</dc:subject>
+      <dc:subject>Weather</dc:subject>
+      <dc:subject>Ocean Currents</dc:subject>
+      <dc:subject>Water Temperature</dc:subject>
+      <dc:subject>Salinity</dc:subject>
+      <dc:subject>Winds</dc:subject>
+      <dc:subject>Waves</dc:subject>
+      <dc:subject>Ocean Color</dc:subject>
+      <dc:subject>GoMOOS</dc:subject>
+      <dc:subject>LISICOS</dc:subject>
+      <dc:subject>Univ. of New Hampshire</dc:subject>
+      <dc:subject>MVCO</dc:subject>
+      <dc:subject>Air Temperature</dc:subject>
+      <dc:format>OGC:SOS</dc:format>
+      <dct:references scheme="OGC:SOS">http://www.neracoos.org/cgi-bin/sos/V1.0/oostethys_sos.cgi</dct:references>
+      <dct:abstract>NERACOOS supports data collected from buoys in the Gulf of Maine and Long Island Sound. The six Gulf of Maine buoys carry a comprehensive sensor suite that includes the full complement of meteorological sensors carried by the standard NDBC buoys, and in addition commonly include atmospheric visibility, surface currents, water-column current profiles, temperature and conductivity, and fluorescence (for chlorophyll a estimation) and backscatter at multiple depths.  In L [...]
+      <dc:creator>Eric Bridger</dc:creator>
+      <dc:publisher>NERACOOS</dc:publisher>
+      <dc:contributor>Eric Bridger</dc:contributor>
+      <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:UpperCorner>47.79 -54.05</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>GIN SOS</dc:title>
+      <dc:type>service</dc:type>
+      <dc:subject>groundwater level</dc:subject>
+      <dc:subject>monitoring</dc:subject>
+      <dc:subject>timeseries</dc:subject>
+      <dc:subject>Alberta</dc:subject>
+      <dc:subject>Ontario</dc:subject>
+      <dc:subject>Nova Scotia</dc:subject>
+      <dc:format>OGC:SOS</dc:format>
+      <dct:references scheme="OGC:SOS">http://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</dct:references>
+      <dct:abstract>Historical groundwater  level  monitoring stations from Alberta, Ontario and Nova Scotia. This SOS web service delivers the data using OGC's WaterML 2.0. The SOS service federates data from various  provincial  sources and publishes  them as a single service.   Many monitoring stations also have water well characteristics available  through the  GIN WFS  web service.</dct:abstract>
+      <dc:creator>Boyan Brodaric</dc:creator>
+      <dc:publisher>Geological Survey of Canada, Earth Sciences Sector, Natural Resources Canada, Government of Canada</dc:publisher>
+      <dc:contributor>Boyan Brodaric</dc:contributor>
+      <dc:source>http://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</dc:source>
+      <dc:rights>NONE</dc:rights>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>41.0 -120.0</ows:LowerCorner>
+        <ows:UpperCorner>60.0 -60.0</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
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
new file mode 100644
index 0000000..af710b4
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-sos-iso.xml
@@ -0,0 +1,833 @@
+<?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="2" numberOfRecordsReturned="2" 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:organisationName>
+            <gco:CharacterString>Eric Bridger</gco:CharacterString>
+          </gmd:organisationName>
+        </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>Northeastern Regional Association of Coastal Ocean Observing Systems</gco:CharacterString>
+              </gmd:title>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:abstract>
+            <gco:CharacterString>NERACOOS supports data collected from buoys in the Gulf of Maine and Long Island Sound. The six Gulf of Maine buoys carry a comprehensive sensor suite that includes the full complement of meteorological sensors carried by the standard NDBC buoys, and in addition commonly include atmospheric visibility, surface currents, water-column current profiles, temperature and conductivity, and fluorescence (for chlorophyll a estimation) and backscatter at multiple  [...]
+          </gmd:abstract>
+          <gmd:descriptiveKeywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString>NERACOOS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>SOS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>OCEANOGRAPHY</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Ocean Observations</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Gulf of Maine</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Long Island Sound</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Narragansett Bay</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Cape Cod</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Boston Harbor</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Buzzards Bay</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Weather</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Ocean Currents</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Water Temperature</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Salinity</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Winds</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Waves</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Ocean Color</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>GoMOOS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>LISICOS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Univ. of New Hampshire</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>MVCO</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Air Temperature</gco:CharacterString>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </gmd:descriptiveKeywords>
+          <gmd:language>
+            <gco:CharacterString/>
+          </gmd:language>
+          <srv:serviceType>
+            <gco:LocalName>OGC:SOS</gco:LocalName>
+          </srv:serviceType>
+          <srv:serviceTypeVersion>
+            <gco:CharacterString>1.0.0</gco:CharacterString>
+          </srv:serviceTypeVersion>
+          <srv:keywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString>NERACOOS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>SOS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>OCEANOGRAPHY</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Ocean Observations</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Gulf of Maine</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Long Island Sound</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Narragansett Bay</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Cape Cod</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Boston Harbor</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Buzzards Bay</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Weather</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Ocean Currents</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Water Temperature</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Salinity</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Winds</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Waves</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Ocean Color</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>GoMOOS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>LISICOS</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Univ. of New Hampshire</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>MVCO</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Air Temperature</gco:CharacterString>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </srv:keywords>
+          <srv:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>-73.73</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>-54.05</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>40.88</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>47.79</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>GetObservation</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>CML</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>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>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <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>SMB-MO-04</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>LDLC3</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>CDIP154</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>CDIP176</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>ARTG</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>M01</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>N01</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>44039</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>SMB-MO-01</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>SMB-MO-05</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>D02</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>E02</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>E01</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>B01</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>EXRX</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>44098</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>WLIS</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>CO2</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>
+          </srv:coupledResource>
+          <srv:coupledResource>
+            <srv:SV_CoupledResource>
+              <srv:operationName>
+                <gco:CharacterString>GetObservation</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>MDS02</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>GREAT_BAY</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>I01</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>
+          </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://www.neracoos.org/cgi-bin/sos/V1.0/oostethys_sos.cgi</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetObservation</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://www.neracoos.org/cgi-bin/sos/V1.0/oostethys_sos.cgi</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>DescribeSensor</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://www.neracoos.org/cgi-bin/sos/V1.0/oostethys_sos.cgi</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </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="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"/>
+          <srv:operatesOn uuidref="CDIP176" 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-CDIP176"/>
+          <srv:operatesOn uuidref="ARTG" 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-ARTG"/>
+          <srv:operatesOn uuidref="M01" 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-M01"/>
+          <srv:operatesOn uuidref="N01" 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-N01"/>
+          <srv:operatesOn uuidref="44039" 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-44039"/>
+          <srv:operatesOn uuidref="SMB-MO-01" 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-01"/>
+          <srv:operatesOn uuidref="SMB-MO-05" 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-05"/>
+          <srv:operatesOn uuidref="D02" 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-D02"/>
+          <srv:operatesOn uuidref="E02" 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-E02"/>
+          <srv:operatesOn uuidref="E01" 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-E01"/>
+          <srv:operatesOn uuidref="B01" 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-B01"/>
+          <srv:operatesOn uuidref="EXRX" 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-EXRX"/>
+          <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="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="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>
+      <gmd:distributionInfo>
+        <gmd:MD_Distribution>
+          <gmd:transferOptions>
+            <gmd:MD_DigitalTransferOptions>
+              <gmd:onLine>
+                <gmd:CI_OnlineResource>
+                  <gmd:linkage>
+                    <gmd:URL>http://www.neracoos.org/cgi-bin/sos/V1.0/oostethys_sos.cgi</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>OGC:SOS</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>PYCSW_IDENTIFIER</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>OGC-SOS Sensor Observation Service</gco:CharacterString>
+                  </gmd:description>
+                </gmd:CI_OnlineResource>
+              </gmd:onLine>
+            </gmd:MD_DigitalTransferOptions>
+          </gmd:transferOptions>
+        </gmd:MD_Distribution>
+      </gmd:distributionInfo>
+    </gmd:MD_Metadata>
+    <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:organisationName>
+            <gco:CharacterString>Boyan Brodaric</gco:CharacterString>
+          </gmd:organisationName>
+        </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>GIN SOS</gco:CharacterString>
+              </gmd:title>
+            </gmd:CI_Citation>
+          </gmd:citation>
+          <gmd:abstract>
+            <gco:CharacterString>Historical groundwater  level  monitoring stations from Alberta, Ontario and Nova Scotia. This SOS web service delivers the data using OGC's WaterML 2.0. The SOS service federates data from various  provincial  sources and publishes  them as a single service.   Many monitoring stations also have water well characteristics available  through the  GIN WFS  web service.</gco:CharacterString>
+          </gmd:abstract>
+          <gmd:descriptiveKeywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString>groundwater level</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>monitoring</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>timeseries</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Alberta</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Ontario</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Nova Scotia</gco:CharacterString>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </gmd:descriptiveKeywords>
+          <gmd:language>
+            <gco:CharacterString/>
+          </gmd:language>
+          <srv:serviceType>
+            <gco:LocalName>OGC:SOS</gco:LocalName>
+          </srv:serviceType>
+          <srv:serviceTypeVersion>
+            <gco:CharacterString>2.0.0</gco:CharacterString>
+          </srv:serviceTypeVersion>
+          <srv:keywords>
+            <gmd:MD_Keywords>
+              <gmd:keyword>
+                <gco:CharacterString>groundwater level</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>monitoring</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>timeseries</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Alberta</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Ontario</gco:CharacterString>
+              </gmd:keyword>
+              <gmd:keyword>
+                <gco:CharacterString>Nova Scotia</gco:CharacterString>
+              </gmd:keyword>
+            </gmd:MD_Keywords>
+          </srv:keywords>
+          <srv:extent>
+            <gmd:EX_Extent>
+              <gmd:geographicElement>
+                <gmd:EX_GeographicBoundingBox>
+                  <gmd:westBoundLongitude>
+                    <gco:Decimal>-120.0</gco:Decimal>
+                  </gmd:westBoundLongitude>
+                  <gmd:eastBoundLongitude>
+                    <gco:Decimal>-60.0</gco:Decimal>
+                  </gmd:eastBoundLongitude>
+                  <gmd:southBoundLatitude>
+                    <gco:Decimal>41.0</gco:Decimal>
+                  </gmd:southBoundLatitude>
+                  <gmd:northBoundLatitude>
+                    <gco:Decimal>60.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>GetObservation</gco:CharacterString>
+              </srv:operationName>
+              <srv:identifier>
+                <gco:CharacterString>GW_LEVEL</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://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>DescribeSensor</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://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetObservation</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://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+              <srv:operationName>
+                <gco:CharacterString>GetFeatureOfInterest</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://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</gmd:URL>
+                  </gmd:linkage>
+                </gmd:CI_OnlineResource>
+              </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+          </srv:containsOperations>
+          <srv:operatesOn uuidref="GW_LEVEL" 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-GW_LEVEL"/>
+        </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://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</gmd:URL>
+                  </gmd:linkage>
+                  <gmd:protocol>
+                    <gco:CharacterString>OGC:SOS</gco:CharacterString>
+                  </gmd:protocol>
+                  <gmd:name>
+                    <gco:CharacterString>PYCSW_IDENTIFIER</gco:CharacterString>
+                  </gmd:name>
+                  <gmd:description>
+                    <gco:CharacterString>OGC-SOS Sensor Observation 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-dc.xml b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wms-dc.xml
new file mode 100644
index 0000000..fcf9fe5
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wms-dc.xml
@@ -0,0 +1,33 @@
+<?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.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>Wisconsin Lake Clarity</dc:title>
+      <dc:type>service</dc:type>
+      <dc:subject>SSEC</dc:subject>
+      <dc:subject>PAW</dc:subject>
+      <dc:subject>remote sensing</dc:subject>
+      <dc:subject>meteorology</dc:subject>
+      <dc:subject>atmospheric science</dc:subject>
+      <dc:subject>University of Wisconsin</dc:subject>
+      <dc:subject>Madison</dc:subject>
+      <dc:subject>weather</dc:subject>
+      <dc:subject>land</dc:subject>
+      <dc:format>OGC:WMS</dc:format>
+      <dct:references scheme="OGC:WMS">http://wmsserv2.ssec.wisc.edu/cgi-bin/mapserv?map=/home/wms/data/mapfiles/lakestsi.map</dct:references>
+      <dct:abstract>General: This server hosts a set of experimental OGC Web Services of remote sensing data products for use in a broad range of both desktop and mobile device clients.</dct:abstract>
+      <dc:creator>Dr. Sam Batzli</dc:creator>
+      <dc:publisher>Space Science and Engineering Center, University of Wisconsin-Madison</dc:publisher>
+      <dc:contributor>Dr. Sam Batzli</dc:contributor>
+      <dc:source>http://wmsserv2.ssec.wisc.edu/cgi-bin/mapserv?map=/home/wms/data/mapfiles/lakestsi.map</dc:source>
+      <dc:rights>The following attribution is required if published or reproduced: Source: Space Science and Engineering Center, University of Wisconsin-Madison</dc:rights>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>42.41 -93.03</ows:LowerCorner>
+        <ows:UpperCorner>47.13 -86.64</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wms-layer.xml b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wms-layer.xml
new file mode 100644
index 0000000..b5241f6
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Harvest-zzz-post-GetRecords-filter-wms-layer.xml
@@ -0,0 +1,29 @@
+<?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.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+      <dc:identifier>PYCSW_IDENTIFIER</dc:identifier>
+      <dc:title>Wisconsin Lake Clarity</dc:title>
+      <dc:type>dataset</dc:type>
+      <dc:subject>SSEC</dc:subject>
+      <dc:subject>PAW</dc:subject>
+      <dc:subject>remote sensing</dc:subject>
+      <dc:subject>meteorology</dc:subject>
+      <dc:subject>atmospheric science</dc:subject>
+      <dc:subject>University of Wisconsin</dc:subject>
+      <dc:subject>Madison</dc:subject>
+      <dc:subject>weather</dc:subject>
+      <dc:subject>land</dc:subject>
+      <dct:references scheme="OGC:WMS">http://wmsserv2.ssec.wisc.edu/cgi-bin/mapserv?map=/home/wms/data/mapfiles/lakestsi.map</dct:references>
+      <dct:references scheme="WWW:LINK-1.0-http--image-thumbnail">http://wmsserv2.ssec.wisc.edu/cgi-bin/mapserv?map=%2Fhome%2Fwms%2Fdata%2Fmapfiles%2Flakestsi.map&layers=LakeClarity&width=200&version=1.1.1&bbox=-93.0307%2C42.4104%2C-86.6404%2C47.1335&service=WMS&format=image%2Fpng&styles=&srs=EPSG%3A4326&request=GetMap&height=200</dct:references>
+      <dct:abstract>General: This server hosts a set of experimental OGC Web Services of remote sensing data products for use in a broad range of both desktop and mobile device clients.</dct:abstract>
+      <dc:source>http://wmsserv2.ssec.wisc.edu/cgi-bin/mapserv?map=/home/wms/data/mapfiles/lakestsi.map</dc:source>
+      <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326" dimensions="2">
+        <ows:LowerCorner>42.41 -93.03</ows:LowerCorner>
+        <ows:UpperCorner>47.13 -86.64</ows:UpperCorner>
+      </ows:BoundingBox>
+    </csw:Record>
+  </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
new file mode 100644
index 0000000..1a40334
--- /dev/null
+++ b/tests/expected/suites_harvesting_post_Transaction-000-delete-all.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>104</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Clear-000-delete-all.xml b/tests/expected/suites_manager_post_Clear-000-delete-all.xml
new file mode 100644
index 0000000..381db66
--- /dev/null
+++ b/tests/expected/suites_manager_post_Clear-000-delete-all.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_GetCapabilities.xml b/tests/expected/suites_manager_post_GetCapabilities.xml
new file mode 100644
index 0000000..d3b13a0
--- /dev/null
+++ b/tests/expected/suites_manager_post_GetCapabilities.xml
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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" xmlns: [...]
+  <ows:ServiceIdentification>
+    <ows:Title>pycsw Geospatial Catalogue</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="Transaction">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>Harvest.ResourceType</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+        <ows:Value>gmd:MD_Metadata</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedISOQueryables">
+        <ows:Value>apiso:DistanceValue</ows:Value>
+        <ows:Value>apiso:Abstract</ows:Value>
+        <ows:Value>apiso:RevisionDate</ows:Value>
+        <ows:Value>apiso:Subject</ows:Value>
+        <ows:Value>apiso:KeywordType</ows:Value>
+        <ows:Value>apiso:Title</ows:Value>
+        <ows:Value>apiso:CRS</ows:Value>
+        <ows:Value>apiso:PublicationDate</ows:Value>
+        <ows:Value>apiso:Type</ows:Value>
+        <ows:Value>apiso:AlternateTitle</ows:Value>
+        <ows:Value>apiso:BoundingBox</ows:Value>
+        <ows:Value>apiso:AnyText</ows:Value>
+        <ows:Value>apiso:ParentIdentifier</ows:Value>
+        <ows:Value>apiso:Modified</ows:Value>
+        <ows:Value>apiso:Operation</ows:Value>
+        <ows:Value>apiso:Format</ows:Value>
+        <ows:Value>apiso:TempExtent_end</ows:Value>
+        <ows:Value>apiso:DistanceUOM</ows:Value>
+        <ows:Value>apiso:OrganisationName</ows:Value>
+        <ows:Value>apiso:ServiceType</ows:Value>
+        <ows:Value>apiso:TempExtent_begin</ows:Value>
+        <ows:Value>apiso:ResourceLanguage</ows:Value>
+        <ows:Value>apiso:ServiceTypeVersion</ows:Value>
+        <ows:Value>apiso:OperatesOn</ows:Value>
+        <ows:Value>apiso:Denominator</ows:Value>
+        <ows:Value>apiso:HasSecurityConstraints</ows:Value>
+        <ows:Value>apiso:OperatesOnIdentifier</ows:Value>
+        <ows:Value>apiso:GeographicDescriptionCode</ows:Value>
+        <ows:Value>apiso:Language</ows:Value>
+        <ows:Value>apiso:Identifier</ows:Value>
+        <ows:Value>apiso:OperatesOnName</ows:Value>
+        <ows:Value>apiso:TopicCategory</ows:Value>
+        <ows:Value>apiso:CreationDate</ows:Value>
+        <ows:Value>apiso:CouplingType</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="AdditionalQueryables">
+        <ows:Value>apiso:Lineage</ows:Value>
+        <ows:Value>apiso:Classification</ows:Value>
+        <ows:Value>apiso:Creator</ows:Value>
+        <ows:Value>apiso:Relation</ows:Value>
+        <ows:Value>apiso:OtherConstraints</ows:Value>
+        <ows:Value>apiso:SpecificationTitle</ows:Value>
+        <ows:Value>apiso:ResponsiblePartyRole</ows:Value>
+        <ows:Value>apiso:SpecificationDateType</ows:Value>
+        <ows:Value>apiso:Degree</ows:Value>
+        <ows:Value>apiso:Contributor</ows:Value>
+        <ows:Value>apiso:ConditionApplyingToAccessAndUse</ows:Value>
+        <ows:Value>apiso:SpecificationDate</ows:Value>
+        <ows:Value>apiso:AccessConstraints</ows:Value>
+        <ows:Value>apiso:Publisher</ows:Value>
+      </ows:Constraint>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Operation name="Harvest">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ResourceType">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.opengis.net/wms</ows:Value>
+        <ows:Value>http://www.opengis.net/wfs</ows:Value>
+        <ows:Value>http://www.opengis.net/wcs</ows:Value>
+        <ows:Value>http://www.opengis.net/wps/1.0.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/1.0</ows:Value>
+        <ows:Value>http://www.opengis.net/sos/2.0</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmi</ows:Value>
+        <ows:Value>urn:geoss:waf</ows:Value>
+        <ows:Value>http://www.isotc211.org/2005/gmd</ows:Value>
+        <ows:Value>http://www.isotc211.org/schemas/2005/gmd/</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://geo.data.gov/geoportal/csw/discovery</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/expected/suites_manager_post_GetDomain-parameter.xml b/tests/expected/suites_manager_post_GetDomain-parameter.xml
new file mode 100644
index 0000000..01db252
--- /dev/null
+++ b/tests/expected/suites_manager_post_GetDomain-parameter.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetDomainResponse 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" x [...]
+  <csw:DomainValues type="csw:Record">
+    <csw:ParameterName>Harvest.ResourceType</csw:ParameterName>
+    <csw:ListOfValues>
+      <csw:Value>http://www.opengis.net/cat/csw/2.0.2</csw:Value>
+      <csw:Value>http://www.opengis.net/wms</csw:Value>
+      <csw:Value>http://www.opengis.net/wfs</csw:Value>
+      <csw:Value>http://www.opengis.net/wcs</csw:Value>
+      <csw:Value>http://www.opengis.net/wps/1.0.0</csw:Value>
+      <csw:Value>http://www.opengis.net/sos/1.0</csw:Value>
+      <csw:Value>http://www.opengis.net/sos/2.0</csw:Value>
+      <csw:Value>http://www.isotc211.org/2005/gmi</csw:Value>
+      <csw:Value>urn:geoss:waf</csw:Value>
+      <csw:Value>http://www.isotc211.org/2005/gmd</csw:Value>
+      <csw:Value>http://www.isotc211.org/schemas/2005/gmd/</csw:Value>
+      <csw:Value>http://www.w3.org/2005/Atom</csw:Value>
+      <csw:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</csw:Value>
+      <csw:Value>http://www.opengis.net/cat/csw/csdgm</csw:Value>
+    </csw:ListOfValues>
+  </csw:DomainValues>
+</csw:GetDomainResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-000-delete-all.xml b/tests/expected/suites_manager_post_Transaction-000-delete-all.xml
new file mode 100644
index 0000000..381db66
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-000-delete-all.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-dc-01-insert.xml b/tests/expected/suites_manager_post_Transaction-dc-01-insert.xml
new file mode 100644
index 0000000..2c8d849
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-dc-01-insert.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>1</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+  <csw:InsertResult>
+    <csw:BriefRecord>
+      <dc:identifier>xyz</dc:identifier>
+      <dc:title>pycsw Catalogue</dc:title>
+    </csw:BriefRecord>
+  </csw:InsertResult>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-dc-02-update-full.xml b/tests/expected/suites_manager_post_Transaction-dc-02-update-full.xml
new file mode 100644
index 0000000..7dd477c
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-dc-02-update-full.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>1</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-fgdc-01-insert.xml b/tests/expected/suites_manager_post_Transaction-fgdc-01-insert.xml
new file mode 100644
index 0000000..1fed608
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-fgdc-01-insert.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>1</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+  <csw:InsertResult>
+    <csw:BriefRecord>
+      <dc:identifier>foorecord</dc:identifier>
+      <dc:title>NCEP</dc:title>
+    </csw:BriefRecord>
+  </csw:InsertResult>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-fgdc-02-update-recprop.xml b/tests/expected/suites_manager_post_Transaction-fgdc-02-update-recprop.xml
new file mode 100644
index 0000000..7dd477c
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-fgdc-02-update-recprop.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>1</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-fgdc-03-delete-all.xml b/tests/expected/suites_manager_post_Transaction-fgdc-03-delete-all.xml
new file mode 100644
index 0000000..3558d43
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-fgdc-03-delete-all.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>2</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-iso-00-delete-all.xml b/tests/expected/suites_manager_post_Transaction-iso-00-delete-all.xml
new file mode 100644
index 0000000..381db66
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-iso-00-delete-all.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-iso-01-insert.xml b/tests/expected/suites_manager_post_Transaction-iso-01-insert.xml
new file mode 100644
index 0000000..99b5433
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-iso-01-insert.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>1</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+  <csw:InsertResult>
+    <csw:BriefRecord>
+      <dc:identifier>12345</dc:identifier>
+      <dc:title>pycsw record</dc:title>
+    </csw:BriefRecord>
+  </csw:InsertResult>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-iso-02-update-full.xml b/tests/expected/suites_manager_post_Transaction-iso-02-update-full.xml
new file mode 100644
index 0000000..7dd477c
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-iso-02-update-full.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>1</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-iso-03-update-recprop.xml b/tests/expected/suites_manager_post_Transaction-iso-03-update-recprop.xml
new file mode 100644
index 0000000..7dd477c
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-iso-03-update-recprop.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>1</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-iso-04-update-recprop-no-matches.xml b/tests/expected/suites_manager_post_Transaction-iso-04-update-recprop-no-matches.xml
new file mode 100644
index 0000000..381db66
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-iso-04-update-recprop-no-matches.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-iso-05-delete.xml b/tests/expected/suites_manager_post_Transaction-iso-05-delete.xml
new file mode 100644
index 0000000..6cb31a7
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-iso-05-delete.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>1</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_manager_post_Transaction-xxx-delete-all.xml b/tests/expected/suites_manager_post_Transaction-xxx-delete-all.xml
new file mode 100644
index 0000000..381db66
--- /dev/null
+++ b/tests/expected/suites_manager_post_Transaction-xxx-delete-all.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:TransactionResponse 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:TransactionSummary>
+    <csw:totalInserted>0</csw:totalInserted>
+    <csw:totalUpdated>0</csw:totalUpdated>
+    <csw:totalDeleted>0</csw:totalDeleted>
+  </csw:TransactionSummary>
+</csw:TransactionResponse>
diff --git a/tests/expected/suites_repofilter_post_GetRecordById-masked.xml b/tests/expected/suites_repofilter_post_GetRecordById-masked.xml
new file mode 100644
index 0000000..15857d5
--- /dev/null
+++ b/tests/expected/suites_repofilter_post_GetRecordById-masked.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:GetRecordByIdResponse 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/c [...]
diff --git a/tests/expected/suites_repofilter_post_GetRecords-all.xml b/tests/expected/suites_repofilter_post_GetRecords-all.xml
new file mode 100644
index 0000000..3e201b1
--- /dev/null
+++ b/tests/expected/suites_repofilter_post_GetRecords-all.xml
@@ -0,0 +1,37 @@
+<?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="3" numberOfRecordsReturned="3" recordSchema="http://www.opengis.net/cat/csw/2.0.2" elementSet="full">
+    <csw:Record>
+    <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography-Landforms</dc:subject>
+    <dct:spatial>FI-ES</dct:spatial>
+    <dct:abstract>Donec scelerisque pede ut nisl luctus accumsan. Quisque ultrices, lorem eget feugiat fringilla, lorem dui porttitor ante, cursus ultrices magna odio eu neque.</dct:abstract>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <dc:date>2006-03-26Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>47.595 -4.097</ows:LowerCorner>
+      <ows:UpperCorner>51.217 0.889</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+    <csw:Record>
+    <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Ñunç elementum</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Hydrography-Oceanographic</dc:subject>
+    <dc:date>2005-10-24Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>44.792 -6.171</ows:LowerCorner>
+      <ows:UpperCorner>51.126 -2.228</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
+  </csw:SearchResults>
+</csw:GetRecordsResponse>
diff --git a/tests/expected/suites_sru_get_explain.xml b/tests/expected/suites_sru_get_explain.xml
new file mode 100644
index 0000000..91fc757
--- /dev/null
+++ b/tests/expected/suites_sru_get_explain.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<zs:explainResponse xmlns:zd="http://www.loc.gov/zing/srw/diagnostic/" xmlns:zs="http://www.loc.gov/zing/srw/" xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:zr="http://explain.z3950.org/dtd/2.1/" xmlns:sru="http://www.loc.gov/zing/srw/">
+  <zs:version>1.1</zs:version>
+  <zs:record>
+    <zs:recordPacking>XML</zs:recordPacking>
+    <zs:recordSchema>http://explain.z3950.org/dtd/2.1/</zs:recordSchema>
+    <zs:recordData>
+      <zr:explain>
+        <zr:serverInfo method="GET POST SOAP" protocol="SRU" transport="http" version="1.1">
+          <zr:host>PYCSW_HOST</zr:host>
+          <zr:port>PYCSW_PORT</zr:port>
+          <zr:database>pycsw</zr:database>
+        </zr:serverInfo>
+        <zr:databaseInfo>
+          <zr:title lang="en" primary="true">pycsw Geospatial Catalogue</zr:title>
+          <zr:description lang="en" primary="true">pycsw is an OGC CSW server implementation written in Python</zr:description>
+        </zr:databaseInfo>
+        <zr:indexInfo>
+          <zr:set identifier="info:srw/cql-context-set/1/dc-v1.1" name="dc"/>
+          <zr:index id="1034">
+            <zr:title>format</zr:title>
+            <zr:map>
+              <zr:map set="dc">format</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="62">
+            <zr:title>abstract</zr:title>
+            <zr:map>
+              <zr:map set="dc">abstract</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="TBD">
+            <zr:title>contributor</zr:title>
+            <zr:map>
+              <zr:map set="dc">contributor</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="TBD">
+            <zr:title>relation</zr:title>
+            <zr:map>
+              <zr:map set="dc">relation</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="30">
+            <zr:title>date</zr:title>
+            <zr:map>
+              <zr:map set="dc">date</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="29">
+            <zr:title>subject</zr:title>
+            <zr:map>
+              <zr:map set="dc">subject</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="1018">
+            <zr:title>publisher</zr:title>
+            <zr:map>
+              <zr:map set="dc">publisher</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="TBD">
+            <zr:title>rights</zr:title>
+            <zr:map>
+              <zr:map set="dc">rights</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="TBD">
+            <zr:title>language</zr:title>
+            <zr:map>
+              <zr:map set="dc">language</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="4">
+            <zr:title>title</zr:title>
+            <zr:map>
+              <zr:map set="dc">title</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="1003">
+            <zr:title>creator</zr:title>
+            <zr:map>
+              <zr:map set="dc">creator</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="TBD">
+            <zr:title>modified</zr:title>
+            <zr:map>
+              <zr:map set="dc">modified</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="TBD">
+            <zr:title>source</zr:title>
+            <zr:map>
+              <zr:map set="dc">source</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="12">
+            <zr:title>identifier</zr:title>
+            <zr:map>
+              <zr:map set="dc">identifier</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index id="1031">
+            <zr:title>type</zr:title>
+            <zr:map>
+              <zr:map set="dc">type</zr:map>
+            </zr:map>
+          </zr:index>
+          <zr:index>
+            <zr:map>
+              <zr:name set="dc">title222</zr:name>
+            </zr:map>
+          </zr:index>
+        </zr:indexInfo>
+        <zr:schemaInfo>
+          <zr:schema identifier="info:srw/schema/1/dc-v1.1" name="dc">
+            <zr:title>Simple Dublin Core</zr:title>
+          </zr:schema>
+        </zr:schemaInfo>
+        <zr:configInfo>
+          <zr:default type="numberOfRecords">0</zr:default>
+        </zr:configInfo>
+      </zr:explain>
+    </zs:recordData>
+  </zs:record>
+</zs:explainResponse>
diff --git a/tests/expected/suites_sru_get_search.xml b/tests/expected/suites_sru_get_search.xml
new file mode 100644
index 0000000..e788077
--- /dev/null
+++ b/tests/expected/suites_sru_get_search.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<zs:searchRetrieveResponse xmlns:zd="http://www.loc.gov/zing/srw/diagnostic/" xmlns:zs="http://www.loc.gov/zing/srw/" xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:zr="http://explain.z3950.org/dtd/2.1/" xmlns:sru="http://www.loc.gov/zing/srw/">
+  <zs:version>1.1</zs:version>
+  <zs:numberOfRecords>5</zs:numberOfRecords>
+</zs:searchRetrieveResponse>
diff --git a/tests/expected/suites_sru_get_search_cql.xml b/tests/expected/suites_sru_get_search_cql.xml
new file mode 100644
index 0000000..ef71e1e
--- /dev/null
+++ b/tests/expected/suites_sru_get_search_cql.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<zs:searchRetrieveResponse xmlns:zd="http://www.loc.gov/zing/srw/diagnostic/" xmlns:zs="http://www.loc.gov/zing/srw/" xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:zr="http://explain.z3950.org/dtd/2.1/" xmlns:sru="http://www.loc.gov/zing/srw/">
+  <zs:version>1.1</zs:version>
+  <zs:numberOfRecords>2</zs:numberOfRecords>
+  <zs:record>
+    <zs:recordData>
+      <srw_dc:srw_dc xmlns:dc="http://purl.org/dc/elements/1.1/">
+        <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+        <dc:title>Lorem ipsum</dc:title>
+        <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      </srw_dc:srw_dc>
+    </zs:recordData>
+    <zs:recordPosition>-2</zs:recordPosition>
+  </zs:record>
+  <zs:recordSchema>info:srw/schema/1/dc-v1.1</zs:recordSchema>
+  <zs:recordPacking>xml</zs:recordPacking>
+  <zs:record>
+    <zs:recordData>
+      <srw_dc:srw_dc xmlns:dc="http://purl.org/dc/elements/1.1/">
+        <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+        <dc:title>Lorem ipsum dolor sit amet</dc:title>
+        <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      </srw_dc:srw_dc>
+    </zs:recordData>
+    <zs:recordPosition>-1</zs:recordPosition>
+  </zs:record>
+  <zs:recordSchema>info:srw/schema/1/dc-v1.1</zs:recordSchema>
+  <zs:recordPacking>xml</zs:recordPacking>
+</zs:searchRetrieveResponse>
diff --git a/tests/expected/suites_sru_get_search_maxrecords.xml b/tests/expected/suites_sru_get_search_maxrecords.xml
new file mode 100644
index 0000000..ef6da13
--- /dev/null
+++ b/tests/expected/suites_sru_get_search_maxrecords.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<zs:searchRetrieveResponse xmlns:zd="http://www.loc.gov/zing/srw/diagnostic/" xmlns:zs="http://www.loc.gov/zing/srw/" xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:zr="http://explain.z3950.org/dtd/2.1/" xmlns:sru="http://www.loc.gov/zing/srw/">
+  <zs:version>1.1</zs:version>
+  <zs:numberOfRecords>5</zs:numberOfRecords>
+  <zs:record>
+    <zs:recordData>
+      <srw_dc:srw_dc xmlns:dc="http://purl.org/dc/elements/1.1/">
+        <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+        <dc:title>Lorem ipsum</dc:title>
+        <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      </srw_dc:srw_dc>
+    </zs:recordData>
+    <zs:recordPosition>1</zs:recordPosition>
+  </zs:record>
+  <zs:recordSchema>info:srw/schema/1/dc-v1.1</zs:recordSchema>
+  <zs:recordPacking>xml</zs:recordPacking>
+  <zs:record>
+    <zs:recordData>
+      <srw_dc:srw_dc xmlns:dc="http://purl.org/dc/elements/1.1/">
+        <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+        <dc:title></dc:title>
+        <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      </srw_dc:srw_dc>
+    </zs:recordData>
+    <zs:recordPosition>2</zs:recordPosition>
+  </zs:record>
+  <zs:recordSchema>info:srw/schema/1/dc-v1.1</zs:recordSchema>
+  <zs:recordPacking>xml</zs:recordPacking>
+</zs:searchRetrieveResponse>
diff --git a/tests/expected/suites_sru_get_search_startrecord_maxrecords.xml b/tests/expected/suites_sru_get_search_startrecord_maxrecords.xml
new file mode 100644
index 0000000..ef6da13
--- /dev/null
+++ b/tests/expected/suites_sru_get_search_startrecord_maxrecords.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<zs:searchRetrieveResponse xmlns:zd="http://www.loc.gov/zing/srw/diagnostic/" xmlns:zs="http://www.loc.gov/zing/srw/" xmlns:srw_dc="info:srw/schema/1/dc-schema" xmlns:zr="http://explain.z3950.org/dtd/2.1/" xmlns:sru="http://www.loc.gov/zing/srw/">
+  <zs:version>1.1</zs:version>
+  <zs:numberOfRecords>5</zs:numberOfRecords>
+  <zs:record>
+    <zs:recordData>
+      <srw_dc:srw_dc xmlns:dc="http://purl.org/dc/elements/1.1/">
+        <dc:identifier>urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f</dc:identifier>
+        <dc:title>Lorem ipsum</dc:title>
+        <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+      </srw_dc:srw_dc>
+    </zs:recordData>
+    <zs:recordPosition>1</zs:recordPosition>
+  </zs:record>
+  <zs:recordSchema>info:srw/schema/1/dc-v1.1</zs:recordSchema>
+  <zs:recordPacking>xml</zs:recordPacking>
+  <zs:record>
+    <zs:recordData>
+      <srw_dc:srw_dc xmlns:dc="http://purl.org/dc/elements/1.1/">
+        <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+        <dc:title></dc:title>
+        <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+      </srw_dc:srw_dc>
+    </zs:recordData>
+    <zs:recordPosition>2</zs:recordPosition>
+  </zs:record>
+  <zs:recordSchema>info:srw/schema/1/dc-v1.1</zs:recordSchema>
+  <zs:recordPacking>xml</zs:recordPacking>
+</zs:searchRetrieveResponse>
diff --git a/tests/expected/suites_utf-8_post_GetCapabilities.xml b/tests/expected/suites_utf-8_post_GetCapabilities.xml
new file mode 100644
index 0000000..50c1746
--- /dev/null
+++ b/tests/expected/suites_utf-8_post_GetCapabilities.xml
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- PYCSW_VERSION -->
+<csw:Capabilities 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/csdgm" xml [...]
+  <ows:ServiceIdentification>
+    <ows:Title>ErrŹĆŁÓdd</ows:Title>
+    <ows:Abstract>pycsw is an OGC CSW server implementation written in Python</ows:Abstract>
+    <ows:Keywords>
+      <ows:Keyword>catalogue</ows:Keyword>
+      <ows:Keyword>discovery</ows:Keyword>
+      <ows:Type codeSpace="ISOTC211/19115">theme</ows:Type>
+    </ows:Keywords>
+    <ows:ServiceType codeSpace="OGC">CSW</ows:ServiceType>
+    <ows:ServiceTypeVersion>2.0.2</ows:ServiceTypeVersion>
+    <ows:Fees>None</ows:Fees>
+    <ows:AccessConstraints>None</ows:AccessConstraints>
+  </ows:ServiceIdentification>
+  <ows:ServiceProvider>
+    <ows:ProviderName>pycsw</ows:ProviderName>
+    <ows:ProviderSite xlink:type="simple" xlink:href="http://pycsw.org/"/>
+    <ows:ServiceContact>
+      <ows:IndividualName>Kralidis, Tom</ows:IndividualName>
+      <ows:PositionName>Senior Systems Scientist</ows:PositionName>
+      <ows:ContactInfo>
+        <ows:Phone>
+          <ows:Voice>+01-416-xxx-xxxx</ows:Voice>
+          <ows:Facsimile>+01-416-xxx-xxxx</ows:Facsimile>
+        </ows:Phone>
+        <ows:Address>
+          <ows:DeliveryPoint>TBA</ows:DeliveryPoint>
+          <ows:City>Toronto</ows:City>
+          <ows:AdministrativeArea>Ontario</ows:AdministrativeArea>
+          <ows:PostalCode>M9C 3Z9</ows:PostalCode>
+          <ows:Country>Canada</ows:Country>
+          <ows:ElectronicMailAddress>tomkralidis at gmail.com</ows:ElectronicMailAddress>
+        </ows:Address>
+        <ows:OnlineResource xlink:type="simple" xlink:href="http://kralidis.ca/"/>
+        <ows:HoursOfService>0800h - 1600h EST</ows:HoursOfService>
+        <ows:ContactInstructions>During hours of service.  Off on weekends.</ows:ContactInstructions>
+      </ows:ContactInfo>
+      <ows:Role codeSpace="ISOTC211/19115">pointOfContact</ows:Role>
+    </ows:ServiceContact>
+  </ows:ServiceProvider>
+  <ows:OperationsMetadata>
+    <ows:Operation name="GetCapabilities">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="sections">
+        <ows:Value>ServiceIdentification</ows:Value>
+        <ows:Value>ServiceProvider</ows:Value>
+        <ows:Value>OperationsMetadata</ows:Value>
+        <ows:Value>Filter_Capabilities</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRepositoryItem">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+    </ows:Operation>
+    <ows:Operation name="DescribeRecord">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="schemaLanguage">
+        <ows:Value>http://www.w3.org/XML/Schema</ows:Value>
+        <ows:Value>http://www.w3.org/TR/xmlschema-1/</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeName">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetDomain">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="ParameterName">
+        <ows:Value>GetRecords.outputFormat</ows:Value>
+        <ows:Value>GetRecords.outputSchema</ows:Value>
+        <ows:Value>GetRecords.CONSTRAINTLANGUAGE</ows:Value>
+        <ows:Value>GetRecords.resultType</ows:Value>
+        <ows:Value>GetRecords.typeNames</ows:Value>
+        <ows:Value>GetRecords.ElementSetName</ows:Value>
+        <ows:Value>GetCapabilities.sections</ows:Value>
+        <ows:Value>GetRecordById.outputFormat</ows:Value>
+        <ows:Value>GetRecordById.outputSchema</ows:Value>
+        <ows:Value>GetRecordById.ElementSetName</ows:Value>
+        <ows:Value>DescribeRecord.schemaLanguage</ows:Value>
+        <ows:Value>DescribeRecord.outputFormat</ows:Value>
+        <ows:Value>DescribeRecord.typeName</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecordById">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+    </ows:Operation>
+    <ows:Operation name="GetRecords">
+      <ows:DCP>
+        <ows:HTTP>
+          <ows:Get xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+          <ows:Post xlink:type="simple" xlink:href="http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg"/>
+        </ows:HTTP>
+      </ows:DCP>
+      <ows:Parameter name="outputFormat">
+        <ows:Value>application/xml</ows:Value>
+        <ows:Value>application/json</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="outputSchema">
+        <ows:Value>http://www.opengis.net/cat/csw/2.0.2</ows:Value>
+        <ows:Value>http://www.w3.org/2005/Atom</ows:Value>
+        <ows:Value>http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/</ows:Value>
+        <ows:Value>http://www.opengis.net/cat/csw/csdgm</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="CONSTRAINTLANGUAGE">
+        <ows:Value>FILTER</ows:Value>
+        <ows:Value>CQL_TEXT</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="resultType">
+        <ows:Value>hits</ows:Value>
+        <ows:Value>results</ows:Value>
+        <ows:Value>validate</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="typeNames">
+        <ows:Value>csw:Record</ows:Value>
+      </ows:Parameter>
+      <ows:Parameter name="ElementSetName">
+        <ows:Value>brief</ows:Value>
+        <ows:Value>summary</ows:Value>
+        <ows:Value>full</ows:Value>
+      </ows:Parameter>
+      <ows:Constraint name="SupportedDublinCoreQueryables">
+        <ows:Value>dc:contributor</ows:Value>
+        <ows:Value>dc:source</ows:Value>
+        <ows:Value>dc:language</ows:Value>
+        <ows:Value>dc:title</ows:Value>
+        <ows:Value>dc:subject</ows:Value>
+        <ows:Value>dc:creator</ows:Value>
+        <ows:Value>dc:type</ows:Value>
+        <ows:Value>ows:BoundingBox</ows:Value>
+        <ows:Value>dct:modified</ows:Value>
+        <ows:Value>dct:abstract</ows:Value>
+        <ows:Value>dc:relation</ows:Value>
+        <ows:Value>dc:date</ows:Value>
+        <ows:Value>dc:identifier</ows:Value>
+        <ows:Value>dc:publisher</ows:Value>
+        <ows:Value>dc:format</ows:Value>
+        <ows:Value>csw:AnyText</ows:Value>
+        <ows:Value>dc:rights</ows:Value>
+      </ows:Constraint>
+    </ows:Operation>
+    <ows:Parameter name="version">
+      <ows:Value>2.0.2</ows:Value>
+    </ows:Parameter>
+    <ows:Parameter name="service">
+      <ows:Value>CSW</ows:Value>
+    </ows:Parameter>
+    <ows:Constraint name="XPathQueryables">
+      <ows:Value>allowed</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="PostEncoding">
+      <ows:Value>XML</ows:Value>
+      <ows:Value>SOAP</ows:Value>
+    </ows:Constraint>
+    <ows:Constraint name="FederatedCatalogues">
+      <ows:Value>http://demo.pycsw.org/gisdata/csw</ows:Value>
+    </ows:Constraint>
+  </ows:OperationsMetadata>
+  <ogc:Filter_Capabilities>
+    <ogc:Spatial_Capabilities>
+      <ogc:GeometryOperands>
+        <ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>
+        <ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>
+      </ogc:GeometryOperands>
+      <ogc:SpatialOperators>
+        <ogc:SpatialOperator name="BBOX"/>
+        <ogc:SpatialOperator name="Beyond"/>
+        <ogc:SpatialOperator name="Contains"/>
+        <ogc:SpatialOperator name="Crosses"/>
+        <ogc:SpatialOperator name="Disjoint"/>
+        <ogc:SpatialOperator name="DWithin"/>
+        <ogc:SpatialOperator name="Equals"/>
+        <ogc:SpatialOperator name="Intersects"/>
+        <ogc:SpatialOperator name="Overlaps"/>
+        <ogc:SpatialOperator name="Touches"/>
+        <ogc:SpatialOperator name="Within"/>
+      </ogc:SpatialOperators>
+    </ogc:Spatial_Capabilities>
+    <ogc:Scalar_Capabilities>
+      <ogc:LogicalOperators/>
+      <ogc:ComparisonOperators>
+        <ogc:ComparisonOperator>Between</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>Like</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>
+        <ogc:ComparisonOperator>NullCheck</ogc:ComparisonOperator>
+      </ogc:ComparisonOperators>
+      <ogc:ArithmeticOperators>
+        <ogc:Functions>
+          <ogc:FunctionNames>
+            <ogc:FunctionName nArgs="1">length</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">lower</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">ltrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">rtrim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">trim</ogc:FunctionName>
+            <ogc:FunctionName nArgs="1">upper</ogc:FunctionName>
+          </ogc:FunctionNames>
+        </ogc:Functions>
+      </ogc:ArithmeticOperators>
+    </ogc:Scalar_Capabilities>
+    <ogc:Id_Capabilities>
+      <ogc:EID/>
+      <ogc:FID/>
+    </ogc:Id_Capabilities>
+  </ogc:Filter_Capabilities>
+</csw:Capabilities>
diff --git a/tests/gen_html.py b/tests/gen_html.py
new file mode 100644
index 0000000..e4be2cc
--- /dev/null
+++ b/tests/gen_html.py
@@ -0,0 +1,153 @@
+#!/usr/bin/python
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+import csv
+import os
+from urllib2 import quote
+
+JQUERY_VERSION = '1.9.0'
+
+print '''
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8"/>
+        <title>pycsw Tester</title>
+        <style type="text/css">
+            body {
+                background-color: #ffffff;
+                font-family: arial, verdana, sans-serif;
+                text-align: left;
+                float: left;
+            }
+            .flat {
+                border: 0px;
+            }
+        </style>
+        <script type="text/javascript" src="http://code.jquery.com/jquery-%s.min.js"></script>
+        <script type="text/javascript">
+            $(document).ready(function() {
+                $('.xml').change(function() {
+                    if ($(this).val() != 'none') {
+                        var arr = $(this).val().split(',');
+                        $.ajax({
+                            type: 'GET',
+                            url: arr[1],
+                            dataType: 'text',
+                            success: function(data) {
+                                $('.request').val(data);
+                                $('.server').val('../csw.py?config=' + arr[0]);
+                            }
+                        });
+                    }
+                });
+                $('.send').click(function() {
+                    $.ajax({
+                        type: 'POST',
+                        contentType: 'text/xml',
+                        url: $('.server').val(),
+                        data: $('.request').val(),
+                        dataType: 'text',
+                        success: function(data) {
+                            $('.response').val(data);
+                        },
+                        error: function(data1) {
+                            $('.response').val(data1.responseText);
+                        }
+                    });
+                });
+            });
+        </script>
+    </head>
+''' % JQUERY_VERSION
+
+print '''
+    <body>
+        <h2 class="header">pycsw Tester</h2>
+        <hr/>
+        <h3 class="header">HTTP POST</h3>
+        <form action="#" id="tests">
+            <table>
+                <tr>
+                    <th>Request</th>
+                    <th>Response</th>
+                </tr>
+                <tr>
+                    <td>
+                        <select class="xml">
+                            <option value="none">Select a CSW Request</option>'''
+
+for root, dirs, files in os.walk('suites'):
+    if files:
+        for sfile in files:
+            if os.path.splitext(sfile)[1] in ['.xml']:  # it's a POST request
+                query = '%s%s%s' % (root.replace(os.sep, '/'), '/', sfile)
+                print '                            <option value="tests/suites/%s/default.cfg,%s">%s</option>' % (root.split(os.sep)[1], query, query)
+print '''
+                        </select>
+                        <input type="button" class="send" value="Send"/>
+                    </td>
+                    <td>
+                        Server: <input type="text" size="40" class="server" value="../csw.py"/>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <textarea rows="20" cols="70" class="request"></textarea>
+                    </td>
+                    <td>
+                        <textarea rows="20" cols="70" class="response"></textarea>
+                    </td>
+                </tr>
+            </table>
+        </form>
+        <hr/>
+        <h3 class="header">HTTP GET</h3>
+            <ul>
+'''
+for root, dirs, files in os.walk('suites'):
+    if files:
+        for sfile in files:
+            if sfile == 'requests.txt':  # it's a list of GET requests
+                gets = csv.reader(open('%s%s%s' % (root.replace(os.sep, '/'), '/', sfile)))
+                for row in gets:
+                    baseurl, query_string = row[1].split('?')
+                    query = '%s?%s' % (baseurl.replace('PYCSW_SERVER', '../csw.py'), query_string.replace('&', '&'))
+                    print '<li><a href="%s">%s</a></li>' % (query, row[0])
+print '''
+            </ul>
+        <hr/>
+        <footer>
+            <a href="http://validator.w3.org/check?verbose=1&uri=referer" title="Valid HTML 5!"><img class="flat" src="http://www.w3.org/html/logo/downloads/HTML5_Badge_32.png" alt="Valid HTML 5!" height="32" width="32"/></a>
+            <a href="http://jigsaw.w3.org/css-validator/check/referer" title="Valid CSS!"><img class="flat" src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS!" height="31" width="88"/></a>
+        </footer>
+    </body>
+</html>
+'''
diff --git a/tests/index.html b/tests/index.html
new file mode 100644
index 0000000..93e304e
--- /dev/null
+++ b/tests/index.html
@@ -0,0 +1,332 @@
+
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8"/>
+        <title>pycsw Tester</title>
+        <style type="text/css">
+            body {
+                background-color: #ffffff;
+                font-family: arial, verdana, sans-serif;
+                text-align: left;
+                float: left;
+            }
+            .flat {
+                border: 0px;
+            }
+        </style>
+        <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.0.min.js"></script>
+        <script type="text/javascript">
+            $(document).ready(function() {
+                $('.xml').change(function() {
+                    if ($(this).val() != 'none') {
+                        var arr = $(this).val().split(',');
+                        $.ajax({
+                            type: 'GET',
+                            url: arr[1],
+                            dataType: 'text',
+                            success: function(data) {
+                                $('.request').val(data);
+                                $('.server').val('../csw.py?config=' + arr[0]);
+                            }
+                        });
+                    }
+                });
+                $('.send').click(function() {
+                    $.ajax({
+                        type: 'POST',
+                        contentType: 'text/xml',
+                        url: $('.server').val(),
+                        data: $('.request').val(),
+                        dataType: 'text',
+                        success: function(data) {
+                            $('.response').val(data);
+                        },
+                        error: function(data1) {
+                            $('.response').val(data1.responseText);
+                        }
+                    });
+                });
+            });
+        </script>
+    </head>
+
+
+    <body>
+        <h2 class="header">pycsw Tester</h2>
+        <hr/>
+        <h3 class="header">HTTP POST</h3>
+        <form action="#" id="tests">
+            <table>
+                <tr>
+                    <th>Request</th>
+                    <th>Response</th>
+                </tr>
+                <tr>
+                    <td>
+                        <select class="xml">
+                            <option value="none">Select a CSW Request</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/GetCapabilities.xml">suites/fgdc/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/fgdc/default.cfg,suites/fgdc/post/DescribeRecord.xml">suites/fgdc/post/DescribeRecord.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-wms.xml">suites/harvesting/post/Harvest-wms.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-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/GetCapabilities.xml">suites/harvesting/post/GetCapabilities.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-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/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-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-fgdc.xml">suites/harvesting/post/Harvest-fgdc.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-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-wps.xml">suites/harvesting/post/Harvest-wps.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-rdf.xml">suites/harvesting/post/Harvest-rdf.xml</option>
+                            <option value="tests/suites/harvesting/default.cfg,suites/harvesting/post/Harvest-csw.xml">suites/harvesting/post/Harvest-csw.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/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-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-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/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/GetCapabilities.xml">suites/manager/post/GetCapabilities.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/GetDomain-parameter.xml">suites/manager/post/GetDomain-parameter.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-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/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-iso-01-insert.xml">suites/manager/post/Transaction-iso-01-insert.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/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-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-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-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-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-iso-05-delete.xml">suites/manager/post/Transaction-iso-05-delete.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/GetCapabilities.xml">suites/ebrim/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/ebrim/default.cfg,suites/ebrim/post/DescribeRecord.xml">suites/ebrim/post/DescribeRecord.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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_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_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_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_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_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_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_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_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_66ae76b7-54ba-489b-a582-0f0633d96493.xml">suites/cite/data/Record_66ae76b7-54ba-489b-a582-0f0633d96493.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/GetCapabilities.xml">suites/atom/post/GetCapabilities.xml</option>
+                            <option value="tests/suites/atom/default.cfg,suites/atom/post/DescribeRecord.xml">suites/atom/post/DescribeRecord.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/GetCapabilities.xml">suites/dif/post/GetCapabilities.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/post/GetRecords-filter-bbox.xml">suites/apiso/post/GetRecords-filter-bbox.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/GetRecordById-srv-brief.xml">suites/apiso/post/GetRecordById-srv-brief.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/GetRecordById-full-dc.xml">suites/apiso/post/GetRecordById-full-dc.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/DescribeRecord.xml">suites/apiso/post/DescribeRecord.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-cql-title.xml">suites/apiso/post/GetRecords-cql-title.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-filter-anytext.xml">suites/apiso/post/GetRecords-filter-anytext.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/GetRecords-elementname.xml">suites/apiso/post/GetRecords-elementname.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/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_288404.xml">suites/apiso/data/T_ortho_RAS_1998_288404.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/test.xml">suites/apiso/data/test.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_288398.xml">suites/apiso/data/T_ortho_RAS_1998_288398.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_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_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/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_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_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_GR800P001800000015.xml">suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000015.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_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_pmoed_DTM_1996_276398.xml">suites/apiso/data/T_pmoed_DTM_1996_276398.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/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-function-bad.xml">suites/default/post/GetRecords-filter-function-bad.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-requestid.xml">suites/default/post/GetRecords-requestid.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-function.xml">suites/default/post/GetRecords-filter-function.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-filter-bbox.xml">suites/default/post/GetRecords-filter-bbox.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/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-bbox-reproject.xml">suites/default/post/GetRecords-filter-bbox-reproject.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/GetDomain-parameter.xml">suites/default/post/GetDomain-parameter.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/Exception-GetRecords-badsrsname.xml">suites/default/post/Exception-GetRecords-badsrsname.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/GetCapabilities-updatesequence.xml">suites/default/post/GetCapabilities-updatesequence.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/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-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-maxrecords.xml">suites/default/post/GetRecords-maxrecords.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-elementname.xml">suites/default/post/Exception-GetRecords-elementname.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/GetCapabilities-SOAP.xml">suites/default/post/GetCapabilities-SOAP.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/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-distributedsearch.xml">suites/default/post/GetRecords-distributedsearch.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/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-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-cql-title.xml">suites/default/post/GetRecords-cql-title.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/GetRecordById-json.xml">suites/default/post/GetRecordById-json.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/Harvest-response-handler.xml">suites/default/post/Harvest-response-handler.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/GetRecords-filter-anytext.xml">suites/default/post/GetRecords-filter-anytext.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/GetDomain-property.xml">suites/default/post/GetDomain-property.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/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/Harvest-default.xml">suites/default/post/Harvest-default.xml</option>
+
+                        </select>
+                        <input type="button" class="send" value="Send"/>
+                    </td>
+                    <td>
+                        Server: <input type="text" size="40" class="server" value="../csw.py"/>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <textarea rows="20" cols="70" class="request"></textarea>
+                    </td>
+                    <td>
+                        <textarea rows="20" cols="70" class="response"></textarea>
+                    </td>
+                </tr>
+            </table>
+        </form>
+        <hr/>
+        <h3 class="header">HTTP GET</h3>
+            <ul>
+
+<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/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>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&id=urn%3Auuid%3A9a669547-b69b-469f-a11f-2d875366bbdc">37aa90e2-6ff0-420c-af15-8b9463099a73</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities&acceptformats=message/example">3a8a3c47-455f-4f49-9078-03119f3e70b3</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById">4515831f-834a-4699-95f6-ab0c2cbfcfd0</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities&sections=">477b23a3-baa9-47c8-9541-5fe27735ed49</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&sErViCe=CSW&REQUEST=GetCapabilities&version=2.0.2">48f26761-3a9d-48db-bee1-da089f5fb857</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&Service=CSW&Version=2.0.2&Request=GetRecordById&OutputFormat=application/bogus_xml&id=urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2">4e38092f-1586-44b8-988e-0acfa5855916</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities&sections=OperationsMetadata">55c38f00-2553-42c1-99ab-33edbb561ad7</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=FOO&request=GetCapabilities">5ab5db18-c87a-4fbf-a8d8-b7289b09ac81</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&id=urn:uuid:ce8627a0-685c-11db-bd13-0800200c9a66">6a4f57ca-a1bd-4802-89c2-44860dbdb0f0</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&Service=CSW&Version=2.0.2&Request=GetRecordById&OutputSchema=http://www.w3.org/2005/Atom&Id=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f">6c375703-9c00-4aef-bec7-d2e964f849eb</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities">80f31def-4185-48b9-983a-960566918eae</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&SERVICE=CSW&REQUEST=GetCapabilities&ACCEPTVERSIONS=2006.10.29">8e2232ed-05d9-44ae-8b04-0911cbe6a507</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities">9697f0aa-3b6a-4125-83a5-61e8826127c4</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&Service=CSW&Version=2.0.2&Request=GetRecordById&ElementSetName=full&ID=urn%3Auuid%3Ae9330592-0932-474b-be34-c3a3bb67c7db">9bfd17fa-15dc-4a10-8fa7-b3cff7013dd7</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&id=urn:uuid:ce8627a0-685c-11db-bd13-0800200c9a66">b81c3595-06d6-4693-82ea-1ff8650755ac</a></li>
+<li><a href="../csw.py?config=tests/suites/cite/default.cfg&SERVICE=CSW&REQUEST=GetCapabilities&ACCEPTVERSIONS=2.0.2">ba5fc729-3b71-47a0-b7d0-42ec565cd185</a></li>
+<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/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/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/default/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities">GetCapabilities</a></li>
+<li><a href="../csw.py?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetCapabilitiese">GetCapabilities-invalid-request</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">GetRecords-all</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:A">GetRecords-sortby-asc</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: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/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>
+
+            </ul>
+        <hr/>
+        <footer>
+            <a href="http://validator.w3.org/check?verbose=1&uri=referer" title="Valid HTML 5!"><img class="flat" src="http://www.w3.org/html/logo/downloads/HTML5_Badge_32.png" alt="Valid HTML 5!" height="32" width="32"/></a>
+            <a href="http://jigsaw.w3.org/css-validator/check/referer" title="Valid CSS!"><img class="flat" src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS!" height="31" width="88"/></a>
+        </footer>
+    </body>
+</html>
+
diff --git a/tests/run_tests.py b/tests/run_tests.py
new file mode 100644
index 0000000..a06aae7
--- /dev/null
+++ b/tests/run_tests.py
@@ -0,0 +1,336 @@
+#!/usr/bin/python
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+# simple testing framework inspired by MapServer msautotest
+
+import csv
+import sys
+import os
+import getopt
+import glob
+import filecmp
+import re
+from pycsw.util import http_request
+
+
+def plural(num):
+    """Determine plurality given an integer"""
+    if num != 1:
+        return 's'
+    else:
+        return ''
+
+
+def get_validity(sexpected, sresult, soutfile, force_id_mask=False):
+    """Decipher whether the output passes, fails, or initializes"""
+    if not os.path.exists(sexpected):  # create expected file
+        expectedfile = open(sexpected, 'w')
+        expectedfile.write(normalize(sresult, force_id_mask))
+        expectedfile.close()
+        sstatus = 0
+    else:  # compare result with expected
+        if not os.path.exists('results'):
+            os.mkdir('results')
+        resultfile = open('results%s%s' % (os.sep, soutfile), 'wb')
+        resultfile.write(normalize(sresult, force_id_mask))
+        resultfile.close()
+        if filecmp.cmp(sexpected, 'results%s%s' % (os.sep, soutfile)):  # pass
+            os.remove('results%s%s' % (os.sep, soutfile))
+            sstatus = 1
+        else:  # fail
+            import difflib
+            diff = difflib.unified_diff(
+                open(sexpected).readlines(),
+                open('results%s%s' % (os.sep, soutfile)).readlines())
+            print '\n'.join(list(diff))
+            sstatus = -1
+    return sstatus
+
+
+def normalize(sresult, force_id_mask=False):
+    """Replace time, updateSequence and version specific values with generic
+    values"""
+
+    # XML responses
+    version = re.search('<!-- (.*) -->', sresult)
+    updatesequence = re.search('updateSequence="(\S+)"', sresult)
+    timestamp = re.search('timestamp="(.*)"', sresult)
+    timestamp2 = re.search('timeStamp="(.*)"', sresult)
+    zrhost = re.search('<zr:host>(.*)</zr:host>', sresult)
+    zrport = re.search('<zr:port>(.*)</zr:port>', sresult)
+
+    if version:
+        sresult = sresult.replace(version.group(0), '<!-- PYCSW_VERSION -->')
+    if updatesequence:
+        sresult = sresult.replace(updatesequence.group(0),
+                                  'updateSequence="PYCSW_UPDATESEQUENCE"')
+    if timestamp:
+        sresult = sresult.replace(timestamp.group(0),
+                                  'timestamp="PYCSW_TIMESTAMP"')
+    if timestamp2:
+        sresult = sresult.replace(timestamp2.group(0),
+                                  'timeStamp="PYCSW_TIMESTAMP"')
+    if zrport:
+        sresult = sresult.replace(zrport.group(0),
+                                  '<zr:port>PYCSW_PORT</zr:port>')
+    if zrhost:
+        sresult = sresult.replace(zrhost.group(0),
+                                  '<zr:host>PYCSW_HOST</zr:host>')
+
+    # for csw:HarvestResponse documents, mask identifiers
+    # which are dynamically generated for OWS endpoints
+    if sresult.find('HarvestResponse') != -1:
+        identifier = re.findall('<dc:identifier>(\S+)</dc:identifier>',
+                                sresult)
+        for i in identifier:
+            sresult = sresult.replace(i, 'PYCSW_IDENTIFIER')
+
+    # JSON responses
+    timestamp = re.search('"timestamp": "(.*?)"', sresult)
+
+    if timestamp:
+        sresult = sresult.replace(timestamp.group(0),
+                                  '"timestamp": "PYCSW_TIMESTAMP"')
+
+    # harvesting-based GetRecords/GetRecordById responses
+    if force_id_mask:
+        dcid = re.findall('<dc:identifier>(urn:uuid.*)</dc:identifier>', sresult)
+        isoid = re.findall('id="(urn:uuid.*)"', sresult)
+        isoid2 = re.findall('<gco:CharacterString>(urn:uuid.*)</gco', sresult)
+    
+        for d in dcid:
+            sresult = sresult.replace(d, 'PYCSW_IDENTIFIER')
+        for i in isoid:
+            sresult = sresult.replace(i, 'PYCSW_IDENTIFIER')
+        for i2 in isoid2:
+            sresult = sresult.replace(i2, 'PYCSW_IDENTIFIER')
+
+    return sresult
+
+def usage():
+    """Provide usage instructions"""
+    return '''
+NAME
+    run_tests.py - pycsw unit test testrunner
+
+SYNOPSIS
+    run_tests.py -u <url> [-l logfile] [-s suite1[,suite2]]
+
+    Available options:
+
+    -u    URL to test
+
+    -l    log results to file
+
+    -s    testsuites to run (comma-seperated list)
+
+    -d    database (SQLite3 [default], PostgreSQL, MySQL)
+
+    -r    run tests which harvest remote resources (default off)
+
+EXAMPLES
+
+    1.) default test example
+
+        run_tests.py -u http://localhost:8000/
+
+    2.) log results to logfile
+
+        run_tests.py -u http://localhost:8000/ -l /path/to/results.log
+
+    3.) run only specified testsuites
+
+        run_tests.py -u http://localhost:8000/ -s default,apiso
+
+    3.) run tests including remote harvest tests
+
+        run_tests.py -u http://localhost:8000/ -s default,apiso -r
+
+
+'''
+
+# main
+
+if len(sys.argv) < 2:
+    print usage()
+    sys.exit(1)
+
+URL = sys.argv[1]
+
+URL = None
+LOGFILE = None
+TESTSUITES = []
+
+PASSED = 0
+FAILED = 0
+WARNING = 0
+INITED = 0
+
+LOGWRITER = None
+DATABASE = 'SQLite3'
+REMOTE = False
+
+try:
+    OPTS, ARGS = getopt.getopt(sys.argv[1:], 'u:l:s:d:rh')
+except getopt.GetoptError, err:
+    print '\nERROR: %s' % err
+    print usage()
+    sys.exit(2)
+
+for o, a in OPTS:
+    if o == '-u':
+        URL = a
+    if o == '-l':
+        LOGFILE = a
+    if o == '-d':
+        DATABASE = a
+    if o == '-r':
+        REMOTE = True
+    if o == '-s':
+        TESTSUITES = a.split(',')
+    if o == '-h':  # dump help and exit
+        print usage()
+        sys.exit(3)
+
+print '\nRunning tests against %s' % URL
+
+if LOGFILE is not None:  # write detailed output to CSV
+    LOGWRITER = csv.writer(open(LOGFILE, 'wb'))
+    LOGWRITER.writerow(['url', 'configuration', 'testname', 'result'])
+
+if TESTSUITES:
+    if 'harvesting' in TESTSUITES:
+        REMOTE = True
+    TESTSUITES_LIST = ['suites%s%s' % (os.sep, x) for x in TESTSUITES]
+else:
+    TESTSUITES_LIST = glob.glob('suites%s*' % os.sep)
+
+for testsuite in TESTSUITES_LIST:
+    if not os.path.exists(testsuite):
+        raise RuntimeError('Testsuite %s not found' % testsuite)
+
+    if testsuite == 'suites%sharvesting' % os.sep and not REMOTE:
+        continue
+
+    force_id_mask = False
+    if testsuite in ['suites%smanager' % os.sep, 'suites%sharvesting' % os.sep]:
+        force_id_mask = True
+   
+    # get configuration
+    for cfg in glob.glob('%s%s*.cfg' % (testsuite, os.sep)):
+        print '\nTesting configuration %s' % cfg
+
+        for root, dirs, files in os.walk(testsuite):
+            if files:
+                for sfile in sorted(files):
+                    if os.path.splitext(sfile)[1] not in ['.xml', '.txt']:
+                        break
+
+                    if sfile == 'requests.txt':  # GET requests
+                        filename = '%s%s%s' % (root, os.sep, sfile)
+                        gets = csv.reader(open(filename))
+                        for row in gets:
+                            testfile = '%s%s%s' % (root, os.sep, sfile)
+                            request = ','.join(row[1:]).replace('PYCSW_SERVER',
+                                                                URL)
+                            outfile = '%s%s' % (root.replace(os.sep, '_'),
+                                                '_%s.xml' % row[0])
+                            expected = 'expected%s%s' % (os.sep, outfile)
+                            print '\n test %s:%s' % (testfile, row[0])
+
+                            result = http_request('GET', request)
+
+                            status = get_validity(expected, result, outfile,
+                                                  force_id_mask)
+
+                            if status == 1:
+                                print '  passed'
+                                PASSED += 1
+                            elif status == 0:
+                                print '  initialized'
+                                INITED += 1
+                            elif status == -1 and DATABASE == 'PostgreSQL':
+                                print '  warning: possible collation issue'
+                                WARNING += 1
+                            else:
+                                print '  FAILED'
+                                FAILED += 1
+
+                            if LOGWRITER is not None:
+                                LOGWRITER.writerow([URL, cfg,
+                                                    testfile, status])
+
+                    else:  # POST requests
+                        testfile = '%s%s%s' % (root, os.sep, sfile)
+                        if '%sdata' % os.sep in testfile:  # sample data
+                            break
+                        outfile = '%s%s' % (os.sep,
+                                            testfile.replace(os.sep, '_'))
+                        expected = 'expected%s%s' % (os.sep, outfile)
+                        print '\n test %s' % testfile
+
+                        # read test
+                        f = open(testfile)
+                        request = f.read()
+                        f.close()
+
+                        configkvp = 'config=tests%s%s' % (os.sep, cfg)
+                        url2 = '%s?%s' % (URL, configkvp)
+
+                        # invoke request
+                        result = http_request('POST', url2, request)
+
+                        status = get_validity(expected, result, outfile,
+                                              force_id_mask)
+
+                        if status == 1:
+                            print '  passed'
+                            PASSED += 1
+                        elif status == 0:
+                            print '  initialized'
+                            INITED += 1
+                        elif status == -1 and DATABASE == 'PostgreSQL':
+                            print '  warning: possible sorting collation issue'
+                            WARNING += 1
+                        else:
+                            print '  FAILED'
+                            FAILED += 1
+
+                        if LOGWRITER is not None:
+                            LOGWRITER.writerow([URL, cfg, testfile, status])
+
+print '\nResults (%d/%d - %.2f%%)' % \
+    (PASSED, PASSED + FAILED, float(PASSED) / float(PASSED + FAILED) * 100)
+print '   %d test%s passed' % (PASSED, plural(PASSED))
+print '   %d test%s warnings' % (WARNING, plural(WARNING))
+print '   %d test%s failed' % (FAILED, plural(FAILED))
+print '   %d test%s initialized' % (INITED, plural(INITED))
+
+sys.exit(FAILED)
diff --git a/tests/suites/apiso-inspire/default.cfg b/tests/suites/apiso-inspire/default.cfg
new file mode 100644
index 0000000..a721214
--- /dev/null
+++ b/tests/suites/apiso-inspire/default.cfg
@@ -0,0 +1,91 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/apiso-inspire/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+profiles=apiso
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=true
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/apiso-inspire/get/requests.txt b/tests/suites/apiso-inspire/get/requests.txt
new file mode 100644
index 0000000..862e409
--- /dev/null
+++ b/tests/suites/apiso-inspire/get/requests.txt
@@ -0,0 +1,2 @@
+GetCapabilities,PYCSW_SERVER?config=tests/suites/apiso-inspire/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities
+GetCapabilities-lang,PYCSW_SERVER?config=tests/suites/apiso-inspire/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities&lang=gre
diff --git a/tests/suites/apiso/data/3e9a8c05.xml b/tests/suites/apiso/data/3e9a8c05.xml
new file mode 100644
index 0000000..5c9c976
--- /dev/null
+++ b/tests/suites/apiso/data/3e9a8c05.xml
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8"?><gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/srv http://schemas.opengis.net/iso/19139/20060504/srv/srv.xsd" xmlns:srv="http://www.isotc211.org/2005/srv" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+<gmd:fileIdentifier>
+<gco:CharacterString>3e9a8c05</gco:CharacterString>
+</gmd:fileIdentifier>
+<gmd:language>
+<gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode>
+</gmd:language>
+<gmd:hierarchyLevel>
+<gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="service">service</gmd:MD_ScopeCode>
+</gmd:hierarchyLevel>
+<gmd:contact>
+<gmd:CI_ResponsibleParty>
+<gmd:organisationName>
+<gco:CharacterString>NTUA</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:address>
+<gmd:CI_Address>
+<gmd:electronicMailAddress>
+<gco:CharacterString>tzotsos at gmail.com</gco:CharacterString>
+</gmd:electronicMailAddress>
+</gmd:CI_Address>
+</gmd:address>
+</gmd:CI_Contact>
+</gmd:contactInfo>
+<gmd:role>
+<gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode" codeListValue="pointOfContact">pointOfContact</gmd:CI_RoleCode>
+</gmd:role>
+</gmd:CI_ResponsibleParty>
+</gmd:contact>
+<gmd:dateStamp>
+<gco:Date>2011-04-18</gco:Date>
+</gmd:dateStamp>
+<gmd:metadataStandardName>
+<gco:CharacterString>ISO19115</gco:CharacterString>
+</gmd:metadataStandardName>
+<gmd:metadataStandardVersion>
+<gco:CharacterString>2003/Cor.1:2006</gco:CharacterString>
+</gmd:metadataStandardVersion>
+<gmd:identificationInfo>
+<srv:SV_ServiceIdentification>
+<gmd:citation>
+<gmd:CI_Citation>
+<gmd:title>
+<gco:CharacterString>test Title</gco:CharacterString>
+</gmd:title>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>2011-04-19</gco:Date>
+</gmd:date>
+<gmd:dateType>
+<gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode>
+</gmd:dateType>
+</gmd:CI_Date>
+</gmd:date>
+<gmd:identifier>
+<gmd:RS_Identifier>
+<gmd:code>
+<gco:CharacterString>http://aiolos.survey.ntua.gr</gco:CharacterString>
+</gmd:code>
+<gmd:codeSpace>
+<gco:CharacterString>ogc</gco:CharacterString>
+</gmd:codeSpace>
+</gmd:RS_Identifier>
+</gmd:identifier>
+</gmd:CI_Citation>
+</gmd:citation>
+<gmd:abstract>
+<gco:CharacterString>test Abstract</gco:CharacterString>
+</gmd:abstract>
+<gmd:pointOfContact>
+<gmd:CI_ResponsibleParty>
+<gmd:organisationName>
+<gco:CharacterString>NTUA</gco:CharacterString>
+</gmd:organisationName>
+<gmd:contactInfo>
+<gmd:CI_Contact>
+<gmd:address>
+<gmd:CI_Address>
+<gmd:electronicMailAddress>
+<gco:CharacterString>tzotsos at gmail.com</gco:CharacterString>
+</gmd:electronicMailAddress>
+</gmd:CI_Address>
+</gmd:address>
+</gmd:CI_Contact>
+</gmd:contactInfo>
+<gmd:role>
+<gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode" codeListValue="owner">owner</gmd:CI_RoleCode>
+</gmd:role>
+</gmd:CI_ResponsibleParty>
+</gmd:pointOfContact>
+<gmd:descriptiveKeywords>
+<gmd:MD_Keywords>
+<gmd:keyword>
+<gco:CharacterString>Geographic viewer (humanGeographicViewer)</gco:CharacterString>
+</gmd:keyword>
+</gmd:MD_Keywords>
+</gmd:descriptiveKeywords>
+<gmd:descriptiveKeywords>
+<gmd:MD_Keywords>
+<gmd:keyword>
+<gco:CharacterString>administration</gco:CharacterString>
+</gmd:keyword>
+<gmd:thesaurusName>
+<gmd:CI_Citation>
+<gmd:title>
+<gco:CharacterString>GEMET Themes, version 2.3</gco:CharacterString>
+</gmd:title>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>2011-04-18</gco:Date>
+</gmd:date>
+<gmd:dateType>
+<gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode>
+</gmd:dateType>
+</gmd:CI_Date>
+</gmd:date>
+</gmd:CI_Citation>
+</gmd:thesaurusName>
+</gmd:MD_Keywords>
+</gmd:descriptiveKeywords>
+<gmd:resourceConstraints>
+<gmd:MD_Constraints>
+<gmd:useLimitation>
+<gco:CharacterString>Conditions unknown</gco:CharacterString>
+</gmd:useLimitation>
+</gmd:MD_Constraints>
+</gmd:resourceConstraints>
+<gmd:resourceConstraints>
+<gmd:MD_LegalConstraints>
+<gmd:otherConstraints>
+<gco:CharacterString>no limitation</gco:CharacterString>
+</gmd:otherConstraints>
+</gmd:MD_LegalConstraints>
+</gmd:resourceConstraints>
+<gmd:extent>
+<gmd:EX_Extent>
+<gmd:geographicElement>
+<gmd:EX_GeographicBoundingBox>
+<gmd:westBoundLongitude>
+<gco:Decimal>19.37</gco:Decimal>
+</gmd:westBoundLongitude>
+<gmd:eastBoundLongitude>
+<gco:Decimal>29.61</gco:Decimal>
+</gmd:eastBoundLongitude>
+<gmd:southBoundLatitude>
+<gco:Decimal>34.80</gco:Decimal>
+</gmd:southBoundLatitude>
+<gmd:northBoundLatitude>
+<gco:Decimal>41.75</gco:Decimal>
+</gmd:northBoundLatitude>
+</gmd:EX_GeographicBoundingBox>
+</gmd:geographicElement>
+<gmd:temporalElement>
+<gmd:EX_TemporalExtent>
+<gmd:extent>
+<gml:TimePeriod gml:id="IDcd3b1c4f-b5f7-439a-afc4-3317a4cd89be" xsi:type="gml:TimePeriodType">
+<gml:beginPosition>2011-04-18</gml:beginPosition>
+<gml:endPosition>2011-04-20</gml:endPosition>
+</gml:TimePeriod>
+</gmd:extent>
+</gmd:EX_TemporalExtent>
+</gmd:temporalElement>
+</gmd:EX_Extent>
+</gmd:extent>
+<srv:serviceType>
+<gco:LocalName>view</gco:LocalName>
+</srv:serviceType>
+<srv:operatesOn href=""/>
+</srv:SV_ServiceIdentification>
+</gmd:identificationInfo>
+<gmd:distributionInfo>
+<gmd:MD_Distribution>
+<gmd:distributionFormat>
+<gmd:MD_Format>
+<gmd:name gco:nilReason="inapplicable"/>
+<gmd:version gco:nilReason="inapplicable"/>
+</gmd:MD_Format>
+</gmd:distributionFormat>
+<gmd:transferOptions>
+<gmd:MD_DigitalTransferOptions>
+<gmd:onLine>
+<gmd:CI_OnlineResource>
+<gmd:linkage>
+<gmd:URL>http://aiolos.survey.ntua.gr/geoserver/wms</gmd:URL>
+</gmd:linkage>
+</gmd:CI_OnlineResource>
+</gmd:onLine>
+</gmd:MD_DigitalTransferOptions>
+</gmd:transferOptions>
+</gmd:MD_Distribution>
+</gmd:distributionInfo>
+<gmd:dataQualityInfo>
+<gmd:DQ_DataQuality>
+<gmd:scope>
+<gmd:DQ_Scope>
+<gmd:level>
+<gmd:MD_ScopeCode codeListValue="service" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">service</gmd:MD_ScopeCode>
+</gmd:level>
+</gmd:DQ_Scope>
+</gmd:scope>
+<gmd:report>
+<gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type">
+<gmd:measureIdentification>
+<gmd:RS_Identifier>
+<gmd:code>
+<gco:CharacterString>Conformity_001</gco:CharacterString>
+</gmd:code>
+<gmd:codeSpace>
+<gco:CharacterString>INSPIRE</gco:CharacterString>
+</gmd:codeSpace>
+</gmd:RS_Identifier>
+</gmd:measureIdentification>
+<gmd:result>
+<gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type">
+<gmd:specification>
+<gmd:CI_Citation>
+<gmd:title>
+<gco:CharacterString>Corrigendum to INSPIRE Metadata Regulation published in the Official Journal of the European Union, L 328, page 83</gco:CharacterString>
+</gmd:title>
+<gmd:date>
+<gmd:CI_Date>
+<gmd:date>
+<gco:Date>2009-12-15</gco:Date>
+</gmd:date>
+<gmd:dateType>
+<gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode>
+</gmd:dateType>
+</gmd:CI_Date>
+</gmd:date>
+</gmd:CI_Citation>
+</gmd:specification>
+<gmd:explanation>
+<gco:CharacterString>See the referenced specification</gco:CharacterString>
+</gmd:explanation>
+<gmd:pass>
+<gco:Boolean>true</gco:Boolean>
+</gmd:pass>
+</gmd:DQ_ConformanceResult>
+</gmd:result>
+</gmd:DQ_DomainConsistency>
+</gmd:report>
+</gmd:DQ_DataQuality>
+</gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000012.xml b/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000012.xml
new file mode 100644
index 0000000..de51883
--- /dev/null
+++ b/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000012.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>366f6257-19eb-4f20-ba78-0698ac4aae77</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>366f6257-19eb-4f20-ba78-0698ac4aae77</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000012.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_034c77cc-d473-4f5b-a7b2-8cc067031e21" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000013.xml b/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000013.xml
new file mode 100644
index 0000000..0de59fe
--- /dev/null
+++ b/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000013.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>75a7eb5e-336e-453d-ab06-209b1070d396</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>75a7eb5e-336e-453d-ab06-209b1070d396</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000013.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_dab8420e-8f42-43e1-a536-81bfe473aafb" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000014.xml b/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000014.xml
new file mode 100644
index 0000000..5ac2f71
--- /dev/null
+++ b/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000014.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>a7308c0a-b748-48e2-bab7-0a608a51d416</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>a7308c0a-b748-48e2-bab7-0a608a51d416</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000014.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_d9b49641-a998-4c82-a6e0-fe542e87cace" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000015.xml b/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000015.xml
new file mode 100644
index 0000000..63ff4cf
--- /dev/null
+++ b/tests/suites/apiso/data/T_aerfo_RAS_1991_GR800P001800000015.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>0173e0d7-6ea9-4407-b846-f29d6bfa9903</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>0173e0d7-6ea9-4407-b846-f29d6bfa9903</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000015.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>24.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>38.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_b3156b1e-f787-43a6-b0d0-3b3fcfdf9df9" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_ortho_RAS_1998_284404.xml b/tests/suites/apiso/data/T_ortho_RAS_1998_284404.xml
new file mode 100644
index 0000000..05d95c8
--- /dev/null
+++ b/tests/suites/apiso/data/T_ortho_RAS_1998_284404.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>de53e931-778a-4792-94ad-9fe507aca483</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Ortho</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2000-01-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>de53e931-778a-4792-94ad-9fe507aca483</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_ortho_RAS_1998_284404.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Ortho</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>21.478784</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>21.527317</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>39.76001</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>39.790341</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent [...]
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_b18997ad-2b7c-4a6b-9fdc-390e5eb6b157" xsi:type="gml:TimePeriodType"><gml:beginPosition>1997-01-01</gml:beginPosition><gml:endPosition>1999-01-01</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_ortho_RAS_1998_288395.xml b/tests/suites/apiso/data/T_ortho_RAS_1998_288395.xml
new file mode 100644
index 0000000..e02d4ec
--- /dev/null
+++ b/tests/suites/apiso/data/T_ortho_RAS_1998_288395.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>4a5109d7-9ce5-4197-a423-b5fa8c426dee</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Ortho</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2000-01-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>4a5109d7-9ce5-4197-a423-b5fa8c426dee</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_ortho_RAS_1998_288395.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Ortho</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>21.528333</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>21.576834</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>39.679999</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>39.710309</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Exten [...]
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_2eb8f264-0910-4309-b4fa-b48eec7a34ed" xsi:type="gml:TimePeriodType"><gml:beginPosition>1997-01-01</gml:beginPosition><gml:endPosition>1999-01-01</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_ortho_RAS_1998_288398.xml b/tests/suites/apiso/data/T_ortho_RAS_1998_288398.xml
new file mode 100644
index 0000000..8766c0c
--- /dev/null
+++ b/tests/suites/apiso/data/T_ortho_RAS_1998_288398.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>5f37e0f8-4fb1-4637-b959-b415058bdb68</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Ortho</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2000-01-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>5f37e0f8-4fb1-4637-b959-b415058bdb68</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_ortho_RAS_1998_288398.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Ortho</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>21.527369</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>21.575888</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>39.707004</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>39.737315</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Exten [...]
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_7dab177c-ff5e-48bb-bf72-2aa86b45a00c" xsi:type="gml:TimePeriodType"><gml:beginPosition>1997-01-01</gml:beginPosition><gml:endPosition>1999-01-01</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_ortho_RAS_1998_288401.xml b/tests/suites/apiso/data/T_ortho_RAS_1998_288401.xml
new file mode 100644
index 0000000..0ae753a
--- /dev/null
+++ b/tests/suites/apiso/data/T_ortho_RAS_1998_288401.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>f99cc358-f379-4e79-ab1e-cb2f7709f594</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Ortho</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2000-01-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>f99cc358-f379-4e79-ab1e-cb2f7709f594</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_ortho_RAS_1998_288401.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Ortho</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>21.526404</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>21.574941</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>39.734009</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>39.764321</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Exten [...]
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_1c330e3a-d324-48e6-b513-7259d826c8b3" xsi:type="gml:TimePeriodType"><gml:beginPosition>1997-01-01</gml:beginPosition><gml:endPosition>1999-01-01</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_ortho_RAS_1998_288404.xml b/tests/suites/apiso/data/T_ortho_RAS_1998_288404.xml
new file mode 100644
index 0000000..6dca0cf
--- /dev/null
+++ b/tests/suites/apiso/data/T_ortho_RAS_1998_288404.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>ae200a05-2800-40b8-b85d-8f8d007b9e30</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Ortho</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2000-01-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="publication">publication</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>ae200a05-2800-40b8-b85d-8f8d007b9e30</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_ortho_RAS_1998_288404.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Ortho</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>21.525437</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>21.573992</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>39.761015</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>39.791327</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Exten [...]
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_bc0e4b38-8b08-4959-98d3-14d88417c5e0" xsi:type="gml:TimePeriodType"><gml:beginPosition>1997-01-01</gml:beginPosition><gml:endPosition>1999-01-01</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_pmoed_DTM_1996_276395.xml b/tests/suites/apiso/data/T_pmoed_DTM_1996_276395.xml
new file mode 100644
index 0000000..2213557
--- /dev/null
+++ b/tests/suites/apiso/data/T_pmoed_DTM_1996_276395.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>a2744b0c-becd-426a-95a8-46e9850ccc6d</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>DTM</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-07</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>a2744b0c-becd-426a-95a8-46e9850ccc6d</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_pmoed_DTM_1996_276395.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>DTM</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Elevation</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.x [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>elevation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>19.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>30.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>34.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>42.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_76139ca2-3c98-46df-b10b-59dbdcfbca4a" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-07</gml:beginPosition><gml:endPosition>2009-10-07</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_pmoed_DTM_1996_276398.xml b/tests/suites/apiso/data/T_pmoed_DTM_1996_276398.xml
new file mode 100644
index 0000000..adf5486
--- /dev/null
+++ b/tests/suites/apiso/data/T_pmoed_DTM_1996_276398.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>0dc824a6-b555-46c1-bd7b-bc66cb91a70f</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>DTM</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-07</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>0dc824a6-b555-46c1-bd7b-bc66cb91a70f</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_pmoed_DTM_1996_276398.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>DTM</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Elevation</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.x [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>elevation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>19.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>30.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>34.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>42.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_e4f0c0b3-0942-488f-99aa-b4d99935c58f" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-07</gml:beginPosition><gml:endPosition>2009-10-07</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_pmoed_DTM_1996_276401.xml b/tests/suites/apiso/data/T_pmoed_DTM_1996_276401.xml
new file mode 100644
index 0000000..3432347
--- /dev/null
+++ b/tests/suites/apiso/data/T_pmoed_DTM_1996_276401.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>42c8e55a-2bf6-476d-a7c9-be3bcd697f13</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>DTM</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-07</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>42c8e55a-2bf6-476d-a7c9-be3bcd697f13</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_pmoed_DTM_1996_276401.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>DTM</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Elevation</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.x [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>elevation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>19.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>30.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>34.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>42.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_f5aa2378-a06a-43c8-8376-aa4e0353c00b" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-07</gml:beginPosition><gml:endPosition>2009-10-07</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_pmoed_DTM_1996_276404.xml b/tests/suites/apiso/data/T_pmoed_DTM_1996_276404.xml
new file mode 100644
index 0000000..ef23574
--- /dev/null
+++ b/tests/suites/apiso/data/T_pmoed_DTM_1996_276404.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>c3bf29d4-d60a-4959-a415-2c03fb0d4aef</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>DTM</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-07</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>c3bf29d4-d60a-4959-a415-2c03fb0d4aef</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_pmoed_DTM_1996_276404.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>DTM</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Elevation</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.x [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>elevation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>19.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>30.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>34.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>42.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_66a3642d-2f20-4364-80e0-b7e1f89b3ffc" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-07</gml:beginPosition><gml:endPosition>2009-10-07</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/T_pmoed_DTM_1996_280395.xml b/tests/suites/apiso/data/T_pmoed_DTM_1996_280395.xml
new file mode 100644
index 0000000..d65cce9
--- /dev/null
+++ b/tests/suites/apiso/data/T_pmoed_DTM_1996_280395.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>b8cc2388-5d0a-43d8-9473-0e86dd0396da</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:dateStamp><gco:Date>2009-10-07</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>DTM</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-07</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>b8cc2388-5d0a-43d8-9473-0e86dd0396da</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_pmoed_DTM_1996_280395.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>DTM</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Elevation</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.x [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:spatialResolution><gmd:MD_Resolution><gmd:equivalentScale><gmd:MD_RepresentativeFraction><gmd:denominator><gco:Integer>5000</gco:Integer></gmd:denominator></gmd:MD_RepresentativeFraction></gmd:equivalentScale></gmd:MD_Resolution></gmd:spatialResolution>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>elevation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>19.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>30.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>34.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>42.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_a5d334dc-72fa-4857-8c47-27d38ed13e94" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-07</gml:beginPosition><gml:endPosition>2009-10-07</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/data/pacioos-NS06agg.xml b/tests/suites/apiso/data/pacioos-NS06agg.xml
new file mode 100644
index 0000000..5d96364
--- /dev/null
+++ b/tests/suites/apiso/data/pacioos-NS06agg.xml
@@ -0,0 +1,1182 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmi:MI_Metadata xmlns:gml="http://www.opengis.net/gml/3.2"
+                 xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xmlns:gco="http://www.isotc211.org/2005/gco"
+                 xmlns:xs="http://www.w3.org/2001/XMLSchema"
+                 xmlns:gmd="http://www.isotc211.org/2005/gmd"
+                 xmlns:gmi="http://www.isotc211.org/2005/gmi"
+                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                 xmlns:srv="http://www.isotc211.org/2005/srv"
+                 xmlns:gmx="http://www.isotc211.org/2005/gmx"
+                 xmlns:gsr="http://www.isotc211.org/2005/gsr"
+                 xmlns:gss="http://www.isotc211.org/2005/gss"
+                 xmlns:gts="http://www.isotc211.org/2005/gts"
+                 xsi:schemaLocation="http://www.isotc211.org/2005/gmi http://www.ngdc.noaa.gov/metadata/published/xsd/schema.xsd">
+   <gmd:fileIdentifier>
+      <gco:CharacterString>NS06agg</gco:CharacterString>
+   </gmd:fileIdentifier>
+   <gmd:language>
+      <gmd:LanguageCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#LanguageCode"
+                        codeListValue="eng">eng</gmd:LanguageCode>
+   </gmd:language>
+   <gmd:characterSet>
+      <gmd:MD_CharacterSetCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_CharacterSetCode"
+                               codeListValue="UTF8">UTF8</gmd:MD_CharacterSetCode>
+   </gmd:characterSet>
+   <gmd:hierarchyLevel>
+      <gmd:MD_ScopeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_ScopeCode"
+                        codeListValue="dataset">dataset</gmd:MD_ScopeCode>
+   </gmd:hierarchyLevel>
+   <gmd:hierarchyLevel>
+      <gmd:MD_ScopeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_ScopeCode"
+                        codeListValue="service">service</gmd:MD_ScopeCode>
+   </gmd:hierarchyLevel>
+   <gmd:contact>
+      <gmd:CI_ResponsibleParty>
+         <gmd:individualName>
+            <gco:CharacterString>Margaret McManus</gco:CharacterString>
+         </gmd:individualName>
+         <gmd:organisationName>
+            <gco:CharacterString>University of Hawaii</gco:CharacterString>
+         </gmd:organisationName>
+         <gmd:contactInfo>
+            <gmd:CI_Contact>
+               <gmd:address>
+                  <gmd:CI_Address>
+                     <gmd:electronicMailAddress>
+                        <gco:CharacterString>mamc at hawaii.edu</gco:CharacterString>
+                     </gmd:electronicMailAddress>
+                  </gmd:CI_Address>
+               </gmd:address>
+               <gmd:onlineResource>
+                  <gmd:CI_OnlineResource>
+                     <gmd:linkage>
+                        <gmd:URL>http://www.soest.hawaii.edu/oceanography/faculty/mcmanus.html</gmd:URL>
+                     </gmd:linkage>
+                     <gmd:protocol>
+                        <gco:CharacterString>http</gco:CharacterString>
+                     </gmd:protocol>
+                     <gmd:applicationProfile>
+                        <gco:CharacterString>web browser</gco:CharacterString>
+                     </gmd:applicationProfile>
+                     <gmd:name>
+                        <gco:CharacterString/>
+                     </gmd:name>
+                     <gmd:description>
+                        <gco:CharacterString/>
+                     </gmd:description>
+                     <gmd:function>
+                        <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"
+                                                   codeListValue="information">information</gmd:CI_OnLineFunctionCode>
+                     </gmd:function>
+                  </gmd:CI_OnlineResource>
+               </gmd:onlineResource>
+            </gmd:CI_Contact>
+         </gmd:contactInfo>
+         <gmd:role>
+            <gmd:CI_RoleCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode"
+                             codeListValue="pointOfContact">pointOfContact</gmd:CI_RoleCode>
+         </gmd:role>
+      </gmd:CI_ResponsibleParty>
+   </gmd:contact>
+   <gmd:dateStamp>
+      <gco:Date>2014-04-16</gco:Date>
+   </gmd:dateStamp>
+   <gmd:metadataStandardName>
+      <gco:CharacterString>ISO 19115-2 Geographic Information - Metadata Part 2 Extensions for imagery and gridded data</gco:CharacterString>
+   </gmd:metadataStandardName>
+   <gmd:metadataStandardVersion>
+      <gco:CharacterString>ISO 19115-2:2009(E)</gco:CharacterString>
+   </gmd:metadataStandardVersion>
+   <gmd:spatialRepresentationInfo>
+      <gmd:MD_GridSpatialRepresentation>
+         <gmd:numberOfDimensions>
+            <gco:Integer>3</gco:Integer>
+         </gmd:numberOfDimensions>
+         <gmd:axisDimensionProperties>
+            <gmd:MD_Dimension>
+               <gmd:dimensionName>
+                  <gmd:MD_DimensionNameTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_DimensionNameTypeCode"
+                                                codeListValue="column">column</gmd:MD_DimensionNameTypeCode>
+               </gmd:dimensionName>
+               <gmd:dimensionSize>
+                  <gco:Integer>1</gco:Integer>
+               </gmd:dimensionSize>
+               <gmd:resolution>
+                  <gco:Measure uom="degrees_east">0.0</gco:Measure>
+               </gmd:resolution>
+            </gmd:MD_Dimension>
+         </gmd:axisDimensionProperties>
+         <gmd:axisDimensionProperties>
+            <gmd:MD_Dimension>
+               <gmd:dimensionName>
+                  <gmd:MD_DimensionNameTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_DimensionNameTypeCode"
+                                                codeListValue="row">row</gmd:MD_DimensionNameTypeCode>
+               </gmd:dimensionName>
+               <gmd:dimensionSize>
+                  <gco:Integer>1</gco:Integer>
+               </gmd:dimensionSize>
+               <gmd:resolution>
+                  <gco:Measure uom="degrees_north">0.0</gco:Measure>
+               </gmd:resolution>
+            </gmd:MD_Dimension>
+         </gmd:axisDimensionProperties>
+         <gmd:axisDimensionProperties>
+            <gmd:MD_Dimension>
+               <gmd:dimensionName>
+                  <gmd:MD_DimensionNameTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_DimensionNameTypeCode"
+                                                codeListValue="temporal">temporal</gmd:MD_DimensionNameTypeCode>
+               </gmd:dimensionName>
+               <gmd:dimensionSize>
+                  <gco:Integer>482760</gco:Integer>
+               </gmd:dimensionSize>
+               <gmd:resolution>
+                  <gco:Measure uom="seconds">252.0</gco:Measure>
+               </gmd:resolution>
+            </gmd:MD_Dimension>
+         </gmd:axisDimensionProperties>
+         <gmd:cellGeometry>
+            <gmd:MD_CellGeometryCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_CellGeometryCode"
+                                     codeListValue="area">area</gmd:MD_CellGeometryCode>
+         </gmd:cellGeometry>
+         <gmd:transformationParameterAvailability gco:nilReason="unknown"/>
+      </gmd:MD_GridSpatialRepresentation>
+   </gmd:spatialRepresentationInfo>
+   <gmd:identificationInfo>
+      <gmd:MD_DataIdentification id="DataIdentification">
+         <gmd:citation>
+            <gmd:CI_Citation>
+               <gmd:title>
+                  <gco:CharacterString>PacIOOS Nearshore Sensor 06: Pohnpei, Micronesia</gco:CharacterString>
+               </gmd:title>
+               <gmd:date>
+                  <gmd:CI_Date>
+                     <gmd:date>
+                        <gco:Date>2011-04-12</gco:Date>
+                     </gmd:date>
+                     <gmd:dateType>
+                        <gmd:CI_DateTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"
+                                             codeListValue="creation">creation</gmd:CI_DateTypeCode>
+                     </gmd:dateType>
+                  </gmd:CI_Date>
+               </gmd:date>
+               <gmd:date>
+                  <gmd:CI_Date>
+                     <gmd:date>
+                        <gco:Date>2011-04-19</gco:Date>
+                     </gmd:date>
+                     <gmd:dateType>
+                        <gmd:CI_DateTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"
+                                             codeListValue="issued">issued</gmd:CI_DateTypeCode>
+                     </gmd:dateType>
+                  </gmd:CI_Date>
+               </gmd:date>
+               <gmd:date>
+                  <gmd:CI_Date>
+                     <gmd:date>
+                        <gco:Date>2014-03-18</gco:Date>
+                     </gmd:date>
+                     <gmd:dateType>
+                        <gmd:CI_DateTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"
+                                             codeListValue="revision">revision</gmd:CI_DateTypeCode>
+                     </gmd:dateType>
+                  </gmd:CI_Date>
+               </gmd:date>
+               <gmd:identifier>
+                  <gmd:MD_Identifier>
+                     <gmd:authority>
+                        <gmd:CI_Citation>
+                           <gmd:title>
+                              <gco:CharacterString>org.pacioos</gco:CharacterString>
+                           </gmd:title>
+                           <gmd:date gco:nilReason="inapplicable"/>
+                        </gmd:CI_Citation>
+                     </gmd:authority>
+                     <gmd:code>
+                        <gco:CharacterString>NS06agg</gco:CharacterString>
+                     </gmd:code>
+                  </gmd:MD_Identifier>
+               </gmd:identifier>
+               <gmd:citedResponsibleParty>
+                  <gmd:CI_ResponsibleParty>
+                     <gmd:individualName>
+                        <gco:CharacterString>Margaret McManus</gco:CharacterString>
+                     </gmd:individualName>
+                     <gmd:organisationName>
+                        <gco:CharacterString>University of Hawaii</gco:CharacterString>
+                     </gmd:organisationName>
+                     <gmd:contactInfo>
+                        <gmd:CI_Contact>
+                           <gmd:address>
+                              <gmd:CI_Address>
+                                 <gmd:electronicMailAddress>
+                                    <gco:CharacterString>mamc at hawaii.edu</gco:CharacterString>
+                                 </gmd:electronicMailAddress>
+                              </gmd:CI_Address>
+                           </gmd:address>
+                           <gmd:onlineResource>
+                              <gmd:CI_OnlineResource>
+                                 <gmd:linkage>
+                                    <gmd:URL>http://www.soest.hawaii.edu/oceanography/faculty/mcmanus.html</gmd:URL>
+                                 </gmd:linkage>
+                                 <gmd:protocol>
+                                    <gco:CharacterString>http</gco:CharacterString>
+                                 </gmd:protocol>
+                                 <gmd:applicationProfile>
+                                    <gco:CharacterString>web browser</gco:CharacterString>
+                                 </gmd:applicationProfile>
+                                 <gmd:name>
+                                    <gco:CharacterString/>
+                                 </gmd:name>
+                                 <gmd:description>
+                                    <gco:CharacterString/>
+                                 </gmd:description>
+                                 <gmd:function>
+                                    <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"
+                                                               codeListValue="information">information</gmd:CI_OnLineFunctionCode>
+                                 </gmd:function>
+                              </gmd:CI_OnlineResource>
+                           </gmd:onlineResource>
+                        </gmd:CI_Contact>
+                     </gmd:contactInfo>
+                     <gmd:role>
+                        <gmd:CI_RoleCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode"
+                                         codeListValue="originator">originator</gmd:CI_RoleCode>
+                     </gmd:role>
+                  </gmd:CI_ResponsibleParty>
+               </gmd:citedResponsibleParty>
+               <gmd:citedResponsibleParty>
+                  <gmd:CI_ResponsibleParty>
+                     <gmd:individualName>
+                        <gco:CharacterString>Jim Potemra</gco:CharacterString>
+                     </gmd:individualName>
+                     <gmd:organisationName gco:nilReason="missing"/>
+                     <gmd:contactInfo gco:nilReason="missing"/>
+                     <gmd:role>
+                        <gmd:CI_RoleCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode"
+                                         codeListValue="distributor">distributor</gmd:CI_RoleCode>
+                     </gmd:role>
+                  </gmd:CI_ResponsibleParty>
+               </gmd:citedResponsibleParty>
+               <gmd:otherCitationDetails>
+                  <gco:CharacterString>Data produced by Dr. Margaret McManus (mamc at hawaii.edu). Point of contact: Gordon Walker (gwalker at hawaii.edu).</gco:CharacterString>
+               </gmd:otherCitationDetails>
+            </gmd:CI_Citation>
+         </gmd:citation>
+         <gmd:abstract>
+            <gco:CharacterString>The nearshore sensors are part of the Pacific Islands Ocean Observing System (PacIOOS) and are designed to measure a variety of ocean parameters at fixed point locations. NS06 is located at the dock in Pohnpei lagoon and is mounted to the bottom in about 1 meter of water. The instrument is a Sea-Bird Electronics model 16+ V2 coupled with a WET Labs ECO-FLNTUS combination sensor.</gco:CharacterString>
+         </gmd:abstract>
+         <gmd:purpose>
+            <gco:CharacterString>PacIOOS provides timely, reliable, and accurate ocean information to support a safe, clean, productive ocean and resilient coastal zone in the U.S. Pacific Islands region.</gco:CharacterString>
+         </gmd:purpose>
+         <gmd:credit>
+            <gco:CharacterString>The Pacific Islands Ocean Observing System (PacIOOS) is funded through the National Oceanic and Atmospheric Administration (NOAA) as a Regional Association within the U.S. Integrated Ocean Observing System (IOOS). PacIOOS is coordinated by the University of Hawaii School of Ocean and Earth Science and Technology (SOEST).</gco:CharacterString>
+         </gmd:credit>
+         <gmd:pointOfContact>
+            <gmd:CI_ResponsibleParty>
+               <gmd:individualName>
+                  <gco:CharacterString>Margaret McManus</gco:CharacterString>
+               </gmd:individualName>
+               <gmd:organisationName>
+                  <gco:CharacterString>University of Hawaii</gco:CharacterString>
+               </gmd:organisationName>
+               <gmd:contactInfo>
+                  <gmd:CI_Contact>
+                     <gmd:address>
+                        <gmd:CI_Address>
+                           <gmd:electronicMailAddress>
+                              <gco:CharacterString>mamc at hawaii.edu</gco:CharacterString>
+                           </gmd:electronicMailAddress>
+                        </gmd:CI_Address>
+                     </gmd:address>
+                     <gmd:onlineResource>
+                        <gmd:CI_OnlineResource>
+                           <gmd:linkage>
+                              <gmd:URL>http://www.soest.hawaii.edu/oceanography/faculty/mcmanus.html</gmd:URL>
+                           </gmd:linkage>
+                           <gmd:protocol>
+                              <gco:CharacterString>http</gco:CharacterString>
+                           </gmd:protocol>
+                           <gmd:applicationProfile>
+                              <gco:CharacterString>web browser</gco:CharacterString>
+                           </gmd:applicationProfile>
+                           <gmd:name>
+                              <gco:CharacterString/>
+                           </gmd:name>
+                           <gmd:description>
+                              <gco:CharacterString/>
+                           </gmd:description>
+                           <gmd:function>
+                              <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"
+                                                         codeListValue="information">information</gmd:CI_OnLineFunctionCode>
+                           </gmd:function>
+                        </gmd:CI_OnlineResource>
+                     </gmd:onlineResource>
+                  </gmd:CI_Contact>
+               </gmd:contactInfo>
+               <gmd:role>
+                  <gmd:CI_RoleCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode"
+                                   codeListValue="pointOfContact">pointOfContact</gmd:CI_RoleCode>
+               </gmd:role>
+            </gmd:CI_ResponsibleParty>
+         </gmd:pointOfContact>
+         <gmd:graphicOverview>
+           <gmd:MD_BrowseGraphic>
+             <gmd:fileName><gco:CharacterString>http://pacioos.org/metadata/browse/NS06agg.png</gco:CharacterString></gmd:fileName>
+             <gmd:fileDescription>
+               <gco:CharacterString>Sample image.</gco:CharacterString>
+             </gmd:fileDescription>
+           </gmd:MD_BrowseGraphic>
+         </gmd:graphicOverview>
+         <gmd:descriptiveKeywords>
+            <gmd:MD_Keywords>
+               <gmd:keyword>
+                  <gco:CharacterString>Oceans > Ocean Chemistry > Chlorophyll</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString> Oceans > Ocean Optics > Turbidity</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString> Oceans > Ocean Temperature > Water Temperature</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString> Oceans > Salinity/Density > Conductivity</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString> Oceans > Salinity/Density > Salinity</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString> Oceans > Water Quality</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:type>
+                  <gmd:MD_KeywordTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode"
+                                          codeListValue="theme">theme</gmd:MD_KeywordTypeCode>
+               </gmd:type>
+               <gmd:thesaurusName>
+                  <gmd:CI_Citation>
+                     <gmd:title>
+                        <gco:CharacterString>GCMD Science Keywords</gco:CharacterString>
+                     </gmd:title>
+                     <gmd:date gco:nilReason="unknown"/>
+                  </gmd:CI_Citation>
+               </gmd:thesaurusName>
+            </gmd:MD_Keywords>
+         </gmd:descriptiveKeywords>
+         <gmd:descriptiveKeywords>
+            <gmd:MD_Keywords>
+               <gmd:keyword>
+                  <gco:CharacterString>Ocean &gt; Pacific Ocean &gt; Western Pacific Ocean &gt; Micronesia &gt; Federated States of Micronesia</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>Ocean &gt; Pacific Ocean &gt; United States of America &gt; Territories</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>Federated States of Micronesia &gt; Pohnpei &gt; Pohnpei Lagoon</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:type>
+                  <gmd:MD_KeywordTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode"
+                                          codeListValue="place">place</gmd:MD_KeywordTypeCode>
+               </gmd:type>
+               <gmd:thesaurusName>
+                  <gmd:CI_Citation>
+                     <gmd:title>
+                        <gco:CharacterString>GCMD Location Keywords</gco:CharacterString>
+                     </gmd:title>
+                     <gmd:date gco:nilReason="unknown"/>
+                  </gmd:CI_Citation>
+               </gmd:thesaurusName>
+            </gmd:MD_Keywords>
+         </gmd:descriptiveKeywords>
+         <gmd:descriptiveKeywords>
+            <gmd:MD_Keywords>
+               <gmd:keyword>
+                  <gco:CharacterString>Pacific Islands Ocean Observing System (PacIOOS)</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:type>
+                  <gmd:MD_KeywordTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode"
+                                          codeListValue="project">project</gmd:MD_KeywordTypeCode>
+               </gmd:type>
+               <gmd:thesaurusName>
+                  <gmd:CI_Citation>
+                     <gmd:title>
+                        <gco:CharacterString>GCMD Project Keywords</gco:CharacterString>
+                     </gmd:title>
+                     <gmd:date gco:nilReason="unknown"/>
+                  </gmd:CI_Citation>
+               </gmd:thesaurusName>
+            </gmd:MD_Keywords>
+         </gmd:descriptiveKeywords>
+         <gmd:descriptiveKeywords>
+            <gmd:MD_Keywords>
+               <gmd:keyword>
+                  <gco:CharacterString>Pacific Islands Ocean Observing System (PacIOOS)</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:type>
+                  <gmd:MD_KeywordTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode"
+                                          codeListValue="dataCenter">dataCenter</gmd:MD_KeywordTypeCode>
+               </gmd:type>
+               <gmd:thesaurusName>
+                  <gmd:CI_Citation>
+                     <gmd:title>
+                        <gco:CharacterString>GCMD Data Center Keywords</gco:CharacterString>
+                     </gmd:title>
+                     <gmd:date gco:nilReason="unknown"/>
+                  </gmd:CI_Citation>
+               </gmd:thesaurusName>
+            </gmd:MD_Keywords>
+         </gmd:descriptiveKeywords>
+         <gmd:descriptiveKeywords>
+            <gmd:MD_Keywords>
+               <gmd:keyword>
+                  <gco:CharacterString>sea_water_temperature</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>sea_water_electrical_conductivity</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>sea_water_turbidity</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>mass_concentration_of_chlorophyll_in_sea_water</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>sea_water_salinity</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>depth</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>latitude</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>longitude</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:keyword>
+                  <gco:CharacterString>time</gco:CharacterString>
+               </gmd:keyword>
+               <gmd:type>
+                  <gmd:MD_KeywordTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode"
+                                          codeListValue="theme">theme</gmd:MD_KeywordTypeCode>
+               </gmd:type>
+               <gmd:thesaurusName>
+                  <gmd:CI_Citation>
+                     <gmd:title>
+                        <gco:CharacterString>CF-1.4</gco:CharacterString>
+                     </gmd:title>
+                     <gmd:date gco:nilReason="unknown"/>
+                  </gmd:CI_Citation>
+               </gmd:thesaurusName>
+            </gmd:MD_Keywords>
+         </gmd:descriptiveKeywords>
+         <gmd:resourceConstraints>
+            <gmd:MD_LegalConstraints>
+               <gmd:useLimitation>
+                  <gco:CharacterString>The data may be used and redistributed for free but is not intended for legal use, since it may contain inaccuracies. Neither the data Contributor, University of Hawaii, PacIOOS, NOAA, State of Hawaii nor the United States Government, nor any of their employees or contractors, makes any warranty, express or implied, including warranties of merchantability and fitness for a particular purpose, or assumes any legal liability for the accuracy, complete [...]
+               </gmd:useLimitation>
+            </gmd:MD_LegalConstraints>
+         </gmd:resourceConstraints>
+         <gmd:aggregationInfo>
+            <gmd:MD_AggregateInformation>
+               <gmd:aggregateDataSetName>
+                  <gmd:CI_Citation>
+                     <gmd:title>
+                        <gco:CharacterString>Pacific Islands Ocean Observing System (PacIOOS)</gco:CharacterString>
+                     </gmd:title>
+                     <gmd:date gco:nilReason="inapplicable"/>
+                  </gmd:CI_Citation>
+               </gmd:aggregateDataSetName>
+               <gmd:associationType>
+                  <gmd:DS_AssociationTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#DS_AssociationTypeCode"
+                                              codeListValue="largerWorkCitation">largerWorkCitation</gmd:DS_AssociationTypeCode>
+               </gmd:associationType>
+               <gmd:initiativeType>
+                  <gmd:DS_InitiativeTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#DS_InitiativeTypeCode"
+                                             codeListValue="project">project</gmd:DS_InitiativeTypeCode>
+               </gmd:initiativeType>
+            </gmd:MD_AggregateInformation>
+         </gmd:aggregationInfo>
+         <gmd:aggregationInfo>
+            <gmd:MD_AggregateInformation>
+               <gmd:aggregateDataSetIdentifier>
+                  <gmd:MD_Identifier>
+                     <gmd:authority>
+                        <gmd:CI_Citation>
+                           <gmd:title>
+                              <gco:CharacterString>Unidata Common Data Model</gco:CharacterString>
+                           </gmd:title>
+                           <gmd:date gco:nilReason="inapplicable"/>
+                        </gmd:CI_Citation>
+                     </gmd:authority>
+                     <gmd:code>
+                        <gco:CharacterString>Point</gco:CharacterString>
+                     </gmd:code>
+                  </gmd:MD_Identifier>
+               </gmd:aggregateDataSetIdentifier>
+               <gmd:associationType>
+                  <gmd:DS_AssociationTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#DS_AssociationTypeCode"
+                                              codeListValue="largerWorkCitation">largerWorkCitation</gmd:DS_AssociationTypeCode>
+               </gmd:associationType>
+               <gmd:initiativeType>
+                  <gmd:DS_InitiativeTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#DS_InitiativeTypeCode"
+                                             codeListValue="project">project</gmd:DS_InitiativeTypeCode>
+               </gmd:initiativeType>
+            </gmd:MD_AggregateInformation>
+         </gmd:aggregationInfo>
+         <gmd:language>
+            <gco:CharacterString>eng</gco:CharacterString>
+         </gmd:language>
+         <gmd:topicCategory>
+            <gmd:MD_TopicCategoryCode>climatologyMeteorologyAtmosphere</gmd:MD_TopicCategoryCode>
+         </gmd:topicCategory>
+         <gmd:extent>
+            <gmd:EX_Extent id="boundingExtent">
+               <gmd:geographicElement>
+                  <gmd:EX_GeographicBoundingBox id="boundingGeographicBoundingBox">
+                     <gmd:extentTypeCode>
+                        <gco:Boolean>1</gco:Boolean>
+                     </gmd:extentTypeCode>
+                     <gmd:westBoundLongitude>
+                        <gco:Decimal>158.22402954101562</gco:Decimal>
+                     </gmd:westBoundLongitude>
+                     <gmd:eastBoundLongitude>
+                        <gco:Decimal>158.22402954101562</gco:Decimal>
+                     </gmd:eastBoundLongitude>
+                     <gmd:southBoundLatitude>
+                        <gco:Decimal>6.955227375030518</gco:Decimal>
+                     </gmd:southBoundLatitude>
+                     <gmd:northBoundLatitude>
+                        <gco:Decimal>6.955227375030518</gco:Decimal>
+                     </gmd:northBoundLatitude>
+                  </gmd:EX_GeographicBoundingBox>
+               </gmd:geographicElement>
+               <gmd:temporalElement>
+                  <gmd:EX_TemporalExtent id="boundingTemporalExtent">
+                     <gmd:extent>
+                        <gml:TimePeriod gml:id="d249">
+                           <gml:description>seconds</gml:description>
+                           <gml:beginPosition>2010-05-07T00:00:00Z</gml:beginPosition>
+                           <gml:endPosition>2014-03-17T23:56:00Z</gml:endPosition>
+                        </gml:TimePeriod>
+                     </gmd:extent>
+                  </gmd:EX_TemporalExtent>
+               </gmd:temporalElement>
+               <gmd:verticalElement>
+                  <gmd:EX_VerticalExtent>
+                     <gmd:minimumValue>
+                        <gco:Real>-1.0</gco:Real>
+                     </gmd:minimumValue>
+                     <gmd:maximumValue>
+                        <gco:Real>-1.0</gco:Real>
+                     </gmd:maximumValue>
+                     <gmd:verticalCRS gco:nilReason="missing"/>
+                  </gmd:EX_VerticalExtent>
+               </gmd:verticalElement>
+            </gmd:EX_Extent>
+         </gmd:extent>
+      </gmd:MD_DataIdentification>
+   </gmd:identificationInfo>
+   <gmd:identificationInfo>
+      <srv:SV_ServiceIdentification id="OPeNDAP">
+         <gmd:citation>
+            <gmd:CI_Citation>
+               <gmd:title>
+                  <gco:CharacterString>PacIOOS Nearshore Sensor 06: Pohnpei, Micronesia</gco:CharacterString>
+               </gmd:title>
+               <gmd:date>
+                  <gmd:CI_Date>
+                     <gmd:date>
+                        <gco:Date>2011-04-12</gco:Date>
+                     </gmd:date>
+                     <gmd:dateType>
+                        <gmd:CI_DateTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"
+                                             codeListValue="creation">creation</gmd:CI_DateTypeCode>
+                     </gmd:dateType>
+                  </gmd:CI_Date>
+               </gmd:date>
+               <gmd:date>
+                  <gmd:CI_Date>
+                     <gmd:date>
+                        <gco:Date>2011-04-19</gco:Date>
+                     </gmd:date>
+                     <gmd:dateType>
+                        <gmd:CI_DateTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"
+                                             codeListValue="issued">issued</gmd:CI_DateTypeCode>
+                     </gmd:dateType>
+                  </gmd:CI_Date>
+               </gmd:date>
+               <gmd:date>
+                  <gmd:CI_Date>
+                     <gmd:date>
+                        <gco:Date>2014-03-18</gco:Date>
+                     </gmd:date>
+                     <gmd:dateType>
+                        <gmd:CI_DateTypeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode"
+                                             codeListValue="revision">revision</gmd:CI_DateTypeCode>
+                     </gmd:dateType>
+                  </gmd:CI_Date>
+               </gmd:date>
+               <gmd:citedResponsibleParty>
+                  <gmd:CI_ResponsibleParty>
+                     <gmd:individualName>
+                        <gco:CharacterString>Margaret McManus</gco:CharacterString>
+                     </gmd:individualName>
+                     <gmd:organisationName>
+                        <gco:CharacterString>University of Hawaii</gco:CharacterString>
+                     </gmd:organisationName>
+                     <gmd:contactInfo>
+                        <gmd:CI_Contact>
+                           <gmd:address>
+                              <gmd:CI_Address>
+                                 <gmd:electronicMailAddress>
+                                    <gco:CharacterString>mamc at hawaii.edu</gco:CharacterString>
+                                 </gmd:electronicMailAddress>
+                              </gmd:CI_Address>
+                           </gmd:address>
+                           <gmd:onlineResource>
+                              <gmd:CI_OnlineResource>
+                                 <gmd:linkage>
+                                    <gmd:URL>http://www.soest.hawaii.edu/oceanography/faculty/mcmanus.html</gmd:URL>
+                                 </gmd:linkage>
+                                 <gmd:protocol>
+                                    <gco:CharacterString>http</gco:CharacterString>
+                                 </gmd:protocol>
+                                 <gmd:applicationProfile>
+                                    <gco:CharacterString>web browser</gco:CharacterString>
+                                 </gmd:applicationProfile>
+                                 <gmd:name>
+                                    <gco:CharacterString/>
+                                 </gmd:name>
+                                 <gmd:description>
+                                    <gco:CharacterString/>
+                                 </gmd:description>
+                                 <gmd:function>
+                                    <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"
+                                                               codeListValue="information">information</gmd:CI_OnLineFunctionCode>
+                                 </gmd:function>
+                              </gmd:CI_OnlineResource>
+                           </gmd:onlineResource>
+                        </gmd:CI_Contact>
+                     </gmd:contactInfo>
+                     <gmd:role>
+                        <gmd:CI_RoleCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode"
+                                         codeListValue="originator">originator</gmd:CI_RoleCode>
+                     </gmd:role>
+                  </gmd:CI_ResponsibleParty>
+               </gmd:citedResponsibleParty>
+               <gmd:citedResponsibleParty>
+                  <gmd:CI_ResponsibleParty>
+                     <gmd:individualName>
+                        <gco:CharacterString>Jim Potemra</gco:CharacterString>
+                     </gmd:individualName>
+                     <gmd:organisationName gco:nilReason="missing"/>
+                     <gmd:contactInfo gco:nilReason="missing"/>
+                     <gmd:role>
+                        <gmd:CI_RoleCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode"
+                                         codeListValue="distributor">distributor</gmd:CI_RoleCode>
+                     </gmd:role>
+                  </gmd:CI_ResponsibleParty>
+               </gmd:citedResponsibleParty>
+            </gmd:CI_Citation>
+         </gmd:citation>
+         <gmd:abstract>
+            <gco:CharacterString>The nearshore sensors are part of the Pacific Islands Ocean Observing System (PacIOOS) and are designed to measure a variety of ocean parameters at fixed point locations. NS06 is located at the dock in Pohnpei lagoon and is mounted to the bottom in about 1 meter of water. The instrument is a Sea-Bird Electronics model 16+ V2 coupled with a WET Labs ECO-FLNTUS combination sensor.</gco:CharacterString>
+         </gmd:abstract>
+         <srv:serviceType>
+            <gco:LocalName>THREDDS OPeNDAP</gco:LocalName>
+         </srv:serviceType>
+         <srv:extent>
+            <gmd:EX_Extent>
+               <gmd:geographicElement>
+                  <gmd:EX_GeographicBoundingBox>
+                     <gmd:extentTypeCode>
+                        <gco:Boolean>1</gco:Boolean>
+                     </gmd:extentTypeCode>
+                     <gmd:westBoundLongitude>
+                        <gco:Decimal>158.22402954101562</gco:Decimal>
+                     </gmd:westBoundLongitude>
+                     <gmd:eastBoundLongitude>
+                        <gco:Decimal>158.22402954101562</gco:Decimal>
+                     </gmd:eastBoundLongitude>
+                     <gmd:southBoundLatitude>
+                        <gco:Decimal>6.955227375030518</gco:Decimal>
+                     </gmd:southBoundLatitude>
+                     <gmd:northBoundLatitude>
+                        <gco:Decimal>6.955227375030518</gco:Decimal>
+                     </gmd:northBoundLatitude>
+                  </gmd:EX_GeographicBoundingBox>
+               </gmd:geographicElement>
+               <gmd:temporalElement>
+                  <gmd:EX_TemporalExtent>
+                     <gmd:extent>
+                        <gml:TimePeriod gml:id="d249e94">
+                           <gml:beginPosition>2010-05-07T00:00:00Z</gml:beginPosition>
+                           <gml:endPosition>2014-03-17T23:56:00Z</gml:endPosition>
+                        </gml:TimePeriod>
+                     </gmd:extent>
+                  </gmd:EX_TemporalExtent>
+               </gmd:temporalElement>
+               <gmd:verticalElement>
+                  <gmd:EX_VerticalExtent>
+                     <gmd:minimumValue>
+                        <gco:Real>-1.0</gco:Real>
+                     </gmd:minimumValue>
+                     <gmd:maximumValue>
+                        <gco:Real>-1.0</gco:Real>
+                     </gmd:maximumValue>
+                     <gmd:verticalCRS gco:nilReason="missing"/>
+                  </gmd:EX_VerticalExtent>
+               </gmd:verticalElement>
+            </gmd:EX_Extent>
+         </srv:extent>
+         <srv:couplingType>
+            <srv:SV_CouplingType codeList="http://www.tc211.org/ISO19139/resources/codeList.xml#SV_CouplingType"
+                                 codeListValue="tight">tight</srv:SV_CouplingType>
+         </srv:couplingType>
+         <srv:containsOperations>
+            <srv:SV_OperationMetadata>
+               <srv:operationName>
+                  <gco:CharacterString>OPeNDAP Client Access</gco:CharacterString>
+               </srv:operationName>
+               <srv:DCP gco:nilReason="unknown"/>
+               <srv:connectPoint>
+                  <gmd:CI_OnlineResource>
+                     <gmd:linkage>
+                        <gmd:URL>http://oos.soest.hawaii.edu/thredds/dodsC/pacioos/nss/ns06agg</gmd:URL>
+                     </gmd:linkage>
+                     <gmd:name>
+                        <gco:CharacterString>OPeNDAP</gco:CharacterString>
+                     </gmd:name>
+                     <gmd:description>
+                        <gco:CharacterString>THREDDS OPeNDAP</gco:CharacterString>
+                     </gmd:description>
+                     <gmd:function>
+                        <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"
+                                                   codeListValue="download">download</gmd:CI_OnLineFunctionCode>
+                     </gmd:function>
+                  </gmd:CI_OnlineResource>
+               </srv:connectPoint>
+            </srv:SV_OperationMetadata>
+         </srv:containsOperations>
+         <srv:operatesOn xlink:href="#DataIdentification"/>
+      </srv:SV_ServiceIdentification>
+   </gmd:identificationInfo>
+   <gmd:contentInfo>
+      <gmi:MI_CoverageDescription>
+         <gmd:attributeDescription gco:nilReason="unknown"/>
+         <gmd:contentType gco:nilReason="unknown"/>
+         <gmd:dimension>
+            <gmd:MD_Band>
+               <gmd:sequenceIdentifier>
+                  <gco:MemberName>
+                     <gco:aName>
+                        <gco:CharacterString>temp</gco:CharacterString>
+                     </gco:aName>
+                     <gco:attributeType>
+                        <gco:TypeName>
+                           <gco:aName>
+                              <gco:CharacterString>float</gco:CharacterString>
+                           </gco:aName>
+                        </gco:TypeName>
+                     </gco:attributeType>
+                  </gco:MemberName>
+               </gmd:sequenceIdentifier>
+               <gmd:descriptor>
+                  <gco:CharacterString>Temperature (sea_water_temperature)</gco:CharacterString>
+               </gmd:descriptor>
+               <gmd:units xlink:href="http://example.org/someUnitsDictionary.xml#Celsius"/>
+            </gmd:MD_Band>
+         </gmd:dimension>
+         <gmd:dimension>
+            <gmd:MD_Band>
+               <gmd:sequenceIdentifier>
+                  <gco:MemberName>
+                     <gco:aName>
+                        <gco:CharacterString>cond</gco:CharacterString>
+                     </gco:aName>
+                     <gco:attributeType>
+                        <gco:TypeName>
+                           <gco:aName>
+                              <gco:CharacterString>float</gco:CharacterString>
+                           </gco:aName>
+                        </gco:TypeName>
+                     </gco:attributeType>
+                  </gco:MemberName>
+               </gmd:sequenceIdentifier>
+               <gmd:descriptor>
+                  <gco:CharacterString>Conductivity (sea_water_electrical_conductivity)</gco:CharacterString>
+               </gmd:descriptor>
+               <gmd:units xlink:href="http://example.org/someUnitsDictionary.xml#S%20m-1"/>
+            </gmd:MD_Band>
+         </gmd:dimension>
+         <gmd:dimension>
+            <gmd:MD_Band>
+               <gmd:sequenceIdentifier>
+                  <gco:MemberName>
+                     <gco:aName>
+                        <gco:CharacterString>turb</gco:CharacterString>
+                     </gco:aName>
+                     <gco:attributeType>
+                        <gco:TypeName>
+                           <gco:aName>
+                              <gco:CharacterString>float</gco:CharacterString>
+                           </gco:aName>
+                        </gco:TypeName>
+                     </gco:attributeType>
+                  </gco:MemberName>
+               </gmd:sequenceIdentifier>
+               <gmd:descriptor>
+                  <gco:CharacterString>Turbidity (sea_water_turbidity)</gco:CharacterString>
+               </gmd:descriptor>
+               <gmd:units xlink:href="http://example.org/someUnitsDictionary.xml#ntu"/>
+            </gmd:MD_Band>
+         </gmd:dimension>
+         <gmd:dimension>
+            <gmd:MD_Band>
+               <gmd:sequenceIdentifier>
+                  <gco:MemberName>
+                     <gco:aName>
+                        <gco:CharacterString>flor</gco:CharacterString>
+                     </gco:aName>
+                     <gco:attributeType>
+                        <gco:TypeName>
+                           <gco:aName>
+                              <gco:CharacterString>float</gco:CharacterString>
+                           </gco:aName>
+                        </gco:TypeName>
+                     </gco:attributeType>
+                  </gco:MemberName>
+               </gmd:sequenceIdentifier>
+               <gmd:descriptor>
+                  <gco:CharacterString>Chlorophyll (mass_concentration_of_chlorophyll_in_sea_water)</gco:CharacterString>
+               </gmd:descriptor>
+               <gmd:units xlink:href="http://example.org/someUnitsDictionary.xml#kg%20m-3"/>
+            </gmd:MD_Band>
+         </gmd:dimension>
+         <gmd:dimension>
+            <gmd:MD_Band>
+               <gmd:sequenceIdentifier>
+                  <gco:MemberName>
+                     <gco:aName>
+                        <gco:CharacterString>salt</gco:CharacterString>
+                     </gco:aName>
+                     <gco:attributeType>
+                        <gco:TypeName>
+                           <gco:aName>
+                              <gco:CharacterString>float</gco:CharacterString>
+                           </gco:aName>
+                        </gco:TypeName>
+                     </gco:attributeType>
+                  </gco:MemberName>
+               </gmd:sequenceIdentifier>
+               <gmd:descriptor>
+                  <gco:CharacterString>Salinity (sea_water_salinity)</gco:CharacterString>
+               </gmd:descriptor>
+               <gmd:units xlink:href="http://example.org/someUnitsDictionary.xml#1e-3"/>
+            </gmd:MD_Band>
+         </gmd:dimension>
+         <gmd:dimension>
+            <gmd:MD_Band>
+               <gmd:sequenceIdentifier>
+                  <gco:MemberName>
+                     <gco:aName>
+                        <gco:CharacterString>z</gco:CharacterString>
+                     </gco:aName>
+                     <gco:attributeType>
+                        <gco:TypeName>
+                           <gco:aName>
+                              <gco:CharacterString>float</gco:CharacterString>
+                           </gco:aName>
+                        </gco:TypeName>
+                     </gco:attributeType>
+                  </gco:MemberName>
+               </gmd:sequenceIdentifier>
+               <gmd:descriptor>
+                  <gco:CharacterString>depth below mean sea level (depth)</gco:CharacterString>
+               </gmd:descriptor>
+               <gmd:units xlink:href="http://example.org/someUnitsDictionary.xml#meters"/>
+            </gmd:MD_Band>
+         </gmd:dimension>
+         <gmd:dimension>
+            <gmd:MD_Band>
+               <gmd:sequenceIdentifier>
+                  <gco:MemberName>
+                     <gco:aName>
+                        <gco:CharacterString>lat</gco:CharacterString>
+                     </gco:aName>
+                     <gco:attributeType>
+                        <gco:TypeName>
+                           <gco:aName>
+                              <gco:CharacterString>float</gco:CharacterString>
+                           </gco:aName>
+                        </gco:TypeName>
+                     </gco:attributeType>
+                  </gco:MemberName>
+               </gmd:sequenceIdentifier>
+               <gmd:descriptor>
+                  <gco:CharacterString>Latitude (latitude)</gco:CharacterString>
+               </gmd:descriptor>
+               <gmd:units xlink:href="http://example.org/someUnitsDictionary.xml#degrees_north"/>
+            </gmd:MD_Band>
+         </gmd:dimension>
+         <gmd:dimension>
+            <gmd:MD_Band>
+               <gmd:sequenceIdentifier>
+                  <gco:MemberName>
+                     <gco:aName>
+                        <gco:CharacterString>lon</gco:CharacterString>
+                     </gco:aName>
+                     <gco:attributeType>
+                        <gco:TypeName>
+                           <gco:aName>
+                              <gco:CharacterString>float</gco:CharacterString>
+                           </gco:aName>
+                        </gco:TypeName>
+                     </gco:attributeType>
+                  </gco:MemberName>
+               </gmd:sequenceIdentifier>
+               <gmd:descriptor>
+                  <gco:CharacterString>Longitude (longitude)</gco:CharacterString>
+               </gmd:descriptor>
+               <gmd:units xlink:href="http://example.org/someUnitsDictionary.xml#degrees_east"/>
+            </gmd:MD_Band>
+         </gmd:dimension>
+         <gmd:dimension>
+            <gmd:MD_Band>
+               <gmd:sequenceIdentifier>
+                  <gco:MemberName>
+                     <gco:aName>
+                        <gco:CharacterString>time</gco:CharacterString>
+                     </gco:aName>
+                     <gco:attributeType>
+                        <gco:TypeName>
+                           <gco:aName>
+                              <gco:CharacterString>float</gco:CharacterString>
+                           </gco:aName>
+                        </gco:TypeName>
+                     </gco:attributeType>
+                  </gco:MemberName>
+               </gmd:sequenceIdentifier>
+               <gmd:descriptor>
+                  <gco:CharacterString>Time (time)</gco:CharacterString>
+               </gmd:descriptor>
+               <gmd:units xlink:href="http://example.org/someUnitsDictionary.xml#minutes%20since%202008-01-01%2000%3A00%3A00"/>
+            </gmd:MD_Band>
+         </gmd:dimension>
+      </gmi:MI_CoverageDescription>
+   </gmd:contentInfo>
+   <gmd:distributionInfo>
+      <gmd:MD_Distribution>
+         <gmd:distributor>
+            <gmd:MD_Distributor>
+               <gmd:distributorContact>
+                  <gmd:CI_ResponsibleParty>
+                     <gmd:individualName gco:nilReason="missing"/>
+                     <gmd:organisationName>
+                        <gco:CharacterString>Pacific Islands Ocean Observing System (PacIOOS)</gco:CharacterString>
+                     </gmd:organisationName>
+                     <gmd:contactInfo>
+                        <gmd:CI_Contact>
+                           <gmd:address>
+                              <gmd:CI_Address>
+                                 <gmd:electronicMailAddress>
+                                    <gco:CharacterString>jimp at hawaii.edu</gco:CharacterString>
+                                 </gmd:electronicMailAddress>
+                              </gmd:CI_Address>
+                           </gmd:address>
+                           <gmd:onlineResource>
+                              <gmd:CI_OnlineResource>
+                                 <gmd:linkage>
+                                    <gmd:URL>http://pacioos.org</gmd:URL>
+                                 </gmd:linkage>
+                                 <gmd:protocol>
+                                    <gco:CharacterString>http</gco:CharacterString>
+                                 </gmd:protocol>
+                                 <gmd:applicationProfile>
+                                    <gco:CharacterString>web browser</gco:CharacterString>
+                                 </gmd:applicationProfile>
+                                 <gmd:name>
+                                    <gco:CharacterString>URL for the data publisher</gco:CharacterString>
+                                 </gmd:name>
+                                 <gmd:description>
+                                    <gco:CharacterString>This URL provides contact information for the publisher of this dataset</gco:CharacterString>
+                                 </gmd:description>
+                                 <gmd:function>
+                                    <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"
+                                                               codeListValue="information">information</gmd:CI_OnLineFunctionCode>
+                                 </gmd:function>
+                              </gmd:CI_OnlineResource>
+                           </gmd:onlineResource>
+                        </gmd:CI_Contact>
+                     </gmd:contactInfo>
+                     <gmd:role>
+                        <gmd:CI_RoleCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_RoleCode"
+                                         codeListValue="publisher">publisher</gmd:CI_RoleCode>
+                     </gmd:role>
+                  </gmd:CI_ResponsibleParty>
+               </gmd:distributorContact>
+               <gmd:distributorFormat>
+                  <gmd:MD_Format>
+                     <gmd:name>
+                        <gco:CharacterString>OPeNDAP</gco:CharacterString>
+                     </gmd:name>
+                     <gmd:version gco:nilReason="unknown"/>
+                  </gmd:MD_Format>
+               </gmd:distributorFormat>
+               <gmd:distributorTransferOptions>
+                  <gmd:MD_DigitalTransferOptions>
+                     <gmd:onLine>
+                        <gmd:CI_OnlineResource>
+                           <gmd:linkage>
+                              <gmd:URL>http://oos.soest.hawaii.edu/thredds/idd/nss_pacioos.html?dataset=NS06agg</gmd:URL>
+                           </gmd:linkage>
+                           <gmd:name>
+                              <gco:CharacterString>THREDDS Catalog</gco:CharacterString>
+                           </gmd:name>
+                           <gmd:description>
+                              <gco:CharacterString>This URL provides a catalog page for this dataset within THREDDS Data Server (TDS).</gco:CharacterString>
+                           </gmd:description>
+                           <gmd:function>
+                              <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"
+                                                         codeListValue="download">download</gmd:CI_OnLineFunctionCode>
+                           </gmd:function>
+                        </gmd:CI_OnlineResource>
+                     </gmd:onLine>
+                  </gmd:MD_DigitalTransferOptions>
+               </gmd:distributorTransferOptions>
+               <gmd:distributorTransferOptions>
+                  <gmd:MD_DigitalTransferOptions>
+                     <gmd:onLine>
+                        <gmd:CI_OnlineResource>
+                           <gmd:linkage>
+                              <gmd:URL>http://oos.soest.hawaii.edu/thredds/dodsC/pacioos/nss/ns06agg.html</gmd:URL>
+                           </gmd:linkage>
+                           <gmd:name>
+                              <gco:CharacterString>File Information</gco:CharacterString>
+                           </gmd:name>
+                           <gmd:description>
+                              <gco:CharacterString>This URL provides a standard OPeNDAP html interface for selecting data from this dataset. Change the extension to .info for a description of the dataset.</gco:CharacterString>
+                           </gmd:description>
+                           <gmd:function>
+                              <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_OnLineFunctionCode"
+                                                         codeListValue="download">download</gmd:CI_OnLineFunctionCode>
+                           </gmd:function>
+                        </gmd:CI_OnlineResource>
+                     </gmd:onLine>
+                  </gmd:MD_DigitalTransferOptions>
+               </gmd:distributorTransferOptions>
+               <gmd:distributorTransferOptions>
+                  <gmd:MD_DigitalTransferOptions>
+                     <gmd:onLine>
+                        <gmd:CI_OnlineResource>
+                           <gmd:linkage>
+                              <gmd:URL>http://pacioos.org/voyager/index.html?b=6.874279%2C158.077126%2C7.050468%2C158.369808&tz=pont&o=qual:2::p0NS06p1</gmd:URL>
+                           </gmd:linkage>
+                           <gmd:name>
+                              <gco:CharacterString>PacIOOS Voyager (Google Maps API)</gco:CharacterString>
+                           </gmd:name>
+                           <gmd:description>
+                              <gco:CharacterString>This URL provides a viewer for this dataset.</gco:CharacterString>
+                           </gmd:description>
+                           <gmd:function>
+                              <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_PresentationFormCode"
+                                                         codeListValue="download">download</gmd:CI_OnLineFunctionCode>
+                           </gmd:function>
+                        </gmd:CI_OnlineResource>
+                     </gmd:onLine>
+                  </gmd:MD_DigitalTransferOptions>
+               </gmd:distributorTransferOptions>
+               <gmd:distributorTransferOptions>
+                  <gmd:MD_DigitalTransferOptions>
+                     <gmd:onLine>
+                        <gmd:CI_OnlineResource>
+                           <gmd:linkage>
+                              <gmd:URL>http://oos.soest.hawaii.edu/dchart/index.html?dsetid=54cd0688ada08d86748b9c5762509f</gmd:URL>
+                           </gmd:linkage>
+                           <gmd:name>
+                              <gco:CharacterString>DChart</gco:CharacterString>
+                           </gmd:name>
+                           <gmd:description>
+                              <gco:CharacterString>This URL provides a viewer for this dataset.</gco:CharacterString>
+                           </gmd:description>
+                           <gmd:function>
+                              <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_PresentationFormCode"
+                                                         codeListValue="download">download</gmd:CI_OnLineFunctionCode>
+                           </gmd:function>
+                        </gmd:CI_OnlineResource>
+                     </gmd:onLine>
+                  </gmd:MD_DigitalTransferOptions>
+               </gmd:distributorTransferOptions>
+               <gmd:distributorTransferOptions>
+                  <gmd:MD_DigitalTransferOptions>
+                     <gmd:onLine>
+                        <gmd:CI_OnlineResource>
+                           <gmd:linkage>
+                              <gmd:URL>http://oos.soest.hawaii.edu/erddap/tabledap/nss06_agg.graph?time%2Ctemperature&.draw=lines</gmd:URL>
+                           </gmd:linkage>
+                           <gmd:name>
+                              <gco:CharacterString>ERDDAP</gco:CharacterString>
+                           </gmd:name>
+                           <gmd:description>
+                              <gco:CharacterString>This URL provides a viewer for this dataset.</gco:CharacterString>
+                           </gmd:description>
+                           <gmd:function>
+                              <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_PresentationFormCode"
+                                                         codeListValue="download">download</gmd:CI_OnLineFunctionCode>
+                           </gmd:function>
+                        </gmd:CI_OnlineResource>
+                     </gmd:onLine>
+                  </gmd:MD_DigitalTransferOptions>
+               </gmd:distributorTransferOptions>
+               <gmd:distributorTransferOptions>
+                  <gmd:MD_DigitalTransferOptions>
+                     <gmd:onLine>
+                        <gmd:CI_OnlineResource>
+                           <gmd:linkage>
+                              <gmd:URL>http://pacioos.org/focus/waterquality/wq_fsm.php</gmd:URL>
+                           </gmd:linkage>
+                           <gmd:name>
+                              <gco:CharacterString>PacIOOS Water Quality Platforms: FSM</gco:CharacterString>
+                           </gmd:name>
+                           <gmd:description>
+                              <gco:CharacterString>This URL provides a viewer for this dataset.</gco:CharacterString>
+                           </gmd:description>
+                           <gmd:function>
+                              <gmd:CI_OnLineFunctionCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#CI_PresentationFormCode"
+                                                         codeListValue="download">download</gmd:CI_OnLineFunctionCode>
+                           </gmd:function>
+                        </gmd:CI_OnlineResource>
+                     </gmd:onLine>
+                  </gmd:MD_DigitalTransferOptions>
+               </gmd:distributorTransferOptions>
+            </gmd:MD_Distributor>
+         </gmd:distributor>
+      </gmd:MD_Distribution>
+   </gmd:distributionInfo>
+   <gmd:dataQualityInfo>
+      <gmd:DQ_DataQuality>
+         <gmd:scope>
+            <gmd:DQ_Scope>
+               <gmd:level>
+                  <gmd:MD_ScopeCode codeList="http://www.ngdc.noaa.gov/metadata/published/xsd/schema/resources/Codelist/gmxCodelists.xml#MD_ScopeCode"
+                                    codeListValue="dataset">dataset</gmd:MD_ScopeCode>
+               </gmd:level>
+            </gmd:DQ_Scope>
+         </gmd:scope>
+         <gmd:lineage>
+            <gmd:LI_Lineage>
+               <gmd:statement>
+                  <gco:CharacterString>UH/SOEST (M. McManus), PacIOOS asset (05/2010)</gco:CharacterString>
+               </gmd:statement>
+            </gmd:LI_Lineage>
+         </gmd:lineage>
+      </gmd:DQ_DataQuality>
+   </gmd:dataQualityInfo>
+   <gmd:metadataMaintenance>
+      <gmd:MD_MaintenanceInformation>
+         <gmd:maintenanceAndUpdateFrequency gco:nilReason="unknown"/>
+         <gmd:maintenanceNote>
+            <gco:CharacterString>This record was translated from NcML using UnidataDD2MI.xsl Version 2.3</gco:CharacterString>
+         </gmd:maintenanceNote>
+      </gmd:MD_MaintenanceInformation>
+   </gmd:metadataMaintenance>
+</gmi:MI_Metadata>
diff --git a/tests/suites/apiso/data/test.xml b/tests/suites/apiso/data/test.xml
new file mode 100644
index 0000000..d492ed7
--- /dev/null
+++ b/tests/suites/apiso/data/test.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gmd:MD_Metadata xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<gmd:fileIdentifier><gco:CharacterString>437ae0a2-06e2-4015-b296-a66e7f407bf2</gco:CharacterString></gmd:fileIdentifier>
+	<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+	<gmd:hierarchyLevel><gmd:MD_ScopeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode" codeListValue="dataset">dataset</gmd:MD_ScopeCode></gmd:hierarchyLevel>
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resource [...]
+	<gmd:contact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>NTUA</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>tzotsos at gmail.com</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resour [...]
+	<gmd:dateStamp><gco:Date>2009-10-09</gco:Date></gmd:dateStamp>
+<gmd:metadataStandardName><gco:CharacterString>ISO19115</gco:CharacterString></gmd:metadataStandardName>
+<gmd:metadataStandardVersion><gco:CharacterString>2003/Cor.1:2006</gco:CharacterString></gmd:metadataStandardVersion>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:title>
+				<gmd:date><gmd:CI_Date><gmd:date><gco:Date>2009-10-09</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode" codeListValue="creation">creation</gmd:CI_DateTypeCode></gmd:dateType></gmd:CI_Date></gmd:date>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>437ae0a2-06e2-4015-b296-a66e7f407bf2</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				<gmd:identifier><gmd:RS_Identifier><gmd:code><gco:CharacterString>T_aerfo_RAS_1991_GR800P001800000011.tif</gco:CharacterString></gmd:code></gmd:RS_Identifier></gmd:identifier>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract><gco:CharacterString>Aerial Photos</gco:CharacterString></gmd:abstract>
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>YPAAT</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>ypaat at ypaat.gr</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/re [...]
+<gmd:pointOfContact><gmd:CI_ResponsibleParty><gmd:organisationName><gco:CharacterString>NTUA</gco:CharacterString></gmd:organisationName><gmd:contactInfo><gmd:CI_Contact><gmd:address><gmd:CI_Address><gmd:electronicMailAddress><gco:CharacterString>tzotsos at hotmail.com</gco:CharacterString></gmd:electronicMailAddress></gmd:CI_Address></gmd:address></gmd:CI_Contact></gmd:contactInfo><gmd:role><gmd:CI_RoleCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schema [...]
+			<gmd:descriptiveKeywords><gmd:MD_Keywords><gmd:keyword><gco:CharacterString>Orthoimagery</gco:CharacterString></gmd:keyword><gmd:thesaurusName><gmd:CI_Citation><gmd:title><gco:CharacterString>GEMET - INSPIRE themes, version 1.0</gco:CharacterString></gmd:title><gmd:date><gmd:CI_Date><gmd:date><gco:Date>2008-06-01</gco:Date></gmd:date><gmd:dateType><gmd:CI_DateTypeCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelist [...]
+			<gmd:resourceConstraints><gmd:MD_Constraints><gmd:useLimitation><gco:CharacterString>no conditions apply</gco:CharacterString></gmd:useLimitation></gmd:MD_Constraints></gmd:resourceConstraints>
+			<gmd:resourceConstraints><gmd:MD_LegalConstraints><gmd:accessConstraints><gmd:MD_RestrictionCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RestrictionCode" codeListValue="otherRestrictions">otherRestrictions</gmd:MD_RestrictionCode></gmd:accessConstraints><gmd:otherConstraints><gco:CharacterString>no limitations</gco:CharacterString></gmd:otherConstraints></gmd:MD_LegalConstraints></gmd:resourceConstraints>
+			<gmd:language><gmd:LanguageCode codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode" codeListValue="eng">eng</gmd:LanguageCode></gmd:language>
+			<gmd:topicCategory><gmd:MD_TopicCategoryCode>geoscientificInformation</gmd:MD_TopicCategoryCode></gmd:topicCategory>
+			<gmd:extent><gmd:EX_Extent><gmd:geographicElement><gmd:EX_GeographicBoundingBox><gmd:westBoundLongitude><gco:Decimal>20.00</gco:Decimal></gmd:westBoundLongitude><gmd:eastBoundLongitude><gco:Decimal>38.00</gco:Decimal></gmd:eastBoundLongitude><gmd:southBoundLatitude><gco:Decimal>24.00</gco:Decimal></gmd:southBoundLatitude><gmd:northBoundLatitude><gco:Decimal>40.00</gco:Decimal></gmd:northBoundLatitude></gmd:EX_GeographicBoundingBox></gmd:geographicElement></gmd:EX_Extent></gmd:extent>
+			<gmd:extent><gmd:EX_Extent><gmd:temporalElement><gmd:EX_TemporalExtent><gmd:extent><gml:TimePeriod gml:id="ID_fd8b0b23-4071-417f-b5d4-9003f3b8b26d" xsi:type="gml:TimePeriodType"><gml:beginPosition>2009-10-09</gml:beginPosition><gml:endPosition>2009-10-09</gml:endPosition></gml:TimePeriod></gmd:extent></gmd:EX_TemporalExtent></gmd:temporalElement></gmd:EX_Extent></gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+<gmd:distributionInfo><gmd:MD_Distribution><gmd:distributionFormat><gmd:MD_Format><gmd:name gco:nilReason="inapplicable"/><gmd:version gco:nilReason="inapplicable"/></gmd:MD_Format></gmd:distributionFormat><gmd:transferOptions><gmd:MD_DigitalTransferOptions><gmd:onLine><gmd:CI_OnlineResource><gmd:linkage><gmd:URL>http://www.ypaat.gr</gmd:URL></gmd:linkage></gmd:CI_OnlineResource></gmd:onLine></gmd:MD_DigitalTransferOptions></gmd:transferOptions></gmd:MD_Distribution></gmd:distributionInfo>
+<gmd:dataQualityInfo><gmd:DQ_DataQuality>
+<gmd:scope><gmd:DQ_Scope><gmd:level><gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode">dataset</gmd:MD_ScopeCode></gmd:level></gmd:DQ_Scope></gmd:scope>
+<gmd:report><gmd:DQ_DomainConsistency xsi:type="gmd:DQ_DomainConsistency_Type"><gmd:measureIdentification><gmd:RS_Identifier><gmd:code><gco:CharacterString>Conformity_001</gco:CharacterString></gmd:code><gmd:codeSpace><gco:CharacterString>INSPIRE</gco:CharacterString></gmd:codeSpace></gmd:RS_Identifier></gmd:measureIdentification><gmd:result><gmd:DQ_ConformanceResult xsi:type="gmd:DQ_ConformanceResult_Type"><gmd:specification><gmd:CI_Citation><gmd:title><gco:CharacterString>INSPIRE</gco: [...]
+<gmd:lineage><gmd:LI_Lineage><gmd:statement><gco:CharacterString>test</gco:CharacterString></gmd:statement></gmd:LI_Lineage></gmd:lineage>
+</gmd:DQ_DataQuality></gmd:dataQualityInfo>
+</gmd:MD_Metadata>
diff --git a/tests/suites/apiso/default.cfg b/tests/suites/apiso/default.cfg
new file mode 100644
index 0000000..6a60f3f
--- /dev/null
+++ b/tests/suites/apiso/default.cfg
@@ -0,0 +1,91 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/apiso/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+profiles=apiso
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/apiso/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/apiso/post/DescribeRecord.xml b/tests/suites/apiso/post/DescribeRecord.xml
new file mode 100644
index 0000000..e449f61
--- /dev/null
+++ b/tests/suites/apiso/post/DescribeRecord.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<DescribeRecord service="CSW" version="2.0.2" outputFormat="application/xml" schemaLanguage="http://www.w3.org/XML/Schema" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:csw="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-discovery.xsd">
+	<TypeName>gmd:MD_Metadata</TypeName>
+</DescribeRecord>
diff --git a/tests/suites/apiso/post/GetCapabilities.xml b/tests/suites/apiso/post/GetCapabilities.xml
new file mode 100644
index 0000000..e4dc807
--- /dev/null
+++ b/tests/suites/apiso/post/GetCapabilities.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/apiso/post/GetDomain-property.xml b/tests/suites/apiso/post/GetDomain-property.xml
new file mode 100644
index 0000000..a3ff1ba
--- /dev/null
+++ b/tests/suites/apiso/post/GetDomain-property.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<csw:GetDomain service="CSW" version="2.0.2" xmlns:apiso="http://www.opengis.net/cat/csw/apiso/1.0" xmlns:csw="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-discovery.xsd">
+	<csw:PropertyName>apiso:TopicCategory</csw:PropertyName>
+</csw:GetDomain>
+
diff --git a/tests/suites/apiso/post/GetRecordById-brief.xml b/tests/suites/apiso/post/GetRecordById-brief.xml
new file mode 100644
index 0000000..84f6c16
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecordById-brief.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetRecordById service="CSW" version="2.0.2" outputFormat="application/xml" outputSchema="http://www.isotc211.org/2005/gmd" 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-discovery.xsd">
+	<Id>de53e931-778a-4792-94ad-9fe507aca483</Id>
+	<ElementSetName>brief</ElementSetName>
+</GetRecordById>
+
diff --git a/tests/suites/apiso/post/GetRecordById-full-dc.xml b/tests/suites/apiso/post/GetRecordById-full-dc.xml
new file mode 100644
index 0000000..c58520a
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecordById-full-dc.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetRecordById service="CSW" version="2.0.2" 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-discovery.xsd">
+	<Id>NS06agg</Id>
+	<ElementSetName>full</ElementSetName>
+</GetRecordById>
+
diff --git a/tests/suites/apiso/post/GetRecordById-full.xml b/tests/suites/apiso/post/GetRecordById-full.xml
new file mode 100644
index 0000000..2fe6e2d
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecordById-full.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetRecordById service="CSW" version="2.0.2" outputFormat="application/xml" outputSchema="http://www.isotc211.org/2005/gmd" 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-discovery.xsd">
+	<Id>de53e931-778a-4792-94ad-9fe507aca483</Id>
+	<ElementSetName>full</ElementSetName>
+</GetRecordById>
+
diff --git a/tests/suites/apiso/post/GetRecordById-srv-brief.xml b/tests/suites/apiso/post/GetRecordById-srv-brief.xml
new file mode 100644
index 0000000..88ec9de
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecordById-srv-brief.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetRecordById service="CSW" version="2.0.2" outputFormat="application/xml" outputSchema="http://www.isotc211.org/2005/gmd" 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-discovery.xsd">
+	<Id>3e9a8c05</Id>
+	<ElementSetName>brief</ElementSetName>
+</GetRecordById>
+
diff --git a/tests/suites/apiso/post/GetRecords-all-csw-output.xml b/tests/suites/apiso/post/GetRecords-all-csw-output.xml
new file mode 100644
index 0000000..1cdb555
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecords-all-csw-output.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gmd="http://www.isotc211.org/2005/gmd" 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">
+	<csw:Query typeNames="gmd:MD_Metadata">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/apiso/post/GetRecords-all.xml b/tests/suites/apiso/post/GetRecords-all.xml
new file mode 100644
index 0000000..1cdb555
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecords-all.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gmd="http://www.isotc211.org/2005/gmd" 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">
+	<csw:Query typeNames="gmd:MD_Metadata">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/apiso/post/GetRecords-cql-title.xml b/tests/suites/apiso/post/GetRecords-cql-title.xml
new file mode 100644
index 0000000..a8d37e8
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecords-cql-title.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:gmd="http://www.isotc211.org/2005/gmd" 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 [...]
+	<csw:Query typeNames="gmd:MD_Metadata">
+		<csw:ElementSetName>brief</csw:ElementSetName>
+		<csw:Constraint version="1.1.0">
+			<csw:CqlText>apiso:TopicCategory like '%elevation%'</csw:CqlText>
+		</csw:Constraint>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/apiso/post/GetRecords-elementname.xml b/tests/suites/apiso/post/GetRecords-elementname.xml
new file mode 100644
index 0000000..ff19122
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecords-elementname.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:dc="http://purl.org/dc/elements/1.1/" 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. [...]
+	<csw:Query typeNames="gmd:MD_Metadata">
+		<csw:ElementName>apiso:Title</csw:ElementName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/apiso/post/GetRecords-filter-anytext.xml b/tests/suites/apiso/post/GetRecords-filter-anytext.xml
new file mode 100644
index 0000000..4bb8d9c
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecords-filter-anytext.xml
@@ -0,0 +1,15 @@
+<?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>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+                    <ogc:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\">
+                        <ogc:PropertyName>apiso:AnyText</ogc:PropertyName>
+                        <ogc:Literal>Aerial%</ogc:Literal>
+                    </ogc:PropertyIsLike>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
+
diff --git a/tests/suites/apiso/post/GetRecords-filter-bbox-csw-output.xml b/tests/suites/apiso/post/GetRecords-filter-bbox-csw-output.xml
new file mode 100644
index 0000000..f7e47c7
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecords-filter-bbox-csw-output.xml
@@ -0,0 +1,19 @@
+<?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.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-discovery.xsd" [...]
+    <csw:Query typeNames="gmd:MD_Metadata">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+				<ogc:BBOX>
+					<ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName>
+					<gml:Envelope>
+						<gml:lowerCorner>35 18</gml:lowerCorner>
+						<gml:upperCorner>42 28</gml:upperCorner>
+					</gml:Envelope>
+				</ogc:BBOX>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
+
+
diff --git a/tests/suites/apiso/post/GetRecords-filter-bbox.xml b/tests/suites/apiso/post/GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..2444873
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecords-filter-bbox.xml
@@ -0,0 +1,18 @@
+<?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>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+				<ogc:BBOX>
+					<ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName>
+					<gml:Envelope>
+						<gml:lowerCorner>35 18</gml:lowerCorner>
+						<gml:upperCorner>42 28</gml:upperCorner>
+					</gml:Envelope>
+				</ogc:BBOX>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
+
diff --git a/tests/suites/apiso/post/GetRecords-filter-servicetype.xml b/tests/suites/apiso/post/GetRecords-filter-servicetype.xml
new file mode 100644
index 0000000..02078b6
--- /dev/null
+++ b/tests/suites/apiso/post/GetRecords-filter-servicetype.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:dc="http://purl.org/dc/elements/1.1/" 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. [...]
+	<csw:Query typeNames="gmd:MD_Metadata">
+	<csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+                    <ogc:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\">
+                        <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
+                        <ogc:Literal>view</ogc:Literal>
+                    </ogc:PropertyIsLike>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/atom/default.cfg b/tests/suites/atom/default.cfg
new file mode 100644
index 0000000..b97c23e
--- /dev/null
+++ b/tests/suites/atom/default.cfg
@@ -0,0 +1,90 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/atom/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/atom/get/requests.txt b/tests/suites/atom/get/requests.txt
new file mode 100644
index 0000000..ac0b943
--- /dev/null
+++ b/tests/suites/atom/get/requests.txt
@@ -0,0 +1 @@
+opensearch,PYCSW_SERVER?config=tests/suites/atom/default.cfg&mode=opensearch&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&resulttype=results&elementsetname=brief
diff --git a/tests/suites/atom/post/DescribeRecord.xml b/tests/suites/atom/post/DescribeRecord.xml
new file mode 100644
index 0000000..cd923b8
--- /dev/null
+++ b/tests/suites/atom/post/DescribeRecord.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<DescribeRecord service="CSW" version="2.0.2" outputFormat="application/xml" xmlns:atom="http://www.w3.org/2005/Atom" schemaLanguage="http://www.w3.org/XML/Schema" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="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-discovery.xsd">
+	<TypeName>atom:entry</TypeName>
+</DescribeRecord>
diff --git a/tests/suites/atom/post/GetCapabilities.xml b/tests/suites/atom/post/GetCapabilities.xml
new file mode 100644
index 0000000..e4dc807
--- /dev/null
+++ b/tests/suites/atom/post/GetCapabilities.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/atom/post/GetRecords-filter-bbox.xml b/tests/suites/atom/post/GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..1c431c2
--- /dev/null
+++ b/tests/suites/atom/post/GetRecords-filter-bbox.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:atom="http://www.w3.org/2005/Atom" 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.w3.org/2005/Atom" 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:gml="http://www. [...]
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+				<ogc:BBOX>
+					<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+					<gml:Envelope>
+						<gml:lowerCorner>47 -5</gml:lowerCorner>
+						<gml:upperCorner>55 20</gml:upperCorner>
+					</gml:Envelope>
+				</ogc:BBOX>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/data/Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml b/tests/suites/cite/data/Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml
new file mode 100644
index 0000000..7292511
--- /dev/null
+++ b/tests/suites/cite/data/Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/">
+    <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>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml b/tests/suites/cite/data/Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml
new file mode 100644
index 0000000..97c5957
--- /dev/null
+++ b/tests/suites/cite/data/Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/">
+    <dc:identifier>urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dct:abstract>Proin sit amet justo. In justo. Aenean adipiscing nulla id tellus.</dct:abstract>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>60.042 13.754</ows:LowerCorner>
+      <ows:UpperCorner>68.410 17.920</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml b/tests/suites/cite/data/Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml
new file mode 100644
index 0000000..b58bcdb
--- /dev/null
+++ b/tests/suites/cite/data/Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/">
+    <dc:identifier>urn:uuid:66ae76b7-54ba-489b-a582-0f0633d96493</dc:identifier>
+    <dc:title>Maecenas enim</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:format>application/xhtml+xml</dc:format>
+    <dc:subject>Marine sediments</dc:subject>
+    <dct:abstract>Pellentesque tempus magna non sapien fringilla blandit.</dct:abstract>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml b/tests/suites/cite/data/Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml
new file mode 100644
index 0000000..13f973a
--- /dev/null
+++ b/tests/suites/cite/data/Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/">
+    <dc:identifier>urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:title>Ut facilisis justo ut lacus</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation</dc:subject>
+    <dc:relation>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:relation>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml b/tests/suites/cite/data/Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml
new file mode 100644
index 0000000..098b126
--- /dev/null
+++ b/tests/suites/cite/data/Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/"
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+    <dc:identifier>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</dc:identifier>
+    <dc:title>Aliquam fermentum purus quis arcu</dc:title>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:subject>Hydrography--Dictionaries</dc:subject>
+    <dc:format>application/pdf</dc:format>
+    <dc:date>2006-05-12Z</dc:date>
+    <dct:abstract>Vestibulum quis ipsum sit amet metus imperdiet vehicula. Nulla scelerisque cursus mi.</dct:abstract>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml b/tests/suites/cite/data/Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml
new file mode 100644
index 0000000..83a96d2
--- /dev/null
+++ b/tests/suites/cite/data/Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/">
+    <dc:identifier>urn:uuid:829babb0-b2f1-49e1-8cd5-7b489fe71a1e</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:format>image/jp2</dc:format>
+    <dc:title>Vestibulum massa purus</dc:title>
+    <dc:relation>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:relation>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml b/tests/suites/cite/data/Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml
new file mode 100644
index 0000000..2771e6a
--- /dev/null
+++ b/tests/suites/cite/data/Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/">
+    <dc:identifier>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography-Landforms</dc:subject>
+    <dct:spatial>FI-ES</dct:spatial>
+    <dct:abstract>Donec scelerisque pede ut nisl luctus accumsan. Quisque ultrices, lorem eget feugiat fringilla, lorem dui porttitor ante, cursus ultrices magna odio eu neque.</dct:abstract>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml b/tests/suites/cite/data/Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml
new file mode 100644
index 0000000..e2ba906
--- /dev/null
+++ b/tests/suites/cite/data/Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/"
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+    <dc:identifier>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Mauris sed neque</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Vegetation-Cropland</dc:subject>
+    <dct:abstract>Curabitur lacinia, ante non porta tempus, mi lorem feugiat odio, eget suscipit eros pede ac velit.</dct:abstract>
+    <dc:date>2006-03-26Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>47.595 -4.097</ows:LowerCorner>
+      <ows:UpperCorner>51.217 0.889</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml b/tests/suites/cite/data/Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml
new file mode 100644
index 0000000..117fef6
--- /dev/null
+++ b/tests/suites/cite/data/Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/"
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+    <dc:identifier>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Dataset</dc:type>
+    <dc:title>Ñunç elementum</dc:title>
+    <dc:subject scheme="http://www.digest.org/2.1">Hydrography-Oceanographic</dc:subject>
+    <dc:date>2005-10-24Z</dc:date>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>44.792 -6.171</ows:LowerCorner>
+      <ows:UpperCorner>51.126 -2.228</ows:UpperCorner>
+    </ows:BoundingBox>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml b/tests/suites/cite/data/Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml
new file mode 100644
index 0000000..a7ba06c
--- /dev/null
+++ b/tests/suites/cite/data/Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/">
+    <dc:identifier>urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Image</dc:type>
+    <dc:title>Lorem ipsum dolor sit amet</dc:title>
+    <dc:format>image/jpeg</dc:format>
+    <dct:spatial>IT-FI</dct:spatial>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml b/tests/suites/cite/data/Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml
new file mode 100644
index 0000000..b4d2a23
--- /dev/null
+++ b/tests/suites/cite/data/Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/">
+    <dc:identifier>urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Service</dc:type>
+    <dc:subject scheme="http://www.digest.org/2.1">Physiography</dc:subject>
+    <dct:abstract>Suspendisse accumsan molestie lorem. Nullam velit turpis, mattis ut, varius bibendum, laoreet non, quam.</dct:abstract>
+    <dc:relation>urn:uuid:88247b56-4cbc-4df9-9860-db3f8042e357</dc:relation>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml b/tests/suites/cite/data/Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml
new file mode 100644
index 0000000..64cb24b
--- /dev/null
+++ b/tests/suites/cite/data/Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Record xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" 
+  xmlns:ows="http://www.opengis.net/ows" 
+  xmlns:dc="http://purl.org/dc/elements/1.1/" 
+  xmlns:dct="http://purl.org/dc/terms/"
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+    <dc:identifier>urn:uuid:e9330592-0932-474b-be34-c3a3bb67c7db</dc:identifier>
+    <dc:type>http://purl.org/dc/dcmitype/Text</dc:type>
+    <dc:title>Fuscé vitae ligulä</dc:title>
+    <dc:date>2003-05-09Z</dc:date>
+    <dc:subject>Land titles</dc:subject>
+    <dc:format>text/rtf</dc:format>
+    <dct:abstract>Morbi ultriçes, dui suscipit vestibulum prètium, velit ante pretium tortor, egët tincidunt pede odio ac nulla.</dct:abstract>
+</csw:Record>
\ No newline at end of file
diff --git a/tests/suites/cite/data/records.db b/tests/suites/cite/data/records.db
new file mode 100644
index 0000000..9e37584
Binary files /dev/null and b/tests/suites/cite/data/records.db differ
diff --git a/tests/suites/cite/default.cfg b/tests/suites/cite/default.cfg
new file mode 100644
index 0000000..012ce8f
--- /dev/null
+++ b/tests/suites/cite/default.cfg
@@ -0,0 +1,86 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/cite/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#spatial_ranking=true
+gzip_compresslevel=9
+
+[manager]
+transactions=true
+allowed_ips=127.0.0.1
+csw_harvest_pagination_size=10
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+table=records
+
+[metadata:inspire]
+#enabled=true
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/cite/get/requests.txt b/tests/suites/cite/get/requests.txt
new file mode 100644
index 0000000..9eb5bc2
--- /dev/null
+++ b/tests/suites/cite/get/requests.txt
@@ -0,0 +1,22 @@
+27e17158-c57a-4493-92ac-dba8934cf462,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities
+27f69b66-5f05-4311-a89c-73ca55c2686b,PYCSW_SERVER?config=tests/suites/cite/default.cfg&Service=CSW&Version=2.0.2&Request=GetRecordById&ElementSetName=brief&ID=urn%3Auuid%3A19887a8a-f6b0-4a63-ae56-7fba0e17801f
+2ab7d1fa-885b-459f-80e4-b6282eab4f8c,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities&acceptversions=2.0.2&date=2006-10-20
+37aa90e2-6ff0-420c-af15-8b9463099a73,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&id=urn%3Auuid%3A9a669547-b69b-469f-a11f-2d875366bbdc
+3a8a3c47-455f-4f49-9078-03119f3e70b3,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities&acceptformats=message/example
+4515831f-834a-4699-95f6-ab0c2cbfcfd0,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById
+477b23a3-baa9-47c8-9541-5fe27735ed49,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities&sections=
+48f26761-3a9d-48db-bee1-da089f5fb857,PYCSW_SERVER?config=tests/suites/cite/default.cfg&sErViCe=CSW&REQUEST=GetCapabilities&version=2.0.2
+4e38092f-1586-44b8-988e-0acfa5855916,PYCSW_SERVER?config=tests/suites/cite/default.cfg&Service=CSW&Version=2.0.2&Request=GetRecordById&OutputFormat=application/bogus_xml&id=urn:uuid:a06af396-3105-442d-8b40-22b57a90d2f2,urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f,urn:uuid:ab42a8c4-95e8-4630-bf79-33e59241605a
+55c38f00-2553-42c1-99ab-33edbb561ad7,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities&sections=OperationsMetadata,ServiceIdentification
+5ab5db18-c87a-4fbf-a8d8-b7289b09ac81,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=FOO&request=GetCapabilities
+6a4f57ca-a1bd-4802-89c2-44860dbdb0f0,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&id=urn:uuid:ce8627a0-685c-11db-bd13-0800200c9a66,urn:uuid:6a3de50b-fa66-4b58-a0e6-ca146fdd18d4
+6c375703-9c00-4aef-bec7-d2e964f849eb,PYCSW_SERVER?config=tests/suites/cite/default.cfg&Service=CSW&Version=2.0.2&Request=GetRecordById&OutputSchema=http://www.w3.org/2005/Atom&Id=urn:uuid:19887a8a-f6b0-4a63-ae56-7fba0e17801f
+80f31def-4185-48b9-983a-960566918eae,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities
+8e2232ed-05d9-44ae-8b04-0911cbe6a507,PYCSW_SERVER?config=tests/suites/cite/default.cfg&SERVICE=CSW&REQUEST=GetCapabilities&ACCEPTVERSIONS=2006.10.29
+9697f0aa-3b6a-4125-83a5-61e8826127c4,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&request=GetCapabilities
+9bfd17fa-15dc-4a10-8fa7-b3cff7013dd7,PYCSW_SERVER?config=tests/suites/cite/default.cfg&Service=CSW&Version=2.0.2&Request=GetRecordById&ElementSetName=full&ID=urn%3Auuid%3Ae9330592-0932-474b-be34-c3a3bb67c7db
+b81c3595-06d6-4693-82ea-1ff8650755ac,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&id=urn:uuid:ce8627a0-685c-11db-bd13-0800200c9a66
+ba5fc729-3b71-47a0-b7d0-42ec565cd185,PYCSW_SERVER?config=tests/suites/cite/default.cfg&SERVICE=CSW&REQUEST=GetCapabilities&ACCEPTVERSIONS=2.0.2,2.0.0
+c4ea754f-c158-4d8d-8253-dc8f86021b52,PYCSW_SERVER?config=tests/suites/cite/default.cfg&request=GetCapabilities
+f4692ec5-9547-4a05-88ab-e6154af2640a,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities
+f997f25e-c865-4d53-a362-0ed1846337f2,PYCSW_SERVER?config=tests/suites/cite/default.cfg&service=CSW&version=2.0.2&request=GetRecordById&id=urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63
diff --git a/tests/suites/cite/post/0c976d98-c896-4b10-b1fe-a22ef50434e7.xml b/tests/suites/cite/post/0c976d98-c896-4b10-b1fe-a22ef50434e7.xml
new file mode 100644
index 0000000..c73f511
--- /dev/null
+++ b/tests/suites/cite/post/0c976d98-c896-4b10-b1fe-a22ef50434e7.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords maxRecords="0" resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>ows:BoundingBox</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:Not>
+          <ogc:BBOX>
+            <ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+            <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+              <gml:lowerCorner>60.0 12.0</gml:lowerCorner>
+              <gml:upperCorner>70.0 20.0</gml:upperCorner>
+            </gml:Envelope>
+          </ogc:BBOX>
+        </ogc:Not>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/19d2a6ed-be28-4866-ae15-e3bb634486cb.xml b/tests/suites/cite/post/19d2a6ed-be28-4866-ae15-e3bb634486cb.xml
new file mode 100644
index 0000000..6823bcf
--- /dev/null
+++ b/tests/suites/cite/post/19d2a6ed-be28-4866-ae15-e3bb634486cb.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords maxRecords="100" resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occaml [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsNotEqualTo>
+          <ogc:PropertyName>dc:title</ogc:PropertyName>
+          <ogc:Literal>Fuscé vitae ligulä</ogc:Literal>
+        </ogc:PropertyIsNotEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+    <ogc:SortBy>
+      <ogc:SortProperty>
+        <ogc:PropertyName>dc:format</ogc:PropertyName>
+        <ogc:SortOrder>DESC</ogc:SortOrder>
+      </ogc:SortProperty>
+    </ogc:SortBy>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml b/tests/suites/cite/post/1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml
new file mode 100644
index 0000000..cd46b04
--- /dev/null
+++ b/tests/suites/cite/post/1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="validate" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parser [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>full</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike escapeChar="\" singleChar="." wildCard="*">
+          <ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+          <ogc:Literal>*lorem*</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml b/tests/suites/cite/post/1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml
new file mode 100644
index 0000000..dabb279
--- /dev/null
+++ b/tests/suites/cite/post/1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords maxRecords="5" outputFormat="application/xhtml+xml" resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parser [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml b/tests/suites/cite/post/1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml
new file mode 100644
index 0000000..d2e5342
--- /dev/null
+++ b/tests/suites/cite/post/1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:BriefRecord">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike escapeChar="\" singleChar="." wildCard="*">
+          <ogc:PropertyName>/dc:title</ogc:PropertyName>
+          <ogc:Literal>*lorem*</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/2102a460-5d62-465f-9668-d70b3faafbfa.xml b/tests/suites/cite/post/2102a460-5d62-465f-9668-d70b3faafbfa.xml
new file mode 100644
index 0000000..da787a0
--- /dev/null
+++ b/tests/suites/cite/post/2102a460-5d62-465f-9668-d70b3faafbfa.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords maxRecords="20" resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamla [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsNotEqualTo matchCase="false">
+          <ogc:PropertyName>dc:subject</ogc:PropertyName>
+          <ogc:Literal>pHYSIOGRAPHy</ogc:Literal>
+        </ogc:PropertyIsNotEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/225f455a-0035-486b-a94e-fee7ae881b2b.xml b/tests/suites/cite/post/225f455a-0035-486b-a94e-fee7ae881b2b.xml
new file mode 100644
index 0000000..c7dc542
--- /dev/null
+++ b/tests/suites/cite/post/225f455a-0035-486b-a94e-fee7ae881b2b.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>dc:type</csw:ElementName>
+    <csw:ElementName>dc:date</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsGreaterThanOrEqualTo>
+          <ogc:PropertyName>dc:date</ogc:PropertyName>
+          <ogc:Literal>2006-03-26Z</ogc:Literal>
+        </ogc:PropertyIsGreaterThanOrEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/2d53ffea-60e4-4652-abf5-36eb23042fd5.xml b/tests/suites/cite/post/2d53ffea-60e4-4652-abf5-36eb23042fd5.xml
new file mode 100644
index 0000000..19bb2e0
--- /dev/null
+++ b/tests/suites/cite/post/2d53ffea-60e4-4652-abf5-36eb23042fd5.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="http://www.occamlab.com/te" xml [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/34a019a9-1581-42cb-9827-fbfdda2773b7.xml b/tests/suites/cite/post/34a019a9-1581-42cb-9827-fbfdda2773b7.xml
new file mode 100644
index 0000000..4451d7c
--- /dev/null
+++ b/tests/suites/cite/post/34a019a9-1581-42cb-9827-fbfdda2773b7.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http:/ [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/3e76fd38-e035-41c9-83dc-61356f680c97.xml b/tests/suites/cite/post/3e76fd38-e035-41c9-83dc-61356f680c97.xml
new file mode 100644
index 0000000..cfa0b1c
--- /dev/null
+++ b/tests/suites/cite/post/3e76fd38-e035-41c9-83dc-61356f680c97.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:DescribeRecord schemaLanguage="http://purl.oclc.org/dsdl/schematron" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmln [...]
+  <csw:TypeName>csw:Record</csw:TypeName>
+</csw:DescribeRecord>
diff --git a/tests/suites/cite/post/418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml b/tests/suites/cite/post/418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml
new file mode 100644
index 0000000..0afeddf
--- /dev/null
+++ b/tests/suites/cite/post/418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>dc:date</csw:ElementName>
+    <csw:ElementName>ows:BoundingBox</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:And>
+          <ogc:BBOX>
+            <ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+            <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+              <gml:lowerCorner>47.0 -4.5</gml:lowerCorner>
+              <gml:upperCorner>52.0 1.0</gml:upperCorner>
+            </gml:Envelope>
+          </ogc:BBOX>
+          <ogc:PropertyIsGreaterThan>
+            <ogc:PropertyName>dc:date</ogc:PropertyName>
+            <ogc:Literal>2006-01-01Z</ogc:Literal>
+          </ogc:PropertyIsGreaterThan>
+        </ogc:And>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/420b745e-0c4b-404e-9f2d-61fa580ff05a.xml b/tests/suites/cite/post/420b745e-0c4b-404e-9f2d-61fa580ff05a.xml
new file mode 100644
index 0000000..3b741e0
--- /dev/null
+++ b/tests/suites/cite/post/420b745e-0c4b-404e-9f2d-61fa580ff05a.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>dc:type</csw:ElementName>
+    <csw:ElementName>dc:date</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsGreaterThan>
+          <ogc:PropertyName>dc:date</ogc:PropertyName>
+          <ogc:Literal>2004-01-01Z</ogc:Literal>
+        </ogc:PropertyIsGreaterThan>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/4735d649-a2b1-42fd-a101-14e1d7e4607f.xml b/tests/suites/cite/post/4735d649-a2b1-42fd-a101-14e1d7e4607f.xml
new file mode 100644
index 0000000..44672f6
--- /dev/null
+++ b/tests/suites/cite/post/4735d649-a2b1-42fd-a101-14e1d7e4607f.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords maxRecords="5" resultType="results" service="CSW" startPosition="3" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="h [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/5c5861bc-f742-40a5-9998-5342615d674b.xml b/tests/suites/cite/post/5c5861bc-f742-40a5-9998-5342615d674b.xml
new file mode 100644
index 0000000..b127a7d
--- /dev/null
+++ b/tests/suites/cite/post/5c5861bc-f742-40a5-9998-5342615d674b.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>full</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike escapeChar="\" singleChar="." wildCard="*">
+          <ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+          <ogc:Literal>*lorem*</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml b/tests/suites/cite/post/6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml
new file mode 100644
index 0000000..28e25bf
--- /dev/null
+++ b/tests/suites/cite/post/6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml b/tests/suites/cite/post/73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml
new file mode 100644
index 0000000..160cf6d
--- /dev/null
+++ b/tests/suites/cite/post/73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>full</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike escapeChar="\" singleChar="?" wildCard="*">
+          <ogc:PropertyName>dc:date</ogc:PropertyName>
+          <ogc:Literal>200?-10-*</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/78297c88-4850-4927-adc6-511cd9a3d539.xml b/tests/suites/cite/post/78297c88-4850-4927-adc6-511cd9a3d539.xml
new file mode 100644
index 0000000..5b0e1b9
--- /dev/null
+++ b/tests/suites/cite/post/78297c88-4850-4927-adc6-511cd9a3d539.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:DescribeRecord service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="http://www.occamlab.com/te" xmlns:tec="java:com. [...]
\ No newline at end of file
diff --git a/tests/suites/cite/post/7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml b/tests/suites/cite/post/7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml
new file mode 100644
index 0000000..0ea9849
--- /dev/null
+++ b/tests/suites/cite/post/7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords maxRecords="5" outputSchema="http://www.w3.org/2005/Atom" resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/ [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/7e2cd105-daec-4d25-bc8e-d49d21364912.xml b/tests/suites/cite/post/7e2cd105-daec-4d25-bc8e-d49d21364912.xml
new file mode 100644
index 0000000..81865e3
--- /dev/null
+++ b/tests/suites/cite/post/7e2cd105-daec-4d25-bc8e-d49d21364912.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:DescribeRecord schemaLanguage="http://www.w3.org/XML/Schema" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="ht [...]
+  <csw:TypeName>csw:DummyRecord</csw:TypeName>
+</csw:DescribeRecord>
diff --git a/tests/suites/cite/post/87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml b/tests/suites/cite/post/87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml
new file mode 100644
index 0000000..4c03f79
--- /dev/null
+++ b/tests/suites/cite/post/87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>dc:type</csw:ElementName>
+    <csw:ElementName>dc:date</csw:ElementName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml b/tests/suites/cite/post/88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml
new file mode 100644
index 0000000..b683c99
--- /dev/null
+++ b/tests/suites/cite/post/88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:DescribeRecord outputFormat="text/sgml" schemaLanguage="http://www.w3.org/XML/Schema" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://sa [...]
+  <csw:TypeName>csw:Record</csw:TypeName>
+</csw:DescribeRecord>
diff --git a/tests/suites/cite/post/898cd63b-2585-4ec0-8720-d554bd324174.xml b/tests/suites/cite/post/898cd63b-2585-4ec0-8720-d554bd324174.xml
new file mode 100644
index 0000000..6c0e094
--- /dev/null
+++ b/tests/suites/cite/post/898cd63b-2585-4ec0-8720-d554bd324174.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:And>
+          <ogc:PropertyIsLike escapeChar="\" singleChar="?" wildCard="*">
+            <ogc:PropertyName>dc:format</ogc:PropertyName>
+            <ogc:Literal>image/*</ogc:Literal>
+          </ogc:PropertyIsLike>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>dc:relation</ogc:PropertyName>
+            <ogc:Literal>urn:uuid:9a669547-b69b-469f-a11f-2d875366bbdc</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+        </ogc:And>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml b/tests/suites/cite/post/8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml
new file mode 100644
index 0000000..9a4bd54
--- /dev/null
+++ b/tests/suites/cite/post/8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords maxRecords="20" resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamla [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>ows:BoundingBox</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:Not>
+          <ogc:BBOX>
+            <ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+            <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+              <gml:lowerCorner>60.0 12.0</gml:lowerCorner>
+              <gml:upperCorner>70.0 20.0</gml:upperCorner>
+            </gml:Envelope>
+          </ogc:BBOX>
+        </ogc:Not>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/928c1896-52d4-4ac7-9832-f98e3eb65f02.xml b/tests/suites/cite/post/928c1896-52d4-4ac7-9832-f98e3eb65f02.xml
new file mode 100644
index 0000000..08dd22f
--- /dev/null
+++ b/tests/suites/cite/post/928c1896-52d4-4ac7-9832-f98e3eb65f02.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>dc:type</csw:ElementName>
+    <csw:ElementName>dc:date</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLessThanOrEqualTo>
+          <ogc:PropertyName>dc:date</ogc:PropertyName>
+          <ogc:Literal>2005-10-24Z</ogc:Literal>
+        </ogc:PropertyIsLessThanOrEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/93bdbb9d-2734-4f01-92fb-48634cca41de.xml b/tests/suites/cite/post/93bdbb9d-2734-4f01-92fb-48634cca41de.xml
new file mode 100644
index 0000000..f2389b7
--- /dev/null
+++ b/tests/suites/cite/post/93bdbb9d-2734-4f01-92fb-48634cca41de.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>ows:BoundingBox</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:BBOX>
+          <ogc:PropertyName>/ows:BoundingBox</ogc:PropertyName>
+          <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+            <gml:lowerCorner>47.0 -4.5</gml:lowerCorner>
+            <gml:upperCorner>52.0 1.0</gml:upperCorner>
+          </gml:Envelope>
+        </ogc:BBOX>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml b/tests/suites/cite/post/948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml
new file mode 100644
index 0000000..14c9935
--- /dev/null
+++ b/tests/suites/cite/post/948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>dc:type</csw:ElementName>
+    <csw:ElementName>dc:date</csw:ElementName>
+    <ogc:SortBy>
+      <ogc:SortProperty>
+        <ogc:PropertyName>dc:date</ogc:PropertyName>
+        <ogc:SortOrder>DESC</ogc:SortOrder>
+      </ogc:SortProperty>
+    </ogc:SortBy>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml b/tests/suites/cite/post/9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml
new file mode 100644
index 0000000..c90f2b6
--- /dev/null
+++ b/tests/suites/cite/post/9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:DescribeRecord schemaLanguage="http://www.w3.org/XML/Schema" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="ht [...]
+  <csw:TypeName>Record</csw:TypeName>
+</csw:DescribeRecord>
diff --git a/tests/suites/cite/post/a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml b/tests/suites/cite/post/a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml
new file mode 100644
index 0000000..19bb2e0
--- /dev/null
+++ b/tests/suites/cite/post/a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="http://www.occamlab.com/te" xml [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/ad61686c-d304-42d1-b845-8c1f3070c83e.xml b/tests/suites/cite/post/ad61686c-d304-42d1-b845-8c1f3070c83e.xml
new file mode 100644
index 0000000..843265b
--- /dev/null
+++ b/tests/suites/cite/post/ad61686c-d304-42d1-b845-8c1f3070c83e.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="hits" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" x [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter xmlns:ogc="http://www.opengis.net/foo">
+        <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>dc:title</ogc:PropertyName>
+          <ogc:Literal>Maecenas enim</ogc:Literal>
+        </ogc:PropertyIsEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/af39c020-7b1d-429c-b474-f45c3164cb79.xml b/tests/suites/cite/post/af39c020-7b1d-429c-b474-f45c3164cb79.xml
new file mode 100644
index 0000000..50566b7
--- /dev/null
+++ b/tests/suites/cite/post/af39c020-7b1d-429c-b474-f45c3164cb79.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike escapeChar="\" singleChar="?" wildCard="*">
+          <ogc:PropertyName>dc:title</ogc:PropertyName>
+          <ogc:Literal>Lorem ipsum*</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml b/tests/suites/cite/post/b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml
new file mode 100644
index 0000000..aa555fa
--- /dev/null
+++ b/tests/suites/cite/post/b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords maxRecords="20" resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamla [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:Not>
+          <ogc:PropertyIsLike escapeChar="\" singleChar="?" wildCard="*">
+            <ogc:PropertyName>dc:title</ogc:PropertyName>
+            <ogc:Literal>Lorem ipsum*</ogc:Literal>
+          </ogc:PropertyIsLike>
+        </ogc:Not>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/ba9b0107-dcee-46ef-823a-a2e25a911a96.xml b/tests/suites/cite/post/ba9b0107-dcee-46ef-823a-a2e25a911a96.xml
new file mode 100644
index 0000000..53e552d
--- /dev/null
+++ b/tests/suites/cite/post/ba9b0107-dcee-46ef-823a-a2e25a911a96.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:Or>
+          <ogc:PropertyIsLike escapeChar="\" singleChar="?" wildCard="*">
+            <ogc:PropertyName>dc:format</ogc:PropertyName>
+            <ogc:Literal>application/*xml</ogc:Literal>
+          </ogc:PropertyIsLike>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>dc:type</ogc:PropertyName>
+            <ogc:Literal>http://purl.org/dc/dcmitype/Image</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+        </ogc:Or>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/bb66ebc5-7121-48b5-9f53-b56537d9561b.xml b/tests/suites/cite/post/bb66ebc5-7121-48b5-9f53-b56537d9561b.xml
new file mode 100644
index 0000000..873cda4
--- /dev/null
+++ b/tests/suites/cite/post/bb66ebc5-7121-48b5-9f53-b56537d9561b.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>dc:type</csw:ElementName>
+    <csw:ElementName>ows:BoundingBox</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:And>
+          <ogc:Not>
+            <ogc:BBOX>
+              <ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+              <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+                <gml:lowerCorner>40.0 -9.0</gml:lowerCorner>
+                <gml:upperCorner>50.0 -5.0</gml:upperCorner>
+              </gml:Envelope>
+            </ogc:BBOX>
+          </ogc:Not>
+          <ogc:PropertyIsEqualTo matchCase="false">
+            <ogc:PropertyName>dc:type</ogc:PropertyName>
+            <ogc:Literal>HTTP://purl.org/dc/dcmitype/dataset</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+        </ogc:And>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/c02d1c85-df9f-45ee-bea7-345c35e02a98.xml b/tests/suites/cite/post/c02d1c85-df9f-45ee-bea7-345c35e02a98.xml
new file mode 100644
index 0000000..dde6f18
--- /dev/null
+++ b/tests/suites/cite/post/c02d1c85-df9f-45ee-bea7-345c35e02a98.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>dc:title</ogc:PropertyName>
+          <ogc:Function name="DummyFunction">
+            <ogc:Literal>input.argument</ogc:Literal>
+          </ogc:Function>
+        </ogc:PropertyIsEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/c311a342-72e3-4983-be39-868e6ed9740f.xml b/tests/suites/cite/post/c311a342-72e3-4983-be39-868e6ed9740f.xml
new file mode 100644
index 0000000..5200856
--- /dev/null
+++ b/tests/suites/cite/post/c311a342-72e3-4983-be39-868e6ed9740f.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:DescribeRecord schemaLanguage="http://www.w3.org/XML/Schema" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="ht [...]
+  <csw:TypeName>csw:Record</csw:TypeName>
+</csw:DescribeRecord>
diff --git a/tests/suites/cite/post/c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml b/tests/suites/cite/post/c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml
new file mode 100644
index 0000000..961e505
--- /dev/null
+++ b/tests/suites/cite/post/c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>dc:date</csw:ElementName>
+    <csw:ElementName>ows:BoundingBox</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:Or>
+          <ogc:BBOX>
+            <ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+            <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+              <gml:lowerCorner>47.0 -4.5</gml:lowerCorner>
+              <gml:upperCorner>52.0 1.0</gml:upperCorner>
+            </gml:Envelope>
+          </ogc:BBOX>
+          <ogc:PropertyIsGreaterThan>
+            <ogc:PropertyName>dc:date</ogc:PropertyName>
+            <ogc:Literal>2006-01-01Z</ogc:Literal>
+          </ogc:PropertyIsGreaterThan>
+        </ogc:Or>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/c8588f47-8e65-45f5-ad34-ff4524cad84d.xml b/tests/suites/cite/post/c8588f47-8e65-45f5-ad34-ff4524cad84d.xml
new file mode 100644
index 0000000..0b55fed
--- /dev/null
+++ b/tests/suites/cite/post/c8588f47-8e65-45f5-ad34-ff4524cad84d.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:BBOX>
+          <ogc:PropertyName>dct:spatial</ogc:PropertyName>
+          <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:6.11:4326">
+            <gml:lowerCorner>47.0 -4.5</gml:lowerCorner>
+            <gml:upperCorner>52.0 1.0</gml:upperCorner>
+          </gml:Envelope>
+        </ogc:BBOX>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml b/tests/suites/cite/post/da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml
new file mode 100644
index 0000000..a694ce4
--- /dev/null
+++ b/tests/suites/cite/post/da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:SummaryRecord">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike escapeChar="\" singleChar="." wildCard="*">
+          <ogc:PropertyName>/dc:title</ogc:PropertyName>
+          <ogc:Literal>*lorem*</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml b/tests/suites/cite/post/dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml
new file mode 100644
index 0000000..ecf6b3a
--- /dev/null
+++ b/tests/suites/cite/post/dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementName>dc:identifier</csw:ElementName>
+    <csw:ElementName>dc:type</csw:ElementName>
+    <csw:ElementName>dc:date</csw:ElementName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLessThan>
+          <ogc:PropertyName>dc:date</ogc:PropertyName>
+          <ogc:Literal>2006-05-01Z</ogc:Literal>
+        </ogc:PropertyIsLessThan>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml b/tests/suites/cite/post/dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml
new file mode 100644
index 0000000..81aea41
--- /dev/null
+++ b/tests/suites/cite/post/dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/e308f030-c097-4036-a838-44bad74c9ef7.xml b/tests/suites/cite/post/e308f030-c097-4036-a838-44bad74c9ef7.xml
new file mode 100644
index 0000000..19bb2e0
--- /dev/null
+++ b/tests/suites/cite/post/e308f030-c097-4036-a838-44bad74c9ef7.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="http://www.occamlab.com/te" xml [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml b/tests/suites/cite/post/e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml
new file mode 100644
index 0000000..6dc06f1
--- /dev/null
+++ b/tests/suites/cite/post/e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+    <ogc:SortBy>
+      <ogc:SortProperty>
+        <ogc:PropertyName>dc:identifier</ogc:PropertyName>
+        <ogc:SortOrder>ASC</ogc:SortOrder>
+      </ogc:SortProperty>
+    </ogc:SortBy>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/f7976c55-a156-4421-8199-bc0487da4b0f.xml b/tests/suites/cite/post/f7976c55-a156-4421-8199-bc0487da4b0f.xml
new file mode 100644
index 0000000..5200856
--- /dev/null
+++ b/tests/suites/cite/post/f7976c55-a156-4421-8199-bc0487da4b0f.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:DescribeRecord schemaLanguage="http://www.w3.org/XML/Schema" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="ht [...]
+  <csw:TypeName>csw:Record</csw:TypeName>
+</csw:DescribeRecord>
diff --git a/tests/suites/cite/post/f7d79701-f10b-4087-a33c-f62df0a04fd1.xml b/tests/suites/cite/post/f7d79701-f10b-4087-a33c-f62df0a04fd1.xml
new file mode 100644
index 0000000..19bb2e0
--- /dev/null
+++ b/tests/suites/cite/post/f7d79701-f10b-4087-a33c-f62df0a04fd1.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers" xmlns:saxon="http://saxon.sf.net/" xmlns:te="http://www.occamlab.com/te" xml [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml b/tests/suites/cite/post/fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml
new file mode 100644
index 0000000..186beb1
--- /dev/null
+++ b/tests/suites/cite/post/fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>dc:title</ogc:PropertyName>
+          <ogc:Literal>Fuscé vitae ligulä</ogc:Literal>
+        </ogc:PropertyIsEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/cite/post/fe20960f-a26c-4f13-852d-470a0d3233f9.xml b/tests/suites/cite/post/fe20960f-a26c-4f13-852d-470a0d3233f9.xml
new file mode 100644
index 0000000..d011b2e
--- /dev/null
+++ b/tests/suites/cite/post/fe20960f-a26c-4f13-852d-470a0d3233f9.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:GetRecords resultType="results" service="CSW" version="2.0.2" xmlns="http://www.occamlab.com/ctl" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ctl="http://www.occamlab.com/ctl" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:p="http://teamengine.sourceforge.net/parsers" xmlns:parsers="http://www.occamlab.com/te/parsers [...]
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>brief</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsEqualTo matchCase="false">
+          <ogc:PropertyName>dc:subject</ogc:PropertyName>
+          <ogc:Literal>pHYSIOGRAPHy</ogc:Literal>
+        </ogc:PropertyIsEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/default.cfg b/tests/suites/default/default.cfg
new file mode 100644
index 0000000..952454c
--- /dev/null
+++ b/tests/suites/default/default.cfg
@@ -0,0 +1,90 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/default/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://demo.pycsw.org/gisdata/csw
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/default/get/requests.txt b/tests/suites/default/get/requests.txt
new file mode 100644
index 0000000..897622a
--- /dev/null
+++ b/tests/suites/default/get/requests.txt
@@ -0,0 +1,7 @@
+GetCapabilities,PYCSW_SERVER?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetCapabilities
+GetCapabilities-invalid-request,PYCSW_SERVER?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetCapabilitiese
+GetRecords-all,PYCSW_SERVER?config=tests/suites/default/default.cfg&service=CSW&version=2.0.2&request=GetRecords&typenames=csw:Record&elementsetname=full
+GetRecords-sortby-asc,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:A
+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
diff --git a/tests/suites/default/post/DescribeRecord-json.xml b/tests/suites/default/post/DescribeRecord-json.xml
new file mode 100644
index 0000000..35c176c
--- /dev/null
+++ b/tests/suites/default/post/DescribeRecord-json.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<DescribeRecord service="CSW" version="2.0.2" outputFormat="application/json" schemaLanguage="http://www.w3.org/XML/Schema" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="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-discovery.xsd">
+	<TypeName>csw:Record</TypeName>
+</DescribeRecord>
diff --git a/tests/suites/default/post/DescribeRecord.xml b/tests/suites/default/post/DescribeRecord.xml
new file mode 100644
index 0000000..102443e
--- /dev/null
+++ b/tests/suites/default/post/DescribeRecord.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<DescribeRecord service="CSW" version="2.0.2" outputFormat="application/xml" schemaLanguage="http://www.w3.org/XML/Schema" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="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-discovery.xsd">
+	<TypeName>csw:Record</TypeName>
+</DescribeRecord>
diff --git a/tests/suites/default/post/Exception-GetRecords-badsrsname.xml b/tests/suites/default/post/Exception-GetRecords-badsrsname.xml
new file mode 100644
index 0000000..61f4b2d
--- /dev/null
+++ b/tests/suites/default/post/Exception-GetRecords-badsrsname.xml
@@ -0,0 +1,19 @@
+<?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.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-discovery.xsd" xmlns:gml="http://www.opengis.net/gml">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>brief</csw:ElementSetName>
+		<csw:Constraint version="1.1.0">
+			<ogc:Filter>
+
+					<ogc:BBOX>
+						<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+						<gml:Envelope srsName="EPSG:226">
+							<gml:lowerCorner>-90 -180</gml:lowerCorner>
+							<gml:upperCorner>90 180</gml:upperCorner>
+						</gml:Envelope>
+					</ogc:BBOX>
+			</ogc:Filter>
+		</csw:Constraint>
+	</csw:Query>
+</csw:GetRecords>
+
diff --git a/tests/suites/default/post/Exception-GetRecords-elementname.xml b/tests/suites/default/post/Exception-GetRecords-elementname.xml
new file mode 100644
index 0000000..2dc8935
--- /dev/null
+++ b/tests/suites/default/post/Exception-GetRecords-elementname.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:dc="http://purl.org/dc/elements/1.1/" 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.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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementName>dc:foo</csw:ElementName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/Exception-GetRecords-invalid-xml.xml b/tests/suites/default/post/Exception-GetRecords-invalid-xml.xml
new file mode 100644
index 0000000..0bdf07f
--- /dev/null
+++ b/tests/suites/default/post/Exception-GetRecords-invalid-xml.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:dc="http://purl.org/dc/elements/1.1/" 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.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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementNamefoo>dc:foo</csw:ElementNamefoo>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetCapabilities-SOAP.xml b/tests/suites/default/post/GetCapabilities-SOAP.xml
new file mode 100644
index 0000000..9069189
--- /dev/null
+++ b/tests/suites/default/post/GetCapabilities-SOAP.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2003/05/soap-envelope http://www.w3.org/2003/05/soap-envelope">
+	<soapenv:Body>
+		<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+			<ows:AcceptVersions>
+				<ows:Version>2.0.2</ows:Version>
+			</ows:AcceptVersions>
+			<ows:AcceptFormats>
+				<ows:OutputFormat>application/xml</ows:OutputFormat>
+			</ows:AcceptFormats>
+		</GetCapabilities>
+	</soapenv:Body>
+</soapenv:Envelope>
diff --git a/tests/suites/default/post/GetCapabilities-sections.xml b/tests/suites/default/post/GetCapabilities-sections.xml
new file mode 100644
index 0000000..b3390de
--- /dev/null
+++ b/tests/suites/default/post/GetCapabilities-sections.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:Sections>
+      <ows:Section>ServiceProvider</ows:Section>
+   </ows:Sections>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/default/post/GetCapabilities-updatesequence.xml b/tests/suites/default/post/GetCapabilities-updatesequence.xml
new file mode 100644
index 0000000..d2f3296
--- /dev/null
+++ b/tests/suites/default/post/GetCapabilities-updatesequence.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities updateSequence="123" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/default/post/GetCapabilities.xml b/tests/suites/default/post/GetCapabilities.xml
new file mode 100644
index 0000000..e4dc807
--- /dev/null
+++ b/tests/suites/default/post/GetCapabilities.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/default/post/GetDomain-parameter.xml b/tests/suites/default/post/GetDomain-parameter.xml
new file mode 100644
index 0000000..2d1dd2d
--- /dev/null
+++ b/tests/suites/default/post/GetDomain-parameter.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetDomain service="CSW" version="2.0.2" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="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-discovery.xsd">
+	<ParameterName>GetRecords.CONSTRAINTLANGUAGE</ParameterName>
+</GetDomain>
diff --git a/tests/suites/default/post/GetDomain-property.xml b/tests/suites/default/post/GetDomain-property.xml
new file mode 100644
index 0000000..c6ca09c
--- /dev/null
+++ b/tests/suites/default/post/GetDomain-property.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetDomain service="CSW" version="2.0.2" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="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-discovery.xsd">
+	<PropertyName>dc:title</PropertyName>
+</GetDomain>
diff --git a/tests/suites/default/post/GetRecordById-json.xml b/tests/suites/default/post/GetRecordById-json.xml
new file mode 100644
index 0000000..887e6d1
--- /dev/null
+++ b/tests/suites/default/post/GetRecordById-json.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetRecordById service="CSW" version="2.0.2" outputFormat="application/json" outputSchema="http://www.opengis.net/cat/csw/2.0.2" 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-discovery.xsd">
+	<Id>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</Id>
+	<ElementSetName>summary</ElementSetName>
+</GetRecordById>
diff --git a/tests/suites/default/post/GetRecordById.xml b/tests/suites/default/post/GetRecordById.xml
new file mode 100644
index 0000000..af59d78
--- /dev/null
+++ b/tests/suites/default/post/GetRecordById.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetRecordById service="CSW" version="2.0.2" outputFormat="application/xml" outputSchema="http://www.opengis.net/cat/csw/2.0.2" 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-discovery.xsd">
+	<Id>urn:uuid:94bc9c83-97f6-4b40-9eb8-a8e8787a5c63</Id>
+	<ElementSetName>summary</ElementSetName>
+</GetRecordById>
diff --git a/tests/suites/default/post/GetRecords-all-json.xml b/tests/suites/default/post/GetRecords-all-json.xml
new file mode 100644
index 0000000..3e17c97
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-all-json.xml
@@ -0,0 +1,6 @@
+<?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/json" outputSchema="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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-all-resulttype-hits.xml b/tests/suites/default/post/GetRecords-all-resulttype-hits.xml
new file mode 100644
index 0000000..c91e92e
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-all-resulttype-hits.xml
@@ -0,0 +1,6 @@
+<?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="hits" startPosition="1" maxRecords="5" outputFormat="application/xml" outputSchema="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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-all-resulttype-validate.xml b/tests/suites/default/post/GetRecords-all-resulttype-validate.xml
new file mode 100644
index 0000000..c977bda
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-all-resulttype-validate.xml
@@ -0,0 +1,6 @@
+<?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="validate" startPosition="1" maxRecords="5" outputFormat="application/xml" outputSchema="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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-all-sortby-bbox.xml b/tests/suites/default/post/GetRecords-all-sortby-bbox.xml
new file mode 100644
index 0000000..eace825
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-all-sortby-bbox.xml
@@ -0,0 +1,12 @@
+<?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.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-discovery.xsd">
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>full</csw:ElementSetName>
+        <ogc:SortBy>
+            <ogc:SortProperty>
+                <ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+                <ogc:SortOrder>DESC</ogc:SortOrder>
+            </ogc:SortProperty>
+        </ogc:SortBy>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-all.xml b/tests/suites/default/post/GetRecords-all.xml
new file mode 100644
index 0000000..6bb353c
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-all.xml
@@ -0,0 +1,6 @@
+<?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.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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-cql-title.xml b/tests/suites/default/post/GetRecords-cql-title.xml
new file mode 100644
index 0000000..9297223
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-cql-title.xml
@@ -0,0 +1,9 @@
+<?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.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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>brief</csw:ElementSetName>
+		<csw:Constraint version="1.1.0">
+			<csw:CqlText>dc:title like '%ips%'</csw:CqlText>
+		</csw:Constraint>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-distributedsearch.xml b/tests/suites/default/post/GetRecords-distributedsearch.xml
new file mode 100644
index 0000000..b64549a
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-distributedsearch.xml
@@ -0,0 +1,15 @@
+<?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.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-discovery.xsd">
+	<csw:DistributedSearch hopCount="2"/>
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>brief</csw:ElementSetName>
+                <csw:Constraint version="1.1.0">
+                <ogc:Filter>
+                    <ogc:PropertyIsEqualTo>
+                        <ogc:PropertyName>dc:title</ogc:PropertyName>
+                        <ogc:Literal>Aquifers</ogc:Literal>
+                    </ogc:PropertyIsEqualTo>
+                </ogc:Filter>
+            </csw:Constraint>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-elementname.xml b/tests/suites/default/post/GetRecords-elementname.xml
new file mode 100644
index 0000000..2acf2ae
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-elementname.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:dc="http://purl.org/dc/elements/1.1/" 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.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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementName>dc:title</csw:ElementName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-end.xml b/tests/suites/default/post/GetRecords-end.xml
new file mode 100644
index 0000000..e03137e
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-end.xml
@@ -0,0 +1,6 @@
+<?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="10" maxRecords="5" outputFormat="application/xml" outputSchema="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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-and-bbox-freetext.xml b/tests/suites/default/post/GetRecords-filter-and-bbox-freetext.xml
new file mode 100644
index 0000000..ce78713
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-and-bbox-freetext.xml
@@ -0,0 +1,23 @@
+<?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.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-discovery.xsd" xmlns:gml="http://www.opengis.net/gml">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>brief</csw:ElementSetName>
+		<csw:Constraint version="1.1.0">
+			<ogc:Filter>
+				<ogc:And>
+					<ogc:PropertyIsLike matchCase="false" wildCard="%" singleChar="_" escapeChar="\">
+						<ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+						<ogc:Literal>%lor%</ogc:Literal>
+					</ogc:PropertyIsLike>
+					<ogc:BBOX>
+						<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+						<gml:Envelope>
+							<gml:lowerCorner>47 -5</gml:lowerCorner>
+							<gml:upperCorner>55 20</gml:upperCorner>
+						</gml:Envelope>
+					</ogc:BBOX>
+				</ogc:And>
+			</ogc:Filter>
+		</csw:Constraint>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-and-nested-or.xml b/tests/suites/default/post/GetRecords-filter-and-nested-or.xml
new file mode 100644
index 0000000..46884d1
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-and-nested-or.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<GetRecords service="CSW" version="2.0.2" maxRecords="10" resultType="results" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" 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">
+    <Query typeNames="csw:Record">
+       <ElementSetName>full</ElementSetName>
+       <Constraint version="1.0.0">
+          <ogc:Filter>
+             <ogc:And>
+                <ogc:PropertyIsEqualTo>
+                   <ogc:PropertyName>dc:title</ogc:PropertyName>
+                   <ogc:Literal>Aliquam fermentum purus quis arcu</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+                <ogc:PropertyIsEqualTo>
+                   <ogc:PropertyName>dc:format</ogc:PropertyName>
+                   <ogc:Literal>application/pdf</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+                <ogc:Or>
+                   <ogc:PropertyIsEqualTo>
+                      <ogc:PropertyName>dc:type</ogc:PropertyName>
+                      <ogc:Literal>http://purl.org/dc/dcmitype/Dataset</ogc:Literal>
+                   </ogc:PropertyIsEqualTo>
+                   <ogc:PropertyIsEqualTo>
+                      <ogc:PropertyName>dc:type</ogc:PropertyName>
+                      <ogc:Literal>http://purl.org/dc/dcmitype/Service</ogc:Literal>
+                   </ogc:PropertyIsEqualTo>
+                   <ogc:PropertyIsEqualTo>
+                      <ogc:PropertyName>dc:type</ogc:PropertyName>
+                      <ogc:Literal>http://purl.org/dc/dcmitype/Image</ogc:Literal>
+                   </ogc:PropertyIsEqualTo>
+                   <ogc:PropertyIsEqualTo>
+                      <ogc:PropertyName>dc:type</ogc:PropertyName>
+                      <ogc:Literal>http://purl.org/dc/dcmitype/Text</ogc:Literal>
+                   </ogc:PropertyIsEqualTo>
+                </ogc:Or>
+             </ogc:And>
+          </ogc:Filter>
+       </Constraint>
+    </Query>
+</GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-and-nested-or2.xml b/tests/suites/default/post/GetRecords-filter-and-nested-or2.xml
new file mode 100644
index 0000000..7291138
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-and-nested-or2.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<GetRecords service="CSW" version="2.0.2" maxRecords="10" resultType="results" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" 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">
+    <Query typeNames="csw:Record">
+       <ElementSetName>full</ElementSetName>
+       <Constraint version="1.0.0">
+          <ogc:Filter>
+             <ogc:And>
+                <ogc:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\">
+                   <ogc:PropertyName>dc:title</ogc:PropertyName>
+                   <ogc:Literal>Lorem%</ogc:Literal>
+                </ogc:PropertyIsLike>
+                <ogc:Or>
+                   <ogc:PropertyIsEqualTo>
+                      <ogc:PropertyName>dc:type</ogc:PropertyName>
+                      <ogc:Literal>http://purl.org/dc/dcmitype/Dataset</ogc:Literal>
+                   </ogc:PropertyIsEqualTo>
+                   <ogc:PropertyIsEqualTo>
+                      <ogc:PropertyName>dc:type</ogc:PropertyName>
+                      <ogc:Literal>http://purl.org/dc/dcmitype/Service</ogc:Literal>
+                   </ogc:PropertyIsEqualTo>
+                   <ogc:PropertyIsEqualTo>
+                      <ogc:PropertyName>dc:type</ogc:PropertyName>
+                      <ogc:Literal>http://purl.org/dc/dcmitype/Image</ogc:Literal>
+                   </ogc:PropertyIsEqualTo>
+                   <ogc:PropertyIsEqualTo>
+                      <ogc:PropertyName>dc:type</ogc:PropertyName>
+                      <ogc:Literal>http://purl.org/dc/dcmitype/Text</ogc:Literal>
+                   </ogc:PropertyIsEqualTo>
+                </ogc:Or>
+             </ogc:And>
+          </ogc:Filter>
+       </Constraint>
+    </Query>
+</GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-anytext-and-not.xml b/tests/suites/default/post/GetRecords-filter-anytext-and-not.xml
new file mode 100644
index 0000000..d3125b6
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-anytext-and-not.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" outputSchema="http://www.opengis.net/cat/csw/2.0.2" outputFormat="application/xml" version="2.0.2" service="CSW" resultType="results" maxRecords="10" xsi:schemaLocation="http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd">
+  <csw:Query typeNames="csw:Record">
+    <csw:ElementSetName>summary</csw:ElementSetName>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:And>
+          <ogc:PropertyIsLike wildCard="*" singleChar="?" escapeChar="\" matchCase="false">
+            <ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+            <ogc:Literal>*lorem*</ogc:Literal>
+          </ogc:PropertyIsLike>
+          <ogc:PropertyIsLike wildCard="*" singleChar="?" escapeChar="\" matchCase="false">
+            <ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+            <ogc:Literal>*ipsum*</ogc:Literal>
+          </ogc:PropertyIsLike>
+          <ogc:Not>
+            <ogc:PropertyIsLike wildCard="*" singleChar="?" escapeChar="\" matchCase="false">
+              <ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+              <ogc:Literal>*dolor*</ogc:Literal>
+            </ogc:PropertyIsLike>
+          </ogc:Not>
+        </ogc:And>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-anytext-equal.xml b/tests/suites/default/post/GetRecords-filter-anytext-equal.xml
new file mode 100644
index 0000000..0c64e71
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-anytext-equal.xml
@@ -0,0 +1,14 @@
+<?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.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-discovery.xsd">
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+                    <ogc:PropertyIsEqualTo>
+                        <ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+                        <ogc:Literal>Lor</ogc:Literal>
+                    </ogc:PropertyIsEqualTo>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-anytext.xml b/tests/suites/default/post/GetRecords-filter-anytext.xml
new file mode 100644
index 0000000..8ab5bff
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-anytext.xml
@@ -0,0 +1,14 @@
+<?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.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-discovery.xsd">
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+                    <ogc:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\">
+                        <ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+                        <ogc:Literal>%Lor%</ogc:Literal>
+                    </ogc:PropertyIsLike>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-bbox-reproject.xml b/tests/suites/default/post/GetRecords-filter-bbox-reproject.xml
new file mode 100644
index 0000000..73d60ef
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-bbox-reproject.xml
@@ -0,0 +1,17 @@
+<?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.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-discovery.xsd" xmlns:gml="http://www.opengis.net/gml">
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+				<ogc:BBOX>
+					<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+					<gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:6.11:2192">
+						<gml:lowerCorner>-72310.84768270838 2013215.2698528299</gml:lowerCorner>
+						<gml:upperCorner>279667.74290441966 2690819.5081175645</gml:upperCorner>
+					</gml:Envelope>
+				</ogc:BBOX>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-bbox-sortby.xml b/tests/suites/default/post/GetRecords-filter-bbox-sortby.xml
new file mode 100644
index 0000000..9e7b7ef
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-bbox-sortby.xml
@@ -0,0 +1,23 @@
+<?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.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-discovery.xsd" xmlns:gml="http://www.opengis.net/gml">
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+				<ogc:BBOX>
+					<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+					<gml:Envelope>
+						<gml:lowerCorner>47 -5</gml:lowerCorner>
+						<gml:upperCorner>55 20</gml:upperCorner>
+					</gml:Envelope>
+				</ogc:BBOX>
+            </ogc:Filter>
+        </csw:Constraint>
+        <ogc:SortBy>
+            <ogc:SortProperty>
+                <ogc:PropertyName>dc:title</ogc:PropertyName>
+                <ogc:SortOrder>DESC</ogc:SortOrder>
+            </ogc:SortProperty>
+        </ogc:SortBy>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-bbox.xml b/tests/suites/default/post/GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..9df9553
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-bbox.xml
@@ -0,0 +1,17 @@
+<?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.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-discovery.xsd" xmlns:gml="http://www.opengis.net/gml">
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+				<ogc:BBOX>
+					<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+					<gml:Envelope>
+						<gml:lowerCorner>47 -5</gml:lowerCorner>
+						<gml:upperCorner>55 20</gml:upperCorner>
+					</gml:Envelope>
+				</ogc:BBOX>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-between.xml b/tests/suites/default/post/GetRecords-filter-between.xml
new file mode 100644
index 0000000..ea00efb
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-between.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" xmlns:gml="http://www.opengis.net/gml" service="CSW" version="2.0.2" resultType="results" startPosition="1" maxRecords="5" outputFormat="application/xml" outputSchema="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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+		<csw:Constraint version="1.1.0">
+			<ogc:Filter>
+				<ogc:PropertyIsBetween>
+					<ogc:PropertyName>dc:title</ogc:PropertyName>
+					<ogc:LowerBoundary>
+						<ogc:Literal>Aliquam fermentum purus quis arcu</ogc:Literal>
+					</ogc:LowerBoundary>
+					<ogc:UpperBoundary>
+						<ogc:Literal>Maecenas enim</ogc:Literal>
+					</ogc:UpperBoundary>
+				</ogc:PropertyIsBetween>
+			</ogc:Filter>
+		</csw:Constraint>
+	</csw:Query>
+</csw:GetRecords>
+
diff --git a/tests/suites/default/post/GetRecords-filter-function-bad.xml b/tests/suites/default/post/GetRecords-filter-function-bad.xml
new file mode 100644
index 0000000..75dbacc
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-function-bad.xml
@@ -0,0 +1,17 @@
+<?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.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-discovery.xsd">
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+                <ogc:PropertyIsEqualTo>
+                    <ogc:Function name="foo">
+                        <ogc:PropertyName>dc:title</ogc:PropertyName>
+                    </ogc:Function>
+                    <ogc:Literal>LOREM IPSUM</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
+
diff --git a/tests/suites/default/post/GetRecords-filter-function.xml b/tests/suites/default/post/GetRecords-filter-function.xml
new file mode 100644
index 0000000..68cb045
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-function.xml
@@ -0,0 +1,17 @@
+<?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.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-discovery.xsd">
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+                <ogc:PropertyIsEqualTo>
+                    <ogc:Function name="upper">
+                        <ogc:PropertyName>dc:title</ogc:PropertyName>
+                    </ogc:Function>
+                    <ogc:Literal>LOREM IPSUM</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
+
diff --git a/tests/suites/default/post/GetRecords-filter-not-bbox.xml b/tests/suites/default/post/GetRecords-filter-not-bbox.xml
new file mode 100644
index 0000000..6adb4cf
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-not-bbox.xml
@@ -0,0 +1,19 @@
+<?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.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-discovery.xsd" xmlns:gml="http://www.opengis.net/gml">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>brief</csw:ElementSetName>
+		<csw:Constraint version="1.1.0">
+			<ogc:Filter>
+				<ogc:Not>
+					<ogc:BBOX>
+						<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+						<gml:Envelope>
+							<gml:lowerCorner>47 -5</gml:lowerCorner>
+							<gml:upperCorner>55 20</gml:upperCorner>
+						</gml:Envelope>
+					</ogc:BBOX>
+				</ogc:Not>
+			</ogc:Filter>
+		</csw:Constraint>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-or-bbox-freetext.xml b/tests/suites/default/post/GetRecords-filter-or-bbox-freetext.xml
new file mode 100644
index 0000000..bdfc60e
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-or-bbox-freetext.xml
@@ -0,0 +1,23 @@
+<?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.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-discovery.xsd" xmlns:gml="http://www.opengis.net/gml">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>brief</csw:ElementSetName>
+		<csw:Constraint version="1.1.0">
+			<ogc:Filter>
+				<ogc:Or>
+					<ogc:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\">
+						<ogc:PropertyName>dc:title</ogc:PropertyName>
+						<ogc:Literal>foo</ogc:Literal>
+					</ogc:PropertyIsLike>
+					<ogc:BBOX>
+						<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+						<gml:Envelope>
+							<gml:lowerCorner>47 -5</gml:lowerCorner>
+							<gml:upperCorner>55 20</gml:upperCorner>
+						</gml:Envelope>
+					</ogc:BBOX>
+				</ogc:Or>
+			</ogc:Filter>
+		</csw:Constraint>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-or-nested-and.xml b/tests/suites/default/post/GetRecords-filter-or-nested-and.xml
new file mode 100644
index 0000000..1ff37fa
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-or-nested-and.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<GetRecords service="CSW" version="2.0.2" maxRecords="10" resultType="results" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" 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">
+    <Query typeNames="csw:Record">
+       <ElementSetName>full</ElementSetName>
+       <Constraint version="1.0.0">
+          <ogc:Filter>
+             <ogc:Or>
+                <ogc:PropertyIsEqualTo>
+                   <ogc:PropertyName>dc:type</ogc:PropertyName>
+                   <ogc:Literal>http://purl.org/dc/dcmitype/Image</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+                <ogc:PropertyIsEqualTo>
+                   <ogc:PropertyName>dc:type</ogc:PropertyName>
+                   <ogc:Literal>http://purl.org/dc/dcmitype/Dataset</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+                <ogc:And>
+                   <ogc:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\">
+                      <ogc:PropertyName>dc:title</ogc:PropertyName>
+                      <ogc:Literal>Mauris%</ogc:Literal>
+                   </ogc:PropertyIsLike>
+                   <ogc:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\">
+                      <ogc:PropertyName>dc:title</ogc:PropertyName>
+                      <ogc:Literal>%neque</ogc:Literal>
+                   </ogc:PropertyIsLike>
+                </ogc:And>
+             </ogc:Or>
+          </ogc:Filter>
+       </Constraint>
+    </Query>
+</GetRecords>
diff --git a/tests/suites/default/post/GetRecords-filter-or-title-abstract.xml b/tests/suites/default/post/GetRecords-filter-or-title-abstract.xml
new file mode 100644
index 0000000..331dca2
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-filter-or-title-abstract.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.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-discovery.xsd" xmlns:gml="http://www.opengis.net/gml">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+		<csw:Constraint version="1.1.0">
+			<ogc:Filter>
+				<ogc:Or>
+					<ogc:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\">
+						<ogc:PropertyName>dc:title</ogc:PropertyName>
+						<ogc:Literal>Mauris%</ogc:Literal>
+					</ogc:PropertyIsLike>
+					<ogc:PropertyIsLike wildCard="%" singleChar="_" escapeChar="\">
+						<ogc:PropertyName>dct:abstract</ogc:PropertyName>
+						<ogc:Literal>foo</ogc:Literal>
+					</ogc:PropertyIsLike>
+				</ogc:Or>
+			</ogc:Filter>
+		</csw:Constraint>
+	</csw:Query>
+</csw:GetRecords>
\ No newline at end of file
diff --git a/tests/suites/default/post/GetRecords-maxrecords.xml b/tests/suites/default/post/GetRecords-maxrecords.xml
new file mode 100644
index 0000000..1379ea6
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-maxrecords.xml
@@ -0,0 +1,6 @@
+<?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="1" outputFormat="application/xml" outputSchema="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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/GetRecords-requestid.xml b/tests/suites/default/post/GetRecords-requestid.xml
new file mode 100644
index 0000000..186d04e
--- /dev/null
+++ b/tests/suites/default/post/GetRecords-requestid.xml
@@ -0,0 +1,6 @@
+<?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" requestId="ce74a6c8-677a-42b3-a07c-ce44df8ce7ab" resultType="results" startPosition="1" maxRecords="5" outputFormat="application/xml" outputSchema="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-discovery.xsd">
+	<csw:Query typeNames="csw:Record">
+		<csw:ElementSetName>full</csw:ElementSetName>
+	</csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/default/post/Harvest-default.xml b/tests/suites/default/post/Harvest-default.xml
new file mode 100644
index 0000000..599ba76
--- /dev/null
+++ b/tests/suites/default/post/Harvest-default.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ows="http://www.opengis.net/ows" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" 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/C [...]
+  <Source>http://schemas.opengis.net/csw/2.0.2/profiles/apiso/1.0.0/examples-ISO19139/dataset2_minimalst.xml</Source>
+  <ResourceType>http://www.isotc211.org/schemas/2005/gmd/</ResourceType>
+  <ResourceFormat>application/xml</ResourceFormat>
+</Harvest>
diff --git a/tests/suites/default/post/Harvest-response-handler.xml b/tests/suites/default/post/Harvest-response-handler.xml
new file mode 100644
index 0000000..9d43517
--- /dev/null
+++ b/tests/suites/default/post/Harvest-response-handler.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ows="http://www.opengis.net/ows" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" 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/C [...]
+  <Source>http://kralidis.ca/pycsw/trunk/tests/test_iso.xml</Source>
+  <ResourceType>http://www.isotc211.org/schemas/2005/gmd/</ResourceType>
+  <ResourceFormat>application/xml</ResourceFormat>
+  <ResponseHandler>mailto:tkralidi</ResponseHandler>
+</Harvest>
diff --git a/tests/suites/default/post/Transaction-delete.xml b/tests/suites/default/post/Transaction-delete.xml
new file mode 100644
index 0000000..675a869
--- /dev/null
+++ b/tests/suites/default/post/Transaction-delete.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Delete>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>apiso:Identifier</ogc:PropertyName>
+          <ogc:Literal>12345</ogc:Literal>
+        </ogc:PropertyIsEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Delete>
+</csw:Transaction>
diff --git a/tests/suites/default/post/Transaction-insert.xml b/tests/suites/default/post/Transaction-insert.xml
new file mode 100644
index 0000000..1b238dd
--- /dev/null
+++ b/tests/suites/default/post/Transaction-insert.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+<csw:Insert>
+<gmd:MD_Metadata xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" 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>12345</gco:CharacterString>
+	</gmd:fileIdentifier>
+	<gmd:hierarchyLevel>
+		<gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#MD_ScopeCode" codeListValue="dataset"/>
+	</gmd:hierarchyLevel>
+	<gmd:contact>
+		<gmd:CI_ResponsibleParty>
+			<gmd:organisationName>
+				<gco:CharacterString>pycsw</gco:CharacterString>
+			</gmd:organisationName>
+			<gmd:role>
+				<gmd:CI_RoleCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_RoleCode" codeListValue="publisher"/>
+			</gmd:role>
+		</gmd:CI_ResponsibleParty>
+	</gmd:contact>
+	<gmd:dateStamp>
+		<gco:Date>2011-05-17</gco:Date>
+	</gmd:dateStamp>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title>
+						<gco:CharacterString>pycsw record</gco:CharacterString>
+					</gmd:title>
+					<gmd:date>
+						<gmd:CI_Date>
+							<gmd:date>
+								<gco:Date>2011-05-17</gco:Date>
+							</gmd:date>
+							<gmd:dateType>
+								<gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_DateTypeCode" codeListValue="revision"/>
+							</gmd:dateType>
+						</gmd:CI_Date>
+					</gmd:date>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract>
+				<gco:CharacterString>Sample metadata record</gco:CharacterString>
+			</gmd:abstract>
+			<gmd:language>
+				<gco:CharacterString>eng</gco:CharacterString>
+			</gmd:language>
+			<gmd:extent>
+				<gmd:EX_Extent>
+					<gmd:geographicElement>
+						<gmd:EX_GeographicBoundingBox>
+							<gmd:westBoundLongitude>
+								<gco:Decimal>-180</gco:Decimal>
+							</gmd:westBoundLongitude>
+							<gmd:eastBoundLongitude>
+								<gco:Decimal>180</gco:Decimal>
+							</gmd:eastBoundLongitude>
+							<gmd:southBoundLatitude>
+								<gco:Decimal>-90</gco:Decimal>
+							</gmd:southBoundLatitude>
+							<gmd:northBoundLatitude>
+								<gco:Decimal>90</gco:Decimal>
+							</gmd:northBoundLatitude>
+						</gmd:EX_GeographicBoundingBox>
+					</gmd:geographicElement>
+				</gmd:EX_Extent>
+			</gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+</gmd:MD_Metadata>
+</csw:Insert>
+</csw:Transaction>
diff --git a/tests/suites/default/post/Transaction-update-full.xml b/tests/suites/default/post/Transaction-update-full.xml
new file mode 100644
index 0000000..2ff6604
--- /dev/null
+++ b/tests/suites/default/post/Transaction-update-full.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+<csw:Update>
+<gmd:MD_Metadata xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" 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>12345</gco:CharacterString>
+	</gmd:fileIdentifier>
+	<gmd:hierarchyLevel>
+		<gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#MD_ScopeCode" codeListValue="dataset"/>
+	</gmd:hierarchyLevel>
+	<gmd:contact>
+		<gmd:CI_ResponsibleParty>
+			<gmd:organisationName>
+				<gco:CharacterString>pycsw</gco:CharacterString>
+			</gmd:organisationName>
+			<gmd:role>
+				<gmd:CI_RoleCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_RoleCode" codeListValue="publisher"/>
+			</gmd:role>
+		</gmd:CI_ResponsibleParty>
+	</gmd:contact>
+	<gmd:dateStamp>
+		<gco:Date>2011-05-17</gco:Date>
+	</gmd:dateStamp>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title>
+						<gco:CharacterString>pycsw record</gco:CharacterString>
+					</gmd:title>
+					<gmd:date>
+						<gmd:CI_Date>
+							<gmd:date>
+								<gco:Date>2011-05-17</gco:Date>
+							</gmd:date>
+							<gmd:dateType>
+								<gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_DateTypeCode" codeListValue="revision"/>
+							</gmd:dateType>
+						</gmd:CI_Date>
+					</gmd:date>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract>
+				<gco:CharacterString>Sample metadata record</gco:CharacterString>
+			</gmd:abstract>
+			<gmd:language>
+				<gco:CharacterString>eng</gco:CharacterString>
+			</gmd:language>
+			<gmd:extent>
+				<gmd:EX_Extent>
+					<gmd:geographicElement>
+						<gmd:EX_GeographicBoundingBox>
+							<gmd:westBoundLongitude>
+								<gco:Decimal>-180</gco:Decimal>
+							</gmd:westBoundLongitude>
+							<gmd:eastBoundLongitude>
+								<gco:Decimal>180</gco:Decimal>
+							</gmd:eastBoundLongitude>
+							<gmd:southBoundLatitude>
+								<gco:Decimal>-90</gco:Decimal>
+							</gmd:southBoundLatitude>
+							<gmd:northBoundLatitude>
+								<gco:Decimal>90</gco:Decimal>
+							</gmd:northBoundLatitude>
+						</gmd:EX_GeographicBoundingBox>
+					</gmd:geographicElement>
+				</gmd:EX_Extent>
+			</gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+</gmd:MD_Metadata>
+</csw:Update>
+</csw:Transaction>
diff --git a/tests/suites/default/post/Transaction-update-recordproperty.xml b/tests/suites/default/post/Transaction-update-recordproperty.xml
new file mode 100644
index 0000000..a130a5f
--- /dev/null
+++ b/tests/suites/default/post/Transaction-update-recordproperty.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Update>
+    <csw:RecordProperty>
+      <csw:Name>apiso:Title</csw:Name>
+      <csw:Value>NEW_TITLE</csw:Value>
+    </csw:RecordProperty>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>apiso:Identifier</ogc:PropertyName>
+          <ogc:Literal>12345</ogc:Literal>
+        </ogc:PropertyIsEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Update>
+</csw:Transaction>
diff --git a/tests/suites/dif/default.cfg b/tests/suites/dif/default.cfg
new file mode 100644
index 0000000..08d69c6
--- /dev/null
+++ b/tests/suites/dif/default.cfg
@@ -0,0 +1,90 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/dif/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/dif/post/DescribeRecord.xml b/tests/suites/dif/post/DescribeRecord.xml
new file mode 100644
index 0000000..2408da7
--- /dev/null
+++ b/tests/suites/dif/post/DescribeRecord.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<DescribeRecord service="CSW" version="2.0.2" outputFormat="application/xml" schemaLanguage="http://www.w3.org/XML/Schema" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" xmlns:csw="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-discovery.xsd">
+	<TypeName>dif:DIF</TypeName>
+</DescribeRecord>
diff --git a/tests/suites/dif/post/GetCapabilities.xml b/tests/suites/dif/post/GetCapabilities.xml
new file mode 100644
index 0000000..e4dc807
--- /dev/null
+++ b/tests/suites/dif/post/GetCapabilities.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/dif/post/GetRecords-filter-bbox.xml b/tests/suites/dif/post/GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..8804efe
--- /dev/null
+++ b/tests/suites/dif/post/GetRecords-filter-bbox.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:dif="http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" 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://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/" 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-discover [...]
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+				<ogc:BBOX>
+					<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+					<gml:Envelope>
+						<gml:lowerCorner>47 -5</gml:lowerCorner>
+						<gml:upperCorner>55 20</gml:upperCorner>
+					</gml:Envelope>
+				</ogc:BBOX>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/ebrim/default.cfg b/tests/suites/ebrim/default.cfg
new file mode 100644
index 0000000..0484326
--- /dev/null
+++ b/tests/suites/ebrim/default.cfg
@@ -0,0 +1,93 @@
+# =================================================================
+#
+# $Id: default.cfg 366 2011-11-24 21:52:13Z tomkralidis $
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+profiles=ebrim
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/ebrim/post/DescribeRecord.xml b/tests/suites/ebrim/post/DescribeRecord.xml
new file mode 100644
index 0000000..cd70881
--- /dev/null
+++ b/tests/suites/ebrim/post/DescribeRecord.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<DescribeRecord service="CSW" version="2.0.2" xmlns:rim="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" outputFormat="application/xml" xmlns:fgdc="http://www.opengis.net/cat/csw/csdgm" schemaLanguage="http://www.w3.org/XML/Schema" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="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-discovery.xsd">
+	<TypeName>rim:RegistryObject</TypeName>
+</DescribeRecord>
diff --git a/tests/suites/ebrim/post/GetCapabilities.xml b/tests/suites/ebrim/post/GetCapabilities.xml
new file mode 100644
index 0000000..e4dc807
--- /dev/null
+++ b/tests/suites/ebrim/post/GetCapabilities.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/ebrim/post/GetRecords-filter-bbox.xml b/tests/suites/ebrim/post/GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..ddb68ce
--- /dev/null
+++ b/tests/suites/ebrim/post/GetRecords-filter-bbox.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:fgdc="http://www.opengis.net/cat/csw/csdgm" 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="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0" 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.xs [...]
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+				<ogc:BBOX>
+					<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+					<gml:Envelope>
+						<gml:lowerCorner>47 -5</gml:lowerCorner>
+						<gml:upperCorner>55 20</gml:upperCorner>
+					</gml:Envelope>
+				</ogc:BBOX>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/fgdc/default.cfg b/tests/suites/fgdc/default.cfg
new file mode 100644
index 0000000..da6707a
--- /dev/null
+++ b/tests/suites/fgdc/default.cfg
@@ -0,0 +1,90 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/fgdc/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/fgdc/post/DescribeRecord.xml b/tests/suites/fgdc/post/DescribeRecord.xml
new file mode 100644
index 0000000..11dec89
--- /dev/null
+++ b/tests/suites/fgdc/post/DescribeRecord.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<DescribeRecord service="CSW" version="2.0.2" outputFormat="application/xml" xmlns:fgdc="http://www.opengis.net/cat/csw/csdgm" schemaLanguage="http://www.w3.org/XML/Schema" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="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-discovery.xsd">
+	<TypeName>fgdc:metadata</TypeName>
+</DescribeRecord>
diff --git a/tests/suites/fgdc/post/GetCapabilities.xml b/tests/suites/fgdc/post/GetCapabilities.xml
new file mode 100644
index 0000000..e4dc807
--- /dev/null
+++ b/tests/suites/fgdc/post/GetCapabilities.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/fgdc/post/GetRecords-filter-bbox.xml b/tests/suites/fgdc/post/GetRecords-filter-bbox.xml
new file mode 100644
index 0000000..47060cb
--- /dev/null
+++ b/tests/suites/fgdc/post/GetRecords-filter-bbox.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
+<csw:GetRecords xmlns:fgdc="http://www.opengis.net/cat/csw/csdgm" 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.opengis.net/cat/csw/csdgm" 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" xmln [...]
+    <csw:Query typeNames="csw:Record">
+        <csw:ElementSetName>brief</csw:ElementSetName>
+        <csw:Constraint version="1.1.0">
+            <ogc:Filter>
+				<ogc:BBOX>
+					<ogc:PropertyName>ows:BoundingBox</ogc:PropertyName>
+					<gml:Envelope>
+						<gml:lowerCorner>47 -5</gml:lowerCorner>
+						<gml:upperCorner>55 20</gml:upperCorner>
+					</gml:Envelope>
+				</ogc:BBOX>
+            </ogc:Filter>
+        </csw:Constraint>
+    </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/harvesting/data/.gitkeep b/tests/suites/harvesting/data/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/suites/harvesting/default.cfg b/tests/suites/harvesting/default.cfg
new file mode 100644
index 0000000..78f00ea
--- /dev/null
+++ b/tests/suites/harvesting/default.cfg
@@ -0,0 +1,91 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/harvesting/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+profiles=apiso
+
+[manager]
+transactions=true
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/harvesting/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/harvesting/get/requests.txt b/tests/suites/harvesting/get/requests.txt
new file mode 100644
index 0000000..9033d79
--- /dev/null
+++ b/tests/suites/harvesting/get/requests.txt
@@ -0,0 +1,5 @@
+Exception-Harvest-missing-resourcetype,PYCSW_SERVER?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest
+Exception-Harvest-missing-source,PYCSW_SERVER?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=http://www.opengis.net/wms
+Exception-Harvest-invalid-resourcetype,PYCSW_SERVER?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-waf-no-records-found,PYCSW_SERVER?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-bad-value,PYCSW_SERVER?config=tests/suites/manager/default.cfg&service=CSW&version=2.0.2&request=Harvest&resourcetype=urn:geoss:waf&source=badvalue
diff --git a/tests/suites/harvesting/post/Clear-000-delete-all.xml b/tests/suites/harvesting/post/Clear-000-delete-all.xml
new file mode 100644
index 0000000..827ccc7
--- /dev/null
+++ b/tests/suites/harvesting/post/Clear-000-delete-all.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Delete>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike wildCard="%" singleChar="." escapeChar="\">
+          <ogc:PropertyName>dc:identifier</ogc:PropertyName>
+          <ogc:Literal>%</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Delete>
+</csw:Transaction>
diff --git a/tests/suites/harvesting/post/Exception-Havest-csw-404.xml b/tests/suites/harvesting/post/Exception-Havest-csw-404.xml
new file mode 100644
index 0000000..dc66097
--- /dev/null
+++ b/tests/suites/harvesting/post/Exception-Havest-csw-404.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ows="http://www.opengis.net/ows" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" 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/C [...]
+  <Source>http://demo.pycsw.org/gisdata/cswBAD</Source>
+  <ResourceType>http://www.opengis.net/cat/csw/2.0.2</ResourceType>
+  <ResourceFormat>application/xml</ResourceFormat>
+</Harvest>
diff --git a/tests/suites/harvesting/post/GetCapabilities.xml b/tests/suites/harvesting/post/GetCapabilities.xml
new file mode 100644
index 0000000..e4dc807
--- /dev/null
+++ b/tests/suites/harvesting/post/GetCapabilities.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/harvesting/post/GetDomain-parameter.xml b/tests/suites/harvesting/post/GetDomain-parameter.xml
new file mode 100644
index 0000000..3779a05
--- /dev/null
+++ b/tests/suites/harvesting/post/GetDomain-parameter.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetDomain service="CSW" version="2.0.2" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="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-discovery.xsd">
+	<ParameterName>Harvest.ResourceType</ParameterName>
+</GetDomain>
diff --git a/tests/suites/harvesting/post/Harvest-csw.xml b/tests/suites/harvesting/post/Harvest-csw.xml
new file mode 100644
index 0000000..a3514f7
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-csw.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ows="http://www.opengis.net/ows" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" 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/C [...]
+  <Source>http://demo.pycsw.org/cite/csw</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-dc.xml b/tests/suites/harvesting/post/Harvest-dc.xml
new file mode 100644
index 0000000..bd94c72
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-dc.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ows="http://www.opengis.net/ows" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" 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/C [...]
+  <Source>http://demo.pycsw.org/metadata/Clause_10.2.5.3.2_Example03_Full.xml</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-fgdc.xml b/tests/suites/harvesting/post/Harvest-fgdc.xml
new file mode 100644
index 0000000..a9a48b5
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-fgdc.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ows="http://www.opengis.net/ows" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" 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/C [...]
+  <Source>http://demo.pycsw.org/metadata/CDC008.xml</Source>
+  <ResourceType>http://www.opengis.net/cat/csw/csdgm</ResourceType>
+  <ResourceFormat>application/xml</ResourceFormat>
+</Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-iso.xml b/tests/suites/harvesting/post/Harvest-iso.xml
new file mode 100644
index 0000000..5449275
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-iso.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ows="http://www.opengis.net/ows" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" 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/C [...]
+  <Source>http://demo.pycsw.org/metadata/dataset2_minimalst.xml</Source>
+  <ResourceType>http://www.isotc211.org/schemas/2005/gmd/</ResourceType>
+  <ResourceFormat>application/xml</ResourceFormat>
+</Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-rdf.xml b/tests/suites/harvesting/post/Harvest-rdf.xml
new file mode 100644
index 0000000..cd64151
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-rdf.xml
@@ -0,0 +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://demo.pycsw.org/metadata/dc-rdf.xml</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-sos100.xml b/tests/suites/harvesting/post/Harvest-sos100.xml
new file mode 100644
index 0000000..a7de0a3
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-sos100.xml
@@ -0,0 +1,5 @@
+<?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://www.neracoos.org/cgi-bin/sos/V1.0/oostethys_sos.cgi</Source>
+  <ResourceType>http://www.opengis.net/sos/1.0</ResourceType>
+</Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-sos200.xml b/tests/suites/harvesting/post/Harvest-sos200.xml
new file mode 100644
index 0000000..37e3db1
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-sos200.xml
@@ -0,0 +1,5 @@
+<?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://ngwd-bdnes.cits.nrcan.gc.ca/GinService/sos/gw</Source>
+  <ResourceType>http://www.opengis.net/sos/2.0</ResourceType>
+</Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-waf.xml b/tests/suites/harvesting/post/Harvest-waf.xml
new file mode 100644
index 0000000..9ecd86f
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-waf.xml
@@ -0,0 +1,5 @@
+<?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://demo.pycsw.org/waf</Source>
+  <ResourceType>urn:geoss:waf</ResourceType>
+</Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-wcs.xml b/tests/suites/harvesting/post/Harvest-wcs.xml
new file mode 100644
index 0000000..1767aef
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-wcs.xml
@@ -0,0 +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>
+  <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
new file mode 100644
index 0000000..4eb45ed
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-wfs.xml
@@ -0,0 +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>
+  <ResourceType>http://www.opengis.net/wfs</ResourceType>
+  <ResourceFormat>application/xml</ResourceFormat>
+</Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-wms.xml b/tests/suites/harvesting/post/Harvest-wms.xml
new file mode 100644
index 0000000..cab51a1
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-wms.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ows="http://www.opengis.net/ows" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" 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/C [...]
+  <Source>http://wmsserv2.ssec.wisc.edu/cgi-bin/mapserv?map=/home/wms/data/mapfiles/lakestsi.map</Source>
+  <ResourceType>http://www.opengis.net/wms</ResourceType>
+  <ResourceFormat>application/xml</ResourceFormat>
+</Harvest>
diff --git a/tests/suites/harvesting/post/Harvest-wps.xml b/tests/suites/harvesting/post/Harvest-wps.xml
new file mode 100644
index 0000000..0a38c61
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-wps.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Harvest xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:ows="http://www.opengis.net/ows" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:gml="http://www.opengis.net/gml" 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/C [...]
+  <Source>http://cida.usgs.gov/gdp/utility/WebProcessingService</Source>
+  <ResourceType>http://www.opengis.net/wps/1.0.0</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
new file mode 100644
index 0000000..10591ec
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-ows-dc.xml
@@ -0,0 +1,36 @@
+<?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.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-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:Or>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
+            <ogc:Literal>OGC:SOS</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
+            <ogc:Literal>WPS</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
+            <ogc:Literal>OGC:WMS</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
+            <ogc:Literal>WFS</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
+            <ogc:Literal>CSW</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>apiso:ServiceType</ogc:PropertyName>
+            <ogc:Literal>OGC:WCS</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+        </ogc:Or>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml
new file mode 100644
index 0000000..2942180
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml
@@ -0,0 +1,24 @@
+<?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.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-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:SOS</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+          <ogc:PropertyIsLike matchCase="false" wildCard="(" singleChar="." escapeChar="\">
+            <ogc:PropertyName>apiso:Abstract</ogc:PropertyName>
+            <ogc:Literal>(groundwater(</ogc:Literal>
+          </ogc:PropertyIsLike>
+        </ogc:And>      
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-dc.xml b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-dc.xml
new file mode 100644
index 0000000..caf43cc
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-dc.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.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-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:SOS</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-sos-iso.xml b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-iso.xml
new file mode 100644
index 0000000..edc45b3
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-sos-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:SOS</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-dc.xml b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-dc.xml
new file mode 100644
index 0000000..c67d381
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-dc.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.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-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>
diff --git a/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-layer.xml b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-layer.xml
new file mode 100644
index 0000000..a1a67fb
--- /dev/null
+++ b/tests/suites/harvesting/post/Harvest-zzz-post-GetRecords-filter-wms-layer.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.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-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>dc:type</ogc:PropertyName>
+            <ogc:Literal>dataset</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+          <ogc:PropertyIsEqualTo>
+            <ogc:PropertyName>csw:AnyText</ogc:PropertyName>
+            <ogc:Literal>%Lake Clarity%</ogc:Literal>
+          </ogc:PropertyIsEqualTo>
+        </ogc:And>      
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/harvesting/post/Transaction-000-delete-all.xml b/tests/suites/harvesting/post/Transaction-000-delete-all.xml
new file mode 100644
index 0000000..827ccc7
--- /dev/null
+++ b/tests/suites/harvesting/post/Transaction-000-delete-all.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Delete>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike wildCard="%" singleChar="." escapeChar="\">
+          <ogc:PropertyName>dc:identifier</ogc:PropertyName>
+          <ogc:Literal>%</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Delete>
+</csw:Transaction>
diff --git a/tests/suites/manager/data/.gitkeep b/tests/suites/manager/data/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/suites/manager/default.cfg b/tests/suites/manager/default.cfg
new file mode 100644
index 0000000..3e9c1f8
--- /dev/null
+++ b/tests/suites/manager/default.cfg
@@ -0,0 +1,91 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2012 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/manager/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+profiles=apiso
+
+[manager]
+transactions=true
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/manager/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/manager/post/Clear-000-delete-all.xml b/tests/suites/manager/post/Clear-000-delete-all.xml
new file mode 100644
index 0000000..827ccc7
--- /dev/null
+++ b/tests/suites/manager/post/Clear-000-delete-all.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Delete>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike wildCard="%" singleChar="." escapeChar="\">
+          <ogc:PropertyName>dc:identifier</ogc:PropertyName>
+          <ogc:Literal>%</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Delete>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/GetCapabilities.xml b/tests/suites/manager/post/GetCapabilities.xml
new file mode 100644
index 0000000..e4dc807
--- /dev/null
+++ b/tests/suites/manager/post/GetCapabilities.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>
diff --git a/tests/suites/manager/post/GetDomain-parameter.xml b/tests/suites/manager/post/GetDomain-parameter.xml
new file mode 100644
index 0000000..3779a05
--- /dev/null
+++ b/tests/suites/manager/post/GetDomain-parameter.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetDomain service="CSW" version="2.0.2" xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:csw="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-discovery.xsd">
+	<ParameterName>Harvest.ResourceType</ParameterName>
+</GetDomain>
diff --git a/tests/suites/manager/post/Transaction-000-delete-all.xml b/tests/suites/manager/post/Transaction-000-delete-all.xml
new file mode 100644
index 0000000..827ccc7
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-000-delete-all.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Delete>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike wildCard="%" singleChar="." escapeChar="\">
+          <ogc:PropertyName>dc:identifier</ogc:PropertyName>
+          <ogc:Literal>%</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Delete>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-dc-01-insert.xml b/tests/suites/manager/post/Transaction-dc-01-insert.xml
new file mode 100644
index 0000000..1fca1e2
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-dc-01-insert.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+<csw:Insert>
+  <csw:Record xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" 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/record.xsd">
+    <dc:identifier>xyz</dc:identifier>
+    <dc:title>pycsw Catalogue</dc:title>
+    <dct:modified>2012-06-05</dct:modified>
+    <dct:abstract>Sample metadata</dct:abstract>
+    <dc:type>dataset</dc:type>
+    <dc:subject>imagery</dc:subject>
+    <dc:subject>baseMaps</dc:subject>
+    <dc:subject>earthCover</dc:subject>
+    <dc:format>BIL</dc:format>
+    <dc:creator>Vanda Lima</dc:creator>
+    <dc:language>en</dc:language>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>-90 -180</ows:LowerCorner>
+      <ows:UpperCorner>90 180</ows:UpperCorner>
+    </ows:BoundingBox>
+  </csw:Record>
+</csw:Insert>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-dc-02-update-full.xml b/tests/suites/manager/post/Transaction-dc-02-update-full.xml
new file mode 100644
index 0000000..3d3bf1a
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-dc-02-update-full.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+<csw:Update>
+  <csw:Record xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dct="http://purl.org/dc/terms/" xmlns:ows="http://www.opengis.net/ows" 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/record.xsd">
+    <dc:identifier>xyz</dc:identifier>
+    <dc:title>THIS HAS BEEN UPDATED</dc:title>
+    <dct:modified>2012-06-05</dct:modified>
+    <dct:abstract>Sample metadata</dct:abstract>
+    <dc:type>dataset</dc:type>
+    <dc:subject>imagery</dc:subject>
+    <dc:subject>baseMaps</dc:subject>
+    <dc:subject>earthCover</dc:subject>
+    <dc:format>BIL</dc:format>
+    <dc:creator>Vanda Lima</dc:creator>
+    <dc:language>en</dc:language>
+    <ows:BoundingBox crs="urn:x-ogc:def:crs:EPSG:6.11:4326">
+      <ows:LowerCorner>-90 -180</ows:LowerCorner>
+      <ows:UpperCorner>90 180</ows:UpperCorner>
+    </ows:BoundingBox>
+  </csw:Record>
+</csw:Update>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-fgdc-01-insert.xml b/tests/suites/manager/post/Transaction-fgdc-01-insert.xml
new file mode 100644
index 0000000..3a7c368
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-fgdc-01-insert.xml
@@ -0,0 +1,214 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+<csw:Insert>
+<metadata>
+<idinfo>
+<datasetid>foorecord</datasetid>
+<citation>
+<citeinfo>
+<origin>NOAA/ESRL Physical Sciences Division</origin>
+<pubdate>20001201</pubdate>
+<title>NCEP</title>
+<pubinfo>
+<pubplace>Boulder, CO</pubplace>
+<publish>NOAA/ESRL Physical Sciences Division</publish>
+</pubinfo>
+<onlink>ftp://ftp.cdc.noaa.gov/Datasets/ncep/</onlink>
+<onlink>http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep/</onlink>
+<onlink>http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.html</onlink>
+</citeinfo>
+</citation>
+<descript>
+<abstract>NCEP's twice-daily global analysis at 2.5&#176; resolution on pressure levels which is a product of their operational forecast system.</abstract>
+<purpose>Scientific research.</purpose>
+<supplinf>
+Additional Fields:
+-----------------:
+StartDate: 19790101
+StopDate: 20001201
+Storage_Medium: online
+PSD Search Fields:
+Entry_ID: ncep.fgdc
+</supplinf>
+</descript>
+<timeperd>
+<timeinfo>
+<rngdates>
+<begdate>19790101</begdate>
+<enddate>20001201</enddate>
+</rngdates>
+</timeinfo>
+<current>Publication_Date: 20001201</current>
+</timeperd>
+<status>
+<progress>Complete</progress>
+<update>Irregular</update>
+</status>
+<spdom>
+<bounding>
+<westbc>-180</westbc>
+<eastbc>180</eastbc>
+<northbc>90.00</northbc>
+<southbc>-90.00</southbc>
+</bounding>
+</spdom>
+<keywords>
+<theme>
+<themekt>GCMD DIF 5.33</themekt>
+<themekey>NCEP</themekey>
+<themekey>Air temperature</themekey>
+<themekey>Geopotential height</themekey>
+<themekey>Precipitable Water Content</themekey>
+<themekey>Precipitable water Content</themekey>
+<themekey>Relative humidity</themekey>
+<themekey>Sea level pressure</themekey>
+<themekey>Station pressure</themekey>
+<themekey>Surface potential temperature</themekey>
+<themekey>Surface Pressure</themekey>
+<themekey>Tropopause Pressure</themekey>
+<themekey>Tropopause temperature</themekey>
+<themekey>u-wind</themekey>
+<themekey>v-wind</themekey>
+</theme>
+<place>
+<placekt>none</placekt>
+<placekey>Global</placekey>
+</place>
+<stratum>
+<stratkt>none</stratkt>
+<stratkey>none</stratkey>
+</stratum>
+<temporal>
+<tempkt>none</tempkt>
+<tempkey>19790101, 20001201</tempkey>
+</temporal>
+</keywords>
+<accconst>None</accconst>
+<useconst>None. Acknowledgement of PSD would appreciated in products derived from these data.</useconst>
+<ptcontac>
+<cntinfo>
+<cntperp>
+<cntper>PSD Data Management</cntper>
+</cntperp>
+<cntaddr>
+<addrtype>mailing address</addrtype>
+<address>NOAA/ESRL Physical Sciences Division</address>
+<address>U.S. Dept. of Commerce</address>
+<address>NOAA, R/PSD</address>
+<address>325 Broadway</address>
+<city>Boulder</city>
+<state>CO</state>
+<postal>80305</postal>
+<country>USA</country>
+</cntaddr>
+<cntvoice>(303) 497-6640</cntvoice>
+<cntfax>(303) 497-6020</cntfax>
+<cntemail>esrl.psd.data at noaa.gov</cntemail>
+</cntinfo>
+</ptcontac>
+<secinfo>
+<secsys>None</secsys>
+<secclass>Unclassified</secclass>
+<sechandl>None</sechandl>
+</secinfo>
+<native>Data resides in netCDF files at PSD</native>
+</idinfo>
+<dataqual>
+<attracc>
+<attraccr>Data QC'd at source. We have checked our stored values.</attraccr>
+</attracc>
+<logic>None</logic>
+<complete>None</complete>
+<posacc>
+<horizpa>
+<horizpar>None</horizpar>
+</horizpa>
+</posacc>
+<lineage>
+<srcinfo>
+<srccite>
+<citeinfo>
+<origin>None</origin>
+<pubdate>20001201</pubdate>
+<title>None</title>
+<geoform>None</geoform>
+<othercit>None</othercit>
+</citeinfo>
+</srccite>
+<typesrc>None</typesrc>
+<srctime>
+<timeinfo>
+<rngdates>
+<begdate>9999</begdate>
+<enddate>9999</enddate>
+</rngdates>
+</timeinfo>
+<srccurr>None</srccurr>
+</srctime>
+<srccitea>None</srccitea>
+<srccontr>None</srccontr>
+</srcinfo>
+<procstep>
+<procdesc>None</procdesc>
+<procdate>9999</procdate>
+</procstep>
+</lineage>
+</dataqual>
+<distinfo>
+<distrib>
+<cntinfo>
+<cntperp>
+<cntper>PSD Data Management</cntper>
+</cntperp>
+<cntaddr>
+<addrtype>mailing address</addrtype>
+<address>NOAA/ESRL Physical Sciences Division</address>
+<address>U.S. Dept. of Commerce</address>
+<address>NOAA, Code R/PSD</address>
+<address>325 Broadway</address>
+<city>Boulder</city>
+<state>CO</state>
+<postal>80305</postal>
+<country>USA</country>
+</cntaddr>
+<cntvoice>(303) 497-7200</cntvoice>
+<cntfax>(303) 497-6020</cntfax>
+<cntemail>esrl.psd.data at noaa.gov</cntemail>
+</cntinfo>
+</distrib>
+<distliab>No warranty expressed or implied.</distliab>
+</distinfo>
+<metainfo>
+<metd>20001201</metd>
+<metc>
+<cntinfo>
+<cntperp>
+<cntper>PSD Data Management</cntper>
+</cntperp>
+<cntaddr>
+<addrtype>mailing address</addrtype>
+<address>NOAA/ESRL Physical Sciences Division</address>
+<address>U.S. Dept. of Commerce</address>
+<address>NOAA, Code R/PSD</address>
+<address>325 Broadway</address>
+<city>Boulder</city>
+<state>CO</state>
+<postal>80305</postal>
+<country>USA</country>
+</cntaddr>
+<cntvoice>(303) 497-7200</cntvoice>
+<cntfax>(303) 497-6020</cntfax>
+<cntemail>esrl.psd.data at noaa.gov</cntemail>
+</cntinfo>
+</metc>
+<metstdn>FGDC Content Standards for Digital Geospatial Metadata</metstdn>
+<metstdv>FGDC-STD-001-1998</metstdv>
+<metsi>
+<metscs>None</metscs>
+<metsc>Unclassified</metsc>
+<metshd>None</metshd>
+</metsi>
+</metainfo>
+</metadata>
+</csw:Insert>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-fgdc-02-update-recprop.xml b/tests/suites/manager/post/Transaction-fgdc-02-update-recprop.xml
new file mode 100644
index 0000000..252beb6
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-fgdc-02-update-recprop.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" xmlns:fgdc="http://www.opengis.net/cat/csw/csdgm">
+  <csw:Update>
+    <csw:RecordProperty>
+      <csw:Name>idinfo/citation/citeinfo/title</csw:Name>
+      <csw:Value>NEW_TITLE</csw:Value>
+    </csw:RecordProperty>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike wildChar="%" singleChar="." escapeChar="\">
+          <ogc:PropertyName>dct:abstract</ogc:PropertyName>
+          <ogc:Literal>NCEP%</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Update>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-fgdc-03-delete-all.xml b/tests/suites/manager/post/Transaction-fgdc-03-delete-all.xml
new file mode 100644
index 0000000..9e0fba0
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-fgdc-03-delete-all.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Delete>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike wildCard="%" singleChar="." escapeChar="\">
+          <ogc:PropertyName>dc:identifier</ogc:PropertyName>
+          <ogc:Literal>%</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Delete>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-iso-00-delete-all.xml b/tests/suites/manager/post/Transaction-iso-00-delete-all.xml
new file mode 100644
index 0000000..0fb063e
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-iso-00-delete-all.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Delete>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike wildCard="%" singleChar="." escapeChar="\">
+          <ogc:PropertyName>apiso:Identifier</ogc:PropertyName>
+          <ogc:Literal>%</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Delete>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-iso-01-insert.xml b/tests/suites/manager/post/Transaction-iso-01-insert.xml
new file mode 100644
index 0000000..1b238dd
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-iso-01-insert.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+<csw:Insert>
+<gmd:MD_Metadata xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" 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>12345</gco:CharacterString>
+	</gmd:fileIdentifier>
+	<gmd:hierarchyLevel>
+		<gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#MD_ScopeCode" codeListValue="dataset"/>
+	</gmd:hierarchyLevel>
+	<gmd:contact>
+		<gmd:CI_ResponsibleParty>
+			<gmd:organisationName>
+				<gco:CharacterString>pycsw</gco:CharacterString>
+			</gmd:organisationName>
+			<gmd:role>
+				<gmd:CI_RoleCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_RoleCode" codeListValue="publisher"/>
+			</gmd:role>
+		</gmd:CI_ResponsibleParty>
+	</gmd:contact>
+	<gmd:dateStamp>
+		<gco:Date>2011-05-17</gco:Date>
+	</gmd:dateStamp>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title>
+						<gco:CharacterString>pycsw record</gco:CharacterString>
+					</gmd:title>
+					<gmd:date>
+						<gmd:CI_Date>
+							<gmd:date>
+								<gco:Date>2011-05-17</gco:Date>
+							</gmd:date>
+							<gmd:dateType>
+								<gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_DateTypeCode" codeListValue="revision"/>
+							</gmd:dateType>
+						</gmd:CI_Date>
+					</gmd:date>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract>
+				<gco:CharacterString>Sample metadata record</gco:CharacterString>
+			</gmd:abstract>
+			<gmd:language>
+				<gco:CharacterString>eng</gco:CharacterString>
+			</gmd:language>
+			<gmd:extent>
+				<gmd:EX_Extent>
+					<gmd:geographicElement>
+						<gmd:EX_GeographicBoundingBox>
+							<gmd:westBoundLongitude>
+								<gco:Decimal>-180</gco:Decimal>
+							</gmd:westBoundLongitude>
+							<gmd:eastBoundLongitude>
+								<gco:Decimal>180</gco:Decimal>
+							</gmd:eastBoundLongitude>
+							<gmd:southBoundLatitude>
+								<gco:Decimal>-90</gco:Decimal>
+							</gmd:southBoundLatitude>
+							<gmd:northBoundLatitude>
+								<gco:Decimal>90</gco:Decimal>
+							</gmd:northBoundLatitude>
+						</gmd:EX_GeographicBoundingBox>
+					</gmd:geographicElement>
+				</gmd:EX_Extent>
+			</gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+</gmd:MD_Metadata>
+</csw:Insert>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-iso-02-update-full.xml b/tests/suites/manager/post/Transaction-iso-02-update-full.xml
new file mode 100644
index 0000000..a5a5d00
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-iso-02-update-full.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+<csw:Update>
+<gmd:MD_Metadata xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" 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>12345</gco:CharacterString>
+	</gmd:fileIdentifier>
+	<gmd:hierarchyLevel>
+		<gmd:MD_ScopeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#MD_ScopeCode" codeListValue="dataset"/>
+	</gmd:hierarchyLevel>
+	<gmd:contact>
+		<gmd:CI_ResponsibleParty>
+			<gmd:organisationName>
+				<gco:CharacterString>pycsw</gco:CharacterString>
+			</gmd:organisationName>
+			<gmd:role>
+				<gmd:CI_RoleCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_RoleCode" codeListValue="publisher"/>
+			</gmd:role>
+		</gmd:CI_ResponsibleParty>
+	</gmd:contact>
+	<gmd:dateStamp>
+		<gco:Date>2011-05-17</gco:Date>
+	</gmd:dateStamp>
+	<gmd:identificationInfo>
+		<gmd:MD_DataIdentification>
+			<gmd:citation>
+				<gmd:CI_Citation>
+					<gmd:title>
+						<gco:CharacterString>pycsw record UPDATED</gco:CharacterString>
+					</gmd:title>
+					<gmd:date>
+						<gmd:CI_Date>
+							<gmd:date>
+								<gco:Date>2011-05-17</gco:Date>
+							</gmd:date>
+							<gmd:dateType>
+								<gmd:CI_DateTypeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#CI_DateTypeCode" codeListValue="revision"/>
+							</gmd:dateType>
+						</gmd:CI_Date>
+					</gmd:date>
+				</gmd:CI_Citation>
+			</gmd:citation>
+			<gmd:abstract>
+				<gco:CharacterString>Sample metadata record</gco:CharacterString>
+			</gmd:abstract>
+			<gmd:language>
+				<gco:CharacterString>eng</gco:CharacterString>
+			</gmd:language>
+			<gmd:extent>
+				<gmd:EX_Extent>
+					<gmd:geographicElement>
+						<gmd:EX_GeographicBoundingBox>
+							<gmd:westBoundLongitude>
+								<gco:Decimal>-180</gco:Decimal>
+							</gmd:westBoundLongitude>
+							<gmd:eastBoundLongitude>
+								<gco:Decimal>180</gco:Decimal>
+							</gmd:eastBoundLongitude>
+							<gmd:southBoundLatitude>
+								<gco:Decimal>-90</gco:Decimal>
+							</gmd:southBoundLatitude>
+							<gmd:northBoundLatitude>
+								<gco:Decimal>90</gco:Decimal>
+							</gmd:northBoundLatitude>
+						</gmd:EX_GeographicBoundingBox>
+					</gmd:geographicElement>
+				</gmd:EX_Extent>
+			</gmd:extent>
+		</gmd:MD_DataIdentification>
+	</gmd:identificationInfo>
+</gmd:MD_Metadata>
+</csw:Update>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-iso-03-update-recprop.xml b/tests/suites/manager/post/Transaction-iso-03-update-recprop.xml
new file mode 100644
index 0000000..a130a5f
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-iso-03-update-recprop.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Update>
+    <csw:RecordProperty>
+      <csw:Name>apiso:Title</csw:Name>
+      <csw:Value>NEW_TITLE</csw:Value>
+    </csw:RecordProperty>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>apiso:Identifier</ogc:PropertyName>
+          <ogc:Literal>12345</ogc:Literal>
+        </ogc:PropertyIsEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Update>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-iso-04-update-recprop-no-matches.xml b/tests/suites/manager/post/Transaction-iso-04-update-recprop-no-matches.xml
new file mode 100644
index 0000000..e1ff7ac
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-iso-04-update-recprop-no-matches.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Update>
+    <csw:RecordProperty>
+      <csw:Name>apiso:Title</csw:Name>
+      <csw:Value>NEW_TITLE</csw:Value>
+    </csw:RecordProperty>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>apiso:Identifier</ogc:PropertyName>
+          <ogc:Literal>non-existent</ogc:Literal>
+        </ogc:PropertyIsEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Update>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-iso-05-delete.xml b/tests/suites/manager/post/Transaction-iso-05-delete.xml
new file mode 100644
index 0000000..675a869
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-iso-05-delete.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Delete>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsEqualTo>
+          <ogc:PropertyName>apiso:Identifier</ogc:PropertyName>
+          <ogc:Literal>12345</ogc:Literal>
+        </ogc:PropertyIsEqualTo>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Delete>
+</csw:Transaction>
diff --git a/tests/suites/manager/post/Transaction-xxx-delete-all.xml b/tests/suites/manager/post/Transaction-xxx-delete-all.xml
new file mode 100644
index 0000000..827ccc7
--- /dev/null
+++ b/tests/suites/manager/post/Transaction-xxx-delete-all.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<csw:Transaction xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ogc="http://www.opengis.net/ogc" xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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">
+  <csw:Delete>
+    <csw:Constraint version="1.1.0">
+      <ogc:Filter>
+        <ogc:PropertyIsLike wildCard="%" singleChar="." escapeChar="\">
+          <ogc:PropertyName>dc:identifier</ogc:PropertyName>
+          <ogc:Literal>%</ogc:Literal>
+        </ogc:PropertyIsLike>
+      </ogc:Filter>
+    </csw:Constraint>
+  </csw:Delete>
+</csw:Transaction>
diff --git a/tests/suites/repofilter/default.cfg b/tests/suites/repofilter/default.cfg
new file mode 100644
index 0000000..63339cc
--- /dev/null
+++ b/tests/suites/repofilter/default.cfg
@@ -0,0 +1,91 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/repofilter/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+filter=type = 'http://purl.org/dc/dcmitype/Dataset'
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/repofilter/post/GetRecordById-masked.xml b/tests/suites/repofilter/post/GetRecordById-masked.xml
new file mode 100644
index 0000000..1a61c85
--- /dev/null
+++ b/tests/suites/repofilter/post/GetRecordById-masked.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetRecordById service="CSW" version="2.0.2" outputFormat="application/xml" outputSchema="http://www.opengis.net/cat/csw/2.0.2" 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-discovery.xsd">
+        <Id>urn:uuid:784e2afd-a9fd-44a6-9a92-a3848371c8ec</Id>
+        <ElementSetName>summary</ElementSetName>
+</GetRecordById>
diff --git a/tests/suites/repofilter/post/GetRecords-all.xml b/tests/suites/repofilter/post/GetRecords-all.xml
new file mode 100644
index 0000000..ecae692
--- /dev/null
+++ b/tests/suites/repofilter/post/GetRecords-all.xml
@@ -0,0 +1,6 @@
+<?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.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-discovery.xsd">
+        <csw:Query typeNames="csw:Record">
+                <csw:ElementSetName>full</csw:ElementSetName>
+        </csw:Query>
+</csw:GetRecords>
diff --git a/tests/suites/sru/default.cfg b/tests/suites/sru/default.cfg
new file mode 100644
index 0000000..0140efa
--- /dev/null
+++ b/tests/suites/sru/default.cfg
@@ -0,0 +1,90 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/sru/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://geo.data.gov/geoportal/csw/discovery
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=pycsw Geospatial Catalogue
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
+
diff --git a/tests/suites/sru/get/requests.txt b/tests/suites/sru/get/requests.txt
new file mode 100644
index 0000000..24170ae
--- /dev/null
+++ b/tests/suites/sru/get/requests.txt
@@ -0,0 +1,5 @@
+explain,PYCSW_SERVER?config=tests/suites/sru/default.cfg&mode=sru
+search,PYCSW_SERVER?config=tests/suites/sru/default.cfg&mode=sru&version=1.1&operation=searchRetrieve&query=lor
+search_maxrecords,PYCSW_SERVER?config=tests/suites/sru/default.cfg&mode=sru&operation=searchRetrieve&query=lor&maximumRecords=2
+search_startrecord_maxrecords,PYCSW_SERVER?config=tests/suites/sru/default.cfg&mode=sru&operation=searchRetrieve&query=lor&maximumRecords=2&startRecord=1
+search_cql,PYCSW_SERVER?config=tests/suites/sru/default.cfg&mode=sru&operation=searchRetrieve&query=dc:title%20like%20'%lor%'&maximumRecords=5
diff --git a/tests/suites/utf-8/default.cfg b/tests/suites/utf-8/default.cfg
new file mode 100644
index 0000000..d68bfbd
--- /dev/null
+++ b/tests/suites/utf-8/default.cfg
@@ -0,0 +1,89 @@
+# =================================================================
+#
+# Authors: Tom Kralidis <tomkralidis at gmail.com>
+#
+# Copyright (c) 2011 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 in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+# =================================================================
+
+[server]
+home=.
+url=http://localhost/pycsw/csw.py?config=tests/suites/utf-8/default.cfg
+mimetype=application/xml; charset=UTF-8
+encoding=UTF-8
+language=en-US
+maxrecords=10
+#loglevel=DEBUG
+#logfile=/tmp/pycsw.log
+#ogc_schemas_base=http://foo
+federatedcatalogues=http://demo.pycsw.org/gisdata/csw
+pretty_print=true
+#gzip_compresslevel=8
+#spatial_ranking=true
+
+[manager]
+transactions=false
+allowed_ips=127.0.0.1
+
+[metadata:main]
+identification_title=ErrŹĆŁÓdd
+identification_abstract=pycsw is an OGC CSW server implementation written in Python
+identification_keywords=catalogue,discovery
+identification_keywords_type=theme
+identification_fees=None
+identification_accessconstraints=None
+provider_name=pycsw
+provider_url=http://pycsw.org/
+contact_name=Kralidis, Tom
+contact_position=Senior Systems Scientist
+contact_address=TBA
+contact_city=Toronto
+contact_stateorprovince=Ontario
+contact_postalcode=M9C 3Z9
+contact_country=Canada
+contact_phone=+01-416-xxx-xxxx
+contact_fax=+01-416-xxx-xxxx
+contact_email=tomkralidis at gmail.com
+contact_url=http://kralidis.ca/
+contact_hours=0800h - 1600h EST
+contact_instructions=During hours of service.  Off on weekends.
+contact_role=pointOfContact
+
+[repository]
+# sqlite
+database=sqlite:///tests/suites/cite/data/records.db
+# postgres
+#database=postgres://username:password@localhost/pycsw
+table=records
+
+[metadata:inspire]
+enabled=false
+languages_supported=eng,gre
+default_language=eng
+date=2011-03-29
+gemet_keywords=Utility and governmental services
+conformity_service=notEvaluated
+contact_name=National Technical University of Athens
+contact_email=tzotsos at gmail.com
+temp_extent=2011-02-01/2011-03-30
diff --git a/tests/suites/utf-8/post/GetCapabilities.xml b/tests/suites/utf-8/post/GetCapabilities.xml
new file mode 100644
index 0000000..e4dc807
--- /dev/null
+++ b/tests/suites/utf-8/post/GetCapabilities.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2" xmlns:ows="http://www.opengis.net/ows" 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" service="CSW">
+   <ows:AcceptVersions>
+      <ows:Version>2.0.2</ows:Version>
+   </ows:AcceptVersions>
+   <ows:AcceptFormats>
+      <ows:OutputFormat>application/xml</ows:OutputFormat>
+   </ows:AcceptFormats>
+</GetCapabilities>

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