[pywps] 01/10: Imported Upstream version 4.0.0~rc3

Bas Couwenberg sebastic at debian.org
Sat Dec 3 13:39:09 UTC 2016


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

sebastic pushed a commit to branch experimental
in repository pywps.

commit bdc87608ec76442c5b0a217d7130b619f22b36fa
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sat Dec 3 10:28:28 2016 +0100

    Imported Upstream version 4.0.0~rc3
---
 .gitignore                                      |   1 +
 .nojekyll                                       |   0
 .travis.yml                                     |   7 +
 CONTRIBUTORS.md                                 |  35 +-
 README.md                                       |   5 +-
 RELEASE-howto.md                                | 114 +++++++
 VERSION.txt                                     |   2 +-
 debian/control                                  |   2 +-
 default-sample.cfg                              |  76 ++---
 docs/{ => _static}/pywps.png                    | Bin
 docs/_static/pywps.svg                          | 404 ++++++++++++++++++++++++
 docs/conf.py                                    |  56 ++--
 docs/configuration.rst                          |  28 +-
 docs/demobuffer.py                              |  30 +-
 docs/deployment.rst                             |   6 +-
 docs/development.rst                            |   3 +-
 docs/exceptions.rst                             |   3 +-
 docs/{external_tools.rst => external-tools.rst} |   6 +-
 docs/index.rst                                  |  27 +-
 docs/install.rst                                |  57 +++-
 docs/migration.rst                              |   7 +-
 docs/process.rst                                |   9 +-
 docs/pywps.rst                                  |   9 +-
 docs/wps.rst                                    |  34 +-
 pywps/__init__.py                               |  35 +-
 pywps/_compat.py                                |  37 +--
 pywps/app/Common.py                             |  31 ++
 pywps/app/Process.py                            | 116 +++----
 pywps/app/Service.py                            | 112 +++----
 pywps/app/WPSRequest.py                         |  48 +--
 pywps/app/WPSResponse.py                        |  49 +--
 pywps/app/__init__.py                           |  19 +-
 pywps/app/basic.py                              |  12 +-
 pywps/configuration.py                          |  60 ++--
 pywps/dblog.py                                  | 308 +++++++-----------
 pywps/dependencies.py                           |  30 +-
 pywps/exceptions.py                             |  61 ++--
 pywps/inout/__init__.py                         |   7 +
 pywps/inout/basic.py                            |  55 ++--
 pywps/inout/formats/__init__.py                 |  41 ++-
 pywps/inout/inputs.py                           |  33 +-
 pywps/inout/literaltypes.py                     |  95 +++++-
 pywps/inout/outputs.py                          |  58 +++-
 pywps/inout/storage.py                          |  21 +-
 pywps/resources/__init__.py                     |   5 +
 pywps/resources/schemas/__init__.py             |   5 +
 tests/common.py => pywps/tests.py               |  12 +-
 pywps/validator/__init__.py                     |  12 +-
 pywps/validator/allowed_value.py                |   7 +
 pywps/validator/base.py                         |  10 +-
 pywps/validator/complexvalidator.py             |  41 +--
 pywps/validator/literalvalidator.py             |  34 +-
 pywps/validator/mode.py                         |   7 +
 pywps/wpsserver.py                              |  30 +-
 requirements.txt                                |   2 +
 setup.cfg                                       |   4 +
 setup.py                                        |  28 +-
 tests/__init__.py                               |   6 +
 tests/process.py                                |   9 +-
 tests/processes/__init__.py                     |   7 +
 tests/requests/__init__.py                      |   5 +
 tests/test_assync.py                            |  10 +-
 tests/test_capabilities.py                      |  18 +-
 tests/test_dblog.py                             |  39 +--
 tests/test_describe.py                          |  21 +-
 tests/test_exceptions.py                        |   8 +-
 tests/test_execute.py                           |   8 +-
 tests/test_formats.py                           |   6 +
 tests/test_inout.py                             |   6 +
 tests/test_literaltypes.py                      |  37 +++
 tests/test_ows.py                               |  14 +-
 tests/test_wpsrequest.py                        |   6 +
 tests/validator/__init__.py                     |   7 +
 tests/validator/test_complexvalidators.py       |   7 +
 tests/validator/test_literalvalidators.py       |   7 +
 tox.ini                                         |   3 +-
 76 files changed, 1648 insertions(+), 922 deletions(-)

diff --git a/.gitignore b/.gitignore
index 8c9939c..f2cf272 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ dist
 build
 tmp
 .tox
+docs/_build
 
 # vim, mac os
 *.sw*
diff --git a/.nojekyll b/.nojekyll
deleted file mode 100644
index e69de29..0000000
diff --git a/.travis.yml b/.travis.yml
index dab6e7b..3c64f3c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -30,11 +30,13 @@ install:
   - pip install pip --upgrade
   - pip install .
   - pip install -r requirements-gdal.txt
+  - pip install -r requirements-dev.txt
   - pip install coveralls
 
 script:
   - python -m unittest tests
   - coverage run --source=pywps -m unittest tests
+  - flake8 pywps/
 
 after_success:
   - coveralls
@@ -44,3 +46,8 @@ after_success:
 branches:
   only:
     - master
+
+notifications:
+  irc:
+    channels:
+      - "irc.freenode.org#geopython"
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 0729d50..f7444a6 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -1,9 +1,32 @@
 # Contributors to PyWPS
 
-* Jachym Cepicky [jachym] jachym.cepicky gmail com
-* Alex Morega [mgax] alex grep ro
-* Calin Ciociu [noctalin] calin.ciociu gmail com
-* Luís de Sousa [ldesousa] luis.a.de.sousa gmail com
-* Tom Kralidis [tomkralidis] tomkralidis gmail com
+* @jachym Jachym Cepicky
+* @jorgejesus Jorge Samuel Mendes de Jesus
+* @ldesousa Luís de Sousa
+* @tomkralidis Tom Kralidis
+* @mgax Alex Morega
+* @Noctalin Calin Ciociu
+* @SiggyF Fedor Baart
+* @jonas-eberle Jonas Eberle
+* @cehbrecht Carsten Ehbrecht
 
-Full list at <http://pywps.org/contributors>
+# Contributor to older versions of PyWPS (< 4.x)
+
+* @ricardogsilva Ricardo Garcia Silva
+* @gschwind Benoit Gschwind
+* @khosrow Khosrow Ebrahimpour
+* @TobiasKipp Tobias Kipp
+* @kalxas Angelos Tzotsos
+* @Kruecke Florian Klemme
+* @slarosa Salvatore Larosa
+* @ominiverdi (Lorenzo Becchi)
+* @lucacasagrande (doktoreas - Luca Casagrande)
+* @sigmapi (pana - Panagiotis Skintzos)
+* @fpl Francesco P. Lovergine
+* @giohappy Giovanni Allegri
+* sebastianh Sebastian Holler
+
+# NOTE
+
+This file is keeped manually. Feel free to contact us, if your contribution is
+missing here.
diff --git a/README.md b/README.md
index ee5b244..a41aa72 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,5 @@
 # PyWPS 
 
-[![Join the chat at https://gitter.im/geopython/pywps](https://badges.gitter.im/geopython/pywps.svg)](https://gitter.im/geopython/pywps?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
 PyWPS is an implementation of the Web Processing Service standard from
 the Open Geospatial Consortium. PyWPS is written in Python.
 
@@ -10,7 +8,8 @@ the Open Geospatial Consortium. PyWPS is written in Python.
 [![Coverage Status](https://coveralls.io/repos/github/geopython/pywps/badge.svg?branch=master)](https://coveralls.io/github/geopython/pywps?branch=master)
 [![PyPI](https://img.shields.io/pypi/dm/pywps.svg)]()
 [![GitHub license](https://img.shields.io/github/license/geopython/pywps.svg)]()
-[![Gitter Chat](http://img.shields.io/badge/chat-online-brightgreen.svg)](https://gitter.im/PyWPS)
+
+[![Join the chat at https://gitter.im/geopython/pywps](https://badges.gitter.im/geopython/pywps.svg)](https://gitter.im/geopython/pywps?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 
 # License
 
diff --git a/RELEASE-howto.md b/RELEASE-howto.md
new file mode 100644
index 0000000..bdebeaf
--- /dev/null
+++ b/RELEASE-howto.md
@@ -0,0 +1,114 @@
+# Howto release PyWPS
+
+This document gives you, as PyWPS release master complete tutorial of how to get
+PyWPS release rolled up and deployed to target server, create packages etc.
+
+## PyWPS versioning
+
+PyWPS uses [Debian version naming system](https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version). Every policy should be checked against it.
+
+PyWPS uses 3 numbers release description: MAJOR.MINOR.MAINTENANCE. Within MAJOR
+releases, we should aim, not to break backwards compatibility.
+
+Event MINOR version numbers (0, 2, 4, 6, ...) are considered as stable, where as
+odd numbers (1, 3, 5, 7, ...) are current development branches. MINOR releases
+should add new features.
+
+MAINTENANCE number should be used for bugfix releases only. No new features are
+added.
+
+For release candindates `MAJOR.MINOR.MAINTENANCE-rcX` format should be used.
+
+## Go to `master` branch
+
+```
+git checkout master
+```
+## Fix files, create tags, commit, push
+
+* Fix the [VERSION.txt](https://github.com/geopython/pywps/blob/master/VERSION.txt) file.
+* Fix the [pywps/__init__.py](https://github.com/geopython/pywps/blob/master/pywps/__init__.py) file `__version__` attribute
+* Fix the [debian/changelog](https://github.com/geopython/pywps/blob/master/debian/changelog) file
+
+```
+git commit -m"Creating new release of PYWPS X.Y.Z[-rcX] fixes" -a
+```
+
+* Create tag in PyWPS main source tree
+
+```
+git tag X.Y.Z[-rcX]
+git push
+git push --tags
+```
+
+* Update version in `VERSION.txt` and `pywps/__init__.py` to dev branch, e.g.
+`4.1-dev` and push to master:
+
+```
+git checkout master
+$EDITOR VERSION.txt pywps/__init__.py # add 4.1-dev version
+git commit -m"Updating version to 4.1-dev"
+git push
+```
+
+### Send PyWPS to http://pypi.python.org repository (only for stable releases)
+
+```
+cd /tmp
+git clone git at github.com:geopython/pywps.git pywps-4
+cd pywps-4
+git checkout X.Y.Z
+python setup.py bdist_egg upload
+```
+
+## Fix pywps-demo project (only for stable releases)
+
+```
+git checkout master
+```
+* Fix the [VERSION.txt](https://github.com/geopython/pywps-demo/blob/master/VERSION.txt) file.
+
+```
+$EDITOR VERSION.txt
+git commit -m"Creating new release of PYWPS X.Y.Z fixes #TICKET_NUMBER" -a
+git push
+```
+
+* Add tag, once pull request is accepted
+
+```
+git tag X.Y.Z
+git push --tags
+```
+
+## Fix web pages && write to mailing list
+
+```
+PyWPS [X.Y.Z]
+#############
+
+The PyWPS Development team announces the release of PyWPS X.Y.Z.
+
+Features of this version:
+ - [SHOULD COPY THIS FROM Changelog]
+
+To download this version, please follow the link below [2].
+
+NOTE: [IF ANY]
+
+What is PyWPS:
+--------------
+
+PyWPS (Python Web Processing Service) is implementation of Web
+Processing Service standard from Open Geospatial Consortium (OGC(R)). 
+Processes can be written using GRASS GIS, but usage of other programs, like
+R package, GDAL or PROJ tools, is possible as well.
+
+Happy GISing!
+
+PyWPS Development team
+
+[1] http://pywps.org
+[2] http://pywps.org/download
+```
diff --git a/VERSION.txt b/VERSION.txt
index 8faff82..55be1c7 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-4.0.0rc2
+4.0.0rc3
diff --git a/debian/control b/debian/control
index 6f75c34..7483a53 100644
--- a/debian/control
+++ b/debian/control
@@ -9,7 +9,7 @@ Vcs-Git: https://github.com/geopython/pywps.git
 
 Package: python-pywps
 Architecture: all
-Depends: ${misc:Depends}, ${python:Depends}, python-pkg-resources, python-flufl.enum, python-jsonschema, python-lxml, python-owslib, python-werkzeug
+Depends: ${misc:Depends}, ${python:Depends}, python-pkg-resources, python-dateutil, python-flufl.enum, python-jsonschema, python-lxml, python-owslib, python-werkzeug
 Suggests: grass, apache2, apache
 Homepage: http://pywps.org
 Description: OGC Web Processing Service (WPS) Implementation
diff --git a/default-sample.cfg b/default-sample.cfg
index f7cec8c..e5730d0 100644
--- a/default-sample.cfg
+++ b/default-sample.cfg
@@ -1,40 +1,42 @@
-[server]
-encoding=utf-8
-language=en-US
-url=http://localhost/wps
-maxoperations=30
-maxinputparamlength=1024
-maxsingleinputsize=
-maxrequestsize=3mb
-temp_path=/tmp/pywps/
-processes_path=
-outputurl=/data/
-outputpath=/tmp/outputs/
-logfile=
-loglevel=INFO
-logdatabase=
-workdir=
-
 [metadata:main]
-identification_title=PyWPS Processing Service
-identification_abstract=PyWPS is an implementation of the Web Processing Service standard from the Open Geospatial Consortium. PyWPS is written in Python.
-identification_keywords=PyWPS,WPS,OGC,processing
+identification_title=PyWPS Demo server
+identification_abstract=PyWPS testing and development server. Do NOT use this server in production environement. You shall setup PyWPS as WSGI application for production. Please refer documentation for further detials.
+identification_keywords=WPS,GRASS,PyWPS, Demo, Dev
 identification_keywords_type=theme
-identification_fees=NONE
-identification_accessconstraints=NONE
-provider_name=Organization Name
-provider_url=http://pywps.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.
+identification_fees=None
+identification_accessconstraints=None
+provider_name=PyWPS Developement team
+provider_url=http://pywps.org/'
+contact_name=Your Name
+contact_position=Developer
+contact_address=My Street
+contact_city=My City
+contact_stateorprovince=None
+contact_postalcode=000 00
+contact_country=World, Internet
+contact_phone=+00 00 11 22 33
+contact_fax=+00 99 88 77 66
+contact_email=info at yourdomain.org
+contact_url=http://pywps.org
+contact_hours=8:00-20:00UTC
+contact_instructions=Knock on the door
 contact_role=pointOfContact
+
+[server]
+maxsingleinputsize=1mb
+maxrequestsize=3mb
+url=http://localhost:5000/wps
+outputurl=http://localhost:5000/outputs/
+outputpath=outputs
+workdir=workdir
+maxprocesses=10
+parallelprocesses=2
+
+[logging]
+level=INFO
+file=logs/pywps.log
+database=sqlite:///logs/pywps-logs.sqlite3
+
+
+[grass]
+gisbase=/usr/local/grass-7.3.svn/
diff --git a/docs/pywps.png b/docs/_static/pywps.png
similarity index 100%
rename from docs/pywps.png
rename to docs/_static/pywps.png
diff --git a/docs/_static/pywps.svg b/docs/_static/pywps.svg
new file mode 100644
index 0000000..3aa19b2
--- /dev/null
+++ b/docs/_static/pywps.svg
@@ -0,0 +1,404 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Vrstva_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="595.28px" height="841.89px" viewBox="0 0 595.28 841.89" enable-background="new 0 0 595.28 841.89" xml:space="preserve">
+<rect x="62.313" y="228.011" width="460.477" height="184.491"/>
+<rect x="64.188" y="424.86" width="282.496" height="163.333"/>
+<path fill="#146C9C" d="M224.762,182.688c0.143,0,0.283,0.04,0.426,0.12c2.412,1.06,1.325,0.571,3.216,0.815
+	c2.932-0.325,3.499-1.505,5.721-4.88l-4.586-16.35c-0.095-0.325-0.236-0.65-0.236-1.018c0-0.486,0.33-1.26,1.891-1.26h1.513
+	c2.648,0,2.601,1.059,3.546,4.637c0.946,3.538,1.371,5.735,1.465,7.198l-0.047,1.222c0.804-2.563,6.856-11.714,7.235-12.08
+	c0.898-0.936,1.892-0.977,2.507-0.977h1.371c1.514,0,1.419,0.65,1.514,0.774c0.047,0.365-0.189,0.691-0.331,0.976l-12.059,18.544
+	c-1.087,1.749-2.033,3.091-4.019,4.515c-3.074,2.153-5.722,2.153-6.526,2.153c-3.783,0-3.594-0.771-3.594-0.811v-0.449
+	C224.054,183.826,224.1,182.688,224.762,182.688z"/>
+<path d="M254.454,128.094h2.491c2.776,0,3.204,1.495,3.345,3.202l1.14,20.427c0.783,15.161,0.57,13.452,0.641,16.87
+	c0.854-2.634,17.224-36.514,17.224-36.514c0.854-1.851,1.709-3.985,5.196-3.985h5.054c3.63,0,3.416,2.278,3.558,3.985l1.496,28.114
+	c0.285,5.054,0.356,7.544,0.427,8.4c1.067-2.562,2.989-6.334,5.907-12.598l11.815-24.557c1.352-2.774,2.704-3.345,4.982-3.345h1.778
+	c1.992,0,2.278,0.997,2.278,1.638c0,0.711-0.498,1.495-0.783,2.133l-20.355,42.209c-1.353,2.847-2.777,3.416-4.84,3.416h-5.553
+	c-3.417,0-3.344-2.136-3.417-3.7l-1.495-27.047c-0.213-3.559-0.497-9.752-0.497-9.752l-17.368,36.373
+	c-1.779,3.628-2.775,4.126-5.693,4.126h-4.484c-2.918,0-3.487-1.14-3.63-3.345l-2.349-42.279c-0.071-0.284-0.071-0.639-0.071-0.995
+	C251.251,128.665,252.817,128.094,254.454,128.094z"/>
+<path d="M315.27,172.722l8.754-41.354c0.499-2.135,0.925-3.274,3.345-3.274h16.512c6.621,0,12.314,0.57,15.374,4.839
+	c1.354,1.851,1.853,4.129,1.853,6.407c0,5.196-2.136,11.104-6.549,14.664c-5.836,4.768-13.168,4.412-17.438,4.412h-8.613
+	l-3.061,14.662c-0.64,2.704-0.711,4.413-3.486,4.413h-3.916c-2.916,0-3.2-1.921-3.2-2.562
+	C314.844,174.359,315.056,173.79,315.27,172.722z M337.476,152.792c3.7,0,8.399-0.071,11.318-3.7
+	c2.134-2.704,2.704-7.616,2.704-8.968c0-4.982-3.914-5.908-9.255-5.908h-8.752l-3.987,18.576H337.476z"/>
+<path fill="#146C9C" d="M197.287,172.722l8.755-41.354c0.499-2.135,0.925-3.274,3.345-3.274H225.9c6.62,0,12.313,0.57,15.374,4.839
+	c1.353,1.851,1.851,4.129,1.851,6.407c0,5.196-2.135,11.104-6.548,14.664c-5.837,4.768-13.167,4.412-17.438,4.412h-8.613
+	l-3.06,14.662c-0.641,2.704-0.711,4.413-3.487,4.413h-3.915c-2.917,0-3.202-1.921-3.202-2.562
+	C196.861,174.359,197.074,173.79,197.287,172.722z M219.494,152.792c3.701,0,8.399-0.071,11.317-3.7
+	c2.136-2.704,2.705-7.616,2.705-8.968c0-4.982-3.915-5.908-9.253-5.908h-8.754l-3.985,18.576H219.494z"/>
+<path d="M356.45,171.512l2.351-5.91c0.212-0.497,0.639-0.781,0.925-0.781c1.424,0,4.199,6.546,14.804,6.546
+	c9.111,0,10.108-6.831,10.108-8.54c0-2.562-1.781-4.199-3.489-4.912c-1.493-0.639-6.904-1.566-9.323-2.419
+	c-4.199-1.565-8.611-5.339-8.611-11.388c0-3.986,2.063-9.894,6.333-13.382c4.344-3.488,9.751-4.199,14.45-4.199
+	c6.334,0,10.177,1.565,12.882,3.203c0.355,0.212,0.996,0.497,0.996,1.208c0,0.356-0.142,0.641-0.354,1.211l-1.923,4.911
+	c-0.783,2.135-0.926,2.135-1.496,2.135c-1.705,0-2.134-5.338-11.529-5.338c-8.397,0-9.965,5.125-9.965,7.332
+	c0,2.349,1.709,3.772,3.702,4.556c4.625,1.707,11.602,1.21,15.729,7.614c1.353,2.065,1.923,4.485,1.923,6.906
+	c0,4.839-2.99,18.79-20.785,18.79c-9.536,0-17.223-4.341-17.223-5.837C355.954,172.935,356.166,172.366,356.45,171.512z"/>
+<g>
+	<path fill="#F1CB4A" d="M291.976,128.697c0.039,0.028,0.071,0.059,0.107,0.089C292.049,128.753,292.013,128.725,291.976,128.697z"
+		/>
+	<path fill="#F1CB4A" d="M291.849,128.616c0.016,0.01,0.033,0.018,0.048,0.028c-0.027-0.017-0.052-0.04-0.081-0.054
+		C291.826,128.597,291.838,128.608,291.849,128.616z"/>
+	<path fill="#F1CB4A" d="M291.785,128.579c0.009,0.004,0.023,0.007,0.031,0.012c-0.014-0.008-0.039-0.018-0.057-0.026
+		C291.768,128.569,291.777,128.574,291.785,128.579z"/>
+	<path fill="#F1CB4A" d="M414.254,63.682c-1.021,0.545-5.645,6.318-9.896,6.795c0,0-11.426,1.248-14.744,0.732
+		c-3.352-0.521-4.835-0.5-5.945,0.345h-12.233c0,0-2.437,0.097-3.066,0.298c-0.605,0.194-0.803,1.132-0.803,1.132l-1.841,12.183
+		h-67.116l3.935-13.749l4.022-0.365c5.166,0,9.399-0.07,10.505-1.969c1.108-1.905-2.472-2.959-7.638-2.959L294.3,65.638
+		c-10.684-2.791-10.255,1.542-11.362,3.448c-1.105,1.899,2.184,3.445,7.352,3.445l8.376-0.763l-4.549,15.885l-23.646,20.946
+		c-13.093-9.225-38.624-4.931-62.019,11.629c-8.448,5.985-33.623,25.438-39.211,32.565c4.758-5.189,28.343-22.726,34.647-27.189
+		c22.897-16.208,47.84-20.673,61.167-12.208l-23.169,20.625c0.037,0.062,0.136,0.117,0.156,0.185
+		c0.081,0.105,0.051,0.263,0.174,0.374c0.061,0.072,0.037,0.141,0.072,0.229l24.361-20.301c1.854,1.432,4.646,3.982,5.602,6.955
+		c4.177,12.995,0.658,20.22-7.642,31.33c9.928-10.831,16.647-24.698,12.115-35.917c-0.741-1.833-3.139-5.709-4.6-6.981
+		l20.592-17.354l-6.342,35.555h3.169c0.236,0,0.455,0.011,0.66,0.029c-0.078-0.017-0.135-0.029-0.135-0.029l6.942-37.349h67.873
+		l-0.427,2.813l-71.685,36.201l-0.001-0.001c0.274,0.725,0.269,1.577,0.331,2.321l0.006,0.106c0.029,0.385,0.034,0.643,0.034,0.643
+		l70.75-35.507l-1.017,10.728c-7.525,2.748-15.32,6.821-22.887,12.179c-4.829,3.419-7.689,5.438-10.296,7.867h2.083
+		c0.999-0.661,2.169-1.444,3.647-2.491c8.984-6.36,18.284-10.899,27.075-13.573l-2.796,21.586c0.458,0.774,0.787,1.607,1.012,2.473
+		l4.784-24.909c16.649-4.304,31.063-1.646,37.381,8.503c6.888,11.071,5.373,26.138-7.077,42.007
+		c15.823-17.266,19.313-35.047,11.64-47.385c-6.8-10.93-23.003-13.174-41.271-7.38l5.06-32.083h10.416
+		c0.482,0.885,3.358,0.651,6.533,0.878l13.282-0.793c4.092,0.296,12.548-7.369,13.952-9.52
+		C415.414,65.407,416.979,62.232,414.254,63.682z"/>
+</g>
+<path fill="#146C9C" d="M206.43,374.16c0.143,0,0.283,0.04,0.426,0.12c2.412,1.06,1.325,0.571,3.216,0.815
+	c2.932-0.325,3.499-1.505,5.721-4.88l-4.586-16.35c-0.095-0.325-0.236-0.65-0.236-1.018c0-0.486,0.33-1.26,1.891-1.26h1.513
+	c2.648,0,2.601,1.059,3.546,4.637c0.946,3.538,1.371,5.735,1.465,7.198l-0.047,1.222c0.804-2.563,6.856-11.714,7.235-12.08
+	c0.898-0.936,1.892-0.977,2.507-0.977h1.371c1.514,0,1.419,0.65,1.514,0.774c0.047,0.365-0.189,0.691-0.331,0.976l-12.059,18.544
+	c-1.087,1.749-2.033,3.091-4.019,4.515c-3.074,2.153-5.722,2.153-6.526,2.153c-3.783,0-3.594-0.771-3.594-0.811v-0.449
+	C205.722,375.297,205.768,374.16,206.43,374.16z"/>
+<path fill="#FFFFFF" d="M236.122,319.565h2.491c2.776,0,3.204,1.495,3.345,3.202l1.14,20.427c0.783,15.161,0.57,13.452,0.641,16.87
+	c0.854-2.634,17.224-36.514,17.224-36.514c0.854-1.851,1.709-3.985,5.196-3.985h5.054c3.63,0,3.416,2.278,3.558,3.985l1.496,28.114
+	c0.285,5.054,0.356,7.544,0.427,8.4c1.067-2.562,2.989-6.334,5.907-12.598l11.815-24.557c1.352-2.774,2.704-3.345,4.982-3.345h1.778
+	c1.992,0,2.278,0.997,2.278,1.638c0,0.711-0.498,1.495-0.783,2.133l-20.355,42.209c-1.353,2.847-2.777,3.416-4.84,3.416h-5.553
+	c-3.417,0-3.344-2.136-3.417-3.7l-1.495-27.047c-0.213-3.559-0.497-9.752-0.497-9.752l-17.368,36.373
+	c-1.779,3.628-2.775,4.126-5.693,4.126h-4.484c-2.918,0-3.487-1.14-3.63-3.345l-2.349-42.279c-0.071-0.284-0.071-0.639-0.071-0.995
+	C232.919,320.136,234.485,319.565,236.122,319.565z"/>
+<path fill="#FFFFFF" d="M296.938,364.193l8.754-41.354c0.499-2.135,0.925-3.274,3.345-3.274h16.512
+	c6.621,0,12.314,0.57,15.374,4.839c1.354,1.851,1.853,4.129,1.853,6.407c0,5.196-2.136,11.104-6.549,14.664
+	c-5.836,4.768-13.168,4.412-17.438,4.412h-8.613l-3.061,14.662c-0.64,2.704-0.711,4.413-3.486,4.413h-3.916
+	c-2.916,0-3.2-1.921-3.2-2.562C296.512,365.83,296.724,365.261,296.938,364.193z M319.144,344.263c3.7,0,8.399-0.071,11.318-3.7
+	c2.134-2.704,2.704-7.616,2.704-8.968c0-4.982-3.914-5.908-9.255-5.908h-8.752l-3.987,18.576H319.144z"/>
+<path fill="#146C9C" d="M178.955,364.193l8.755-41.354c0.499-2.135,0.925-3.274,3.345-3.274h16.513c6.62,0,12.313,0.57,15.374,4.839
+	c1.353,1.851,1.851,4.129,1.851,6.407c0,5.196-2.135,11.104-6.548,14.664c-5.837,4.768-13.167,4.412-17.438,4.412h-8.613
+	l-3.06,14.662c-0.641,2.704-0.711,4.413-3.487,4.413h-3.915c-2.917,0-3.202-1.921-3.202-2.562
+	C178.529,365.83,178.742,365.261,178.955,364.193z M201.162,344.263c3.701,0,8.399-0.071,11.317-3.7
+	c2.136-2.704,2.705-7.616,2.705-8.968c0-4.982-3.915-5.908-9.253-5.908h-8.754l-3.985,18.576H201.162z"/>
+<path fill="#FFFFFF" d="M338.118,362.983l2.351-5.91c0.212-0.497,0.639-0.781,0.925-0.781c1.424,0,4.199,6.546,14.804,6.546
+	c9.111,0,10.108-6.831,10.108-8.54c0-2.562-1.781-4.199-3.489-4.912c-1.493-0.639-6.904-1.566-9.323-2.419
+	c-4.199-1.565-8.611-5.339-8.611-11.388c0-3.986,2.063-9.894,6.333-13.382c4.344-3.488,9.751-4.199,14.45-4.199
+	c6.334,0,10.177,1.565,12.882,3.203c0.355,0.212,0.996,0.497,0.996,1.208c0,0.356-0.142,0.641-0.354,1.211l-1.923,4.911
+	c-0.783,2.135-0.926,2.135-1.496,2.135c-1.705,0-2.134-5.338-11.529-5.338c-8.397,0-9.965,5.125-9.965,7.332
+	c0,2.349,1.709,3.772,3.702,4.556c4.625,1.707,11.602,1.21,15.729,7.614c1.353,2.065,1.923,4.485,1.923,6.906
+	c0,4.839-2.99,18.79-20.785,18.79c-9.536,0-17.223-4.341-17.223-5.837C337.622,364.406,337.834,363.837,338.118,362.983z"/>
+<g>
+	<path fill="#F1CB4A" d="M273.644,320.168c0.039,0.028,0.071,0.059,0.107,0.089C273.717,320.224,273.681,320.196,273.644,320.168z"
+		/>
+	<path fill="#F1CB4A" d="M273.517,320.087c0.016,0.01,0.033,0.018,0.048,0.028c-0.027-0.017-0.052-0.04-0.081-0.054
+		C273.494,320.068,273.506,320.08,273.517,320.087z"/>
+	<path fill="#F1CB4A" d="M273.453,320.05c0.009,0.004,0.023,0.007,0.031,0.012c-0.014-0.008-0.039-0.018-0.057-0.026
+		C273.436,320.04,273.445,320.045,273.453,320.05z"/>
+	<path fill="#F1CB4A" d="M395.922,255.153c-1.021,0.545-5.645,6.318-9.896,6.795c0,0-11.426,1.248-14.744,0.732
+		c-3.352-0.521-4.835-0.5-5.945,0.345h-12.233c0,0-2.437,0.097-3.066,0.298c-0.605,0.194-0.803,1.132-0.803,1.132l-1.841,12.183
+		h-67.116l3.935-13.749l4.022-0.365c5.166,0,9.399-0.07,10.505-1.969c1.108-1.905-2.472-2.959-7.638-2.959l-15.133-0.489
+		c-10.684-2.791-10.255,1.542-11.362,3.448c-1.105,1.899,2.184,3.445,7.352,3.445l8.376-0.763l-4.549,15.885l-23.646,20.946
+		c-13.093-9.225-38.624-4.931-62.019,11.629c-8.448,5.985-33.623,25.438-39.211,32.565c4.758-5.189,28.343-22.726,34.647-27.189
+		c22.897-16.208,47.84-20.673,61.167-12.208l-23.169,20.625c0.037,0.062,0.136,0.117,0.156,0.185
+		c0.081,0.105,0.051,0.263,0.174,0.374c0.061,0.072,0.037,0.141,0.072,0.229l24.361-20.301c1.854,1.432,4.646,3.982,5.602,6.955
+		c4.177,12.995,0.658,20.22-7.642,31.33c9.928-10.831,16.647-24.698,12.115-35.917c-0.741-1.833-3.139-5.709-4.6-6.981
+		l20.592-17.354l-6.342,35.555h3.169c0.236,0,0.455,0.011,0.66,0.029c-0.078-0.017-0.135-0.029-0.135-0.029l6.942-37.349h67.873
+		l-0.427,2.813l-71.685,36.201l-0.001-0.001c0.274,0.725,0.269,1.577,0.331,2.321l0.006,0.106c0.029,0.385,0.034,0.643,0.034,0.643
+		l70.75-35.507l-1.017,10.728c-7.525,2.748-15.32,6.821-22.887,12.179c-4.829,3.419-7.689,5.438-10.296,7.867h2.083
+		c0.999-0.661,2.169-1.444,3.647-2.491c8.984-6.36,18.284-10.899,27.075-13.573l-2.796,21.586c0.458,0.774,0.787,1.607,1.012,2.473
+		l4.784-24.909c16.649-4.304,31.063-1.646,37.381,8.503c6.888,11.071,5.373,26.138-7.077,42.007
+		c15.823-17.266,19.313-35.047,11.64-47.385c-6.8-10.93-23.003-13.174-41.271-7.38l5.06-32.083h10.416
+		c0.482,0.885,3.358,0.651,6.533,0.878l13.282-0.793c4.092,0.296,12.548-7.369,13.952-9.52
+		C397.082,256.878,398.647,253.703,395.922,255.153z"/>
+</g>
+<path fill="#6F6F6E" d="M156.361,545.085c0.115,0,0.229,0.032,0.345,0.098c1.955,0.858,1.074,0.463,2.607,0.661
+	c2.377-0.263,2.836-1.221,4.638-3.957l-3.718-13.255c-0.077-0.263-0.191-0.526-0.191-0.824c0-0.394,0.267-1.021,1.533-1.021h1.227
+	c2.147,0,2.108,0.858,2.875,3.759c0.767,2.867,1.112,4.649,1.188,5.835l-0.038,0.991c0.652-2.077,5.558-9.497,5.865-9.793
+	c0.728-0.759,1.534-0.792,2.032-0.792h1.111c1.227,0,1.151,0.527,1.227,0.628c0.039,0.295-0.153,0.56-0.268,0.791l-9.776,15.034
+	c-0.881,1.417-1.648,2.505-3.258,3.659c-2.492,1.746-4.639,1.746-5.291,1.746c-3.067,0-2.914-0.625-2.914-0.657v-0.364
+	C155.787,546.008,155.824,545.085,156.361,545.085z"/>
+<path fill="#FFFFFF" d="M180.432,500.826h2.019c2.251,0,2.597,1.212,2.711,2.596l0.924,16.561
+	c0.635,12.291,0.462,10.905,0.52,13.676c0.693-2.136,13.963-29.602,13.963-29.602c0.693-1.5,1.386-3.23,4.213-3.23h4.097
+	c2.943,0,2.769,1.847,2.884,3.23l1.212,22.792c0.23,4.097,0.289,6.116,0.347,6.81c0.864-2.077,2.423-5.135,4.789-10.213
+	l9.579-19.908c1.096-2.248,2.191-2.711,4.039-2.711h1.441c1.615,0,1.847,0.808,1.847,1.327c0,0.577-0.403,1.212-0.635,1.73
+	l-16.502,34.218c-1.097,2.308-2.251,2.769-3.924,2.769h-4.502c-2.77,0-2.711-1.73-2.77-2.999l-1.211-21.927
+	c-0.173-2.885-0.403-7.905-0.403-7.905l-14.08,29.486c-1.442,2.941-2.25,3.345-4.616,3.345h-3.635c-2.366,0-2.827-0.923-2.943-2.712
+	l-1.904-34.274c-0.057-0.23-0.057-0.519-0.057-0.808C177.835,501.289,179.105,500.826,180.432,500.826z"/>
+<path fill="#FFFFFF" d="M229.735,537.005l7.096-33.524c0.404-1.73,0.75-2.654,2.712-2.654h13.386c5.368,0,9.983,0.463,12.464,3.923
+	c1.097,1.501,1.502,3.347,1.502,5.194c0,4.212-1.731,9.002-5.31,11.887c-4.731,3.866-10.675,3.577-14.136,3.577h-6.983l-2.48,11.886
+	c-0.52,2.191-0.576,3.577-2.826,3.577h-3.176c-2.363,0-2.594-1.557-2.594-2.076C229.389,538.332,229.561,537.871,229.735,537.005z
+	 M247.737,520.849c2.999,0,6.809-0.059,9.175-3.001c1.73-2.191,2.192-6.174,2.192-7.27c0-4.039-3.173-4.789-7.503-4.789h-7.095
+	l-3.232,15.06H247.737z"/>
+<path fill="#6F6F6E" d="M134.087,537.005l7.098-33.524c0.404-1.73,0.75-2.654,2.712-2.654h13.387c5.367,0,9.982,0.463,12.463,3.923
+	c1.097,1.501,1.5,3.347,1.5,5.194c0,4.212-1.731,9.002-5.309,11.887c-4.732,3.866-10.675,3.577-14.137,3.577h-6.982l-2.481,11.886
+	c-0.52,2.191-0.576,3.577-2.827,3.577h-3.173c-2.365,0-2.596-1.557-2.596-2.076C133.742,538.332,133.915,537.871,134.087,537.005z
+	 M152.09,520.849c3,0,6.809-0.059,9.175-3.001c1.731-2.191,2.193-6.174,2.193-7.27c0-4.039-3.174-4.789-7.502-4.789h-7.097
+	l-3.23,15.06H152.09z"/>
+<path fill="#FFFFFF" d="M263.119,536.025l1.906-4.792c0.172-0.402,0.518-0.633,0.749-0.633c1.154,0,3.404,5.308,12.001,5.308
+	c7.387,0,8.195-5.539,8.195-6.924c0-2.076-1.444-3.404-2.829-3.982c-1.21-0.519-5.597-1.269-7.558-1.961
+	c-3.404-1.269-6.981-4.328-6.981-9.231c0-3.231,1.673-8.021,5.134-10.849c3.521-2.828,7.905-3.404,11.715-3.404
+	c5.135,0,8.25,1.27,10.443,2.597c0.288,0.173,0.808,0.403,0.808,0.98c0,0.288-0.115,0.52-0.288,0.981l-1.559,3.98
+	c-0.635,1.731-0.75,1.731-1.213,1.731c-1.382,0-1.729-4.328-9.347-4.328c-6.808,0-8.078,4.155-8.078,5.944
+	c0,1.904,1.386,3.059,3.001,3.693c3.75,1.384,9.405,0.98,12.752,6.173c1.097,1.674,1.559,3.636,1.559,5.599
+	c0,3.923-2.424,15.231-16.85,15.231c-7.731,0-13.963-3.518-13.963-4.731C262.716,537.178,262.888,536.717,263.119,536.025z"/>
+<g>
+	<path fill="#C5C5C5" d="M210.851,501.314c0.031,0.022,0.058,0.048,0.086,0.072C210.91,501.36,210.88,501.337,210.851,501.314z"/>
+	<path fill="#C5C5C5" d="M210.747,501.249c0.013,0.009,0.027,0.015,0.04,0.023c-0.022-0.014-0.042-0.032-0.065-0.044
+		C210.729,501.233,210.739,501.243,210.747,501.249z"/>
+	<path fill="#C5C5C5" d="M210.696,501.22c0.007,0.003,0.019,0.005,0.025,0.009c-0.011-0.007-0.032-0.014-0.046-0.021
+		C210.682,501.211,210.689,501.215,210.696,501.22z"/>
+	<path fill="#C5C5C5" d="M309.98,448.608c-0.828,0.442-4.576,5.122-8.023,5.509c0,0-9.263,1.012-11.954,0.594
+		c-2.717-0.423-3.919-0.406-4.819,0.278h-9.918c0,0-1.975,0.079-2.485,0.242c-0.491,0.157-0.65,0.918-0.65,0.918l-1.493,9.876
+		h-54.41l3.189-11.146l3.262-0.296c4.188,0,7.619-0.056,8.516-1.596c0.898-1.544-2.004-2.398-6.191-2.398l-12.268-0.396
+		c-8.662-2.263-8.314,1.251-9.212,2.795c-0.896,1.54,1.771,2.793,5.96,2.793l6.791-0.618l-3.688,12.878l-19.169,16.98
+		c-10.615-7.479-31.312-3.998-50.278,9.428c-6.849,4.852-27.257,20.622-31.788,26.399c3.857-4.207,22.977-18.424,28.088-22.042
+		c18.562-13.14,38.784-16.76,49.588-9.896l-18.783,16.721c0.03,0.051,0.11,0.095,0.127,0.15c0.065,0.085,0.042,0.213,0.141,0.302
+		c0.05,0.059,0.03,0.114,0.059,0.187l19.75-16.458c1.503,1.161,3.767,3.229,4.542,5.638c3.386,10.536,0.534,16.393-6.195,25.399
+		c8.048-8.78,13.496-20.022,9.821-29.118c-0.601-1.485-2.544-4.628-3.729-5.659l16.694-14.068l-5.141,28.823h2.569
+		c0.191,0,0.369,0.009,0.535,0.024c-0.063-0.015-0.11-0.024-0.11-0.024l5.628-30.278h55.023l-0.346,2.281l-58.114,29.348l0-0.001
+		c0.222,0.587,0.218,1.277,0.268,1.881l0.004,0.086c0.024,0.313,0.028,0.521,0.028,0.521l57.356-28.785l-0.824,8.697
+		c-6.101,2.228-12.42,5.529-18.555,9.873c-3.915,2.771-6.233,4.408-8.347,6.377h1.689c0.81-0.536,1.758-1.171,2.957-2.02
+		c7.283-5.156,14.822-8.836,21.949-11.003l-2.267,17.499c0.371,0.627,0.638,1.303,0.82,2.005l3.878-20.193
+		c13.498-3.489,25.183-1.334,30.304,6.893c5.584,8.975,4.355,21.189-5.737,34.056c12.827-13.998,15.657-28.412,9.436-38.415
+		c-5.513-8.86-18.648-10.681-33.458-5.983l4.102-26.008h8.444c0.391,0.717,2.723,0.527,5.296,0.711l10.768-0.644
+		c3.316,0.241,10.172-5.974,11.311-7.717C310.92,450.007,312.189,447.432,309.98,448.608z"/>
+</g>
+<rect x="64.188" y="634.86" fill="none" stroke="#000000" stroke-miterlimit="10" width="282.496" height="163.333"/>
+<path fill="#6F6F6E" d="M156.361,755.085c0.115,0,0.229,0.032,0.345,0.098c1.955,0.858,1.074,0.463,2.607,0.661
+	c2.377-0.263,2.836-1.221,4.638-3.957l-3.718-13.255c-0.077-0.263-0.191-0.526-0.191-0.824c0-0.394,0.267-1.021,1.533-1.021h1.227
+	c2.147,0,2.108,0.858,2.875,3.759c0.767,2.867,1.112,4.649,1.188,5.835l-0.038,0.991c0.652-2.077,5.558-9.497,5.865-9.793
+	c0.728-0.759,1.534-0.792,2.032-0.792h1.111c1.227,0,1.151,0.527,1.227,0.628c0.039,0.295-0.153,0.56-0.268,0.791l-9.776,15.034
+	c-0.881,1.417-1.648,2.505-3.258,3.659c-2.492,1.746-4.639,1.746-5.291,1.746c-3.067,0-2.914-0.625-2.914-0.657v-0.364
+	C155.787,756.008,155.824,755.085,156.361,755.085z"/>
+<path d="M180.432,710.826h2.019c2.251,0,2.597,1.212,2.711,2.596l0.924,16.561c0.635,12.291,0.462,10.905,0.52,13.676
+	c0.693-2.136,13.963-29.602,13.963-29.602c0.693-1.5,1.386-3.23,4.213-3.23h4.097c2.943,0,2.769,1.847,2.884,3.23l1.212,22.792
+	c0.23,4.097,0.289,6.116,0.347,6.81c0.864-2.077,2.423-5.135,4.789-10.213l9.579-19.908c1.096-2.248,2.191-2.711,4.039-2.711h1.441
+	c1.615,0,1.847,0.808,1.847,1.327c0,0.577-0.403,1.212-0.635,1.73l-16.502,34.218c-1.097,2.308-2.251,2.769-3.924,2.769h-4.502
+	c-2.77,0-2.711-1.73-2.77-2.999l-1.211-21.927c-0.173-2.885-0.403-7.905-0.403-7.905l-14.08,29.486
+	c-1.442,2.941-2.25,3.345-4.616,3.345h-3.635c-2.366,0-2.827-0.923-2.943-2.712l-1.904-34.274c-0.057-0.23-0.057-0.519-0.057-0.808
+	C177.835,711.289,179.105,710.826,180.432,710.826z"/>
+<path d="M229.735,747.005l7.096-33.524c0.404-1.73,0.75-2.654,2.712-2.654h13.386c5.368,0,9.983,0.463,12.464,3.923
+	c1.097,1.501,1.502,3.347,1.502,5.194c0,4.212-1.731,9.002-5.31,11.887c-4.731,3.866-10.675,3.577-14.136,3.577h-6.983l-2.48,11.886
+	c-0.52,2.191-0.576,3.577-2.826,3.577h-3.176c-2.363,0-2.594-1.557-2.594-2.076C229.389,748.332,229.561,747.871,229.735,747.005z
+	 M247.737,730.849c2.999,0,6.809-0.059,9.175-3.001c1.73-2.191,2.192-6.174,2.192-7.27c0-4.039-3.173-4.789-7.503-4.789h-7.095
+	l-3.232,15.06H247.737z"/>
+<path fill="#6F6F6E" d="M134.087,747.005l7.098-33.524c0.404-1.73,0.75-2.654,2.712-2.654h13.387c5.367,0,9.982,0.463,12.463,3.923
+	c1.097,1.501,1.5,3.347,1.5,5.194c0,4.212-1.731,9.002-5.309,11.887c-4.732,3.866-10.675,3.577-14.137,3.577h-6.982l-2.481,11.886
+	c-0.52,2.191-0.576,3.577-2.827,3.577h-3.173c-2.365,0-2.596-1.557-2.596-2.076C133.742,748.332,133.915,747.871,134.087,747.005z
+	 M152.09,730.849c3,0,6.809-0.059,9.175-3.001c1.731-2.191,2.193-6.174,2.193-7.27c0-4.039-3.174-4.789-7.502-4.789h-7.097
+	l-3.23,15.06H152.09z"/>
+<path d="M263.119,746.025l1.906-4.792c0.172-0.402,0.518-0.633,0.749-0.633c1.154,0,3.404,5.308,12.001,5.308
+	c7.387,0,8.195-5.539,8.195-6.924c0-2.076-1.444-3.404-2.829-3.982c-1.21-0.519-5.597-1.269-7.558-1.961
+	c-3.404-1.269-6.981-4.328-6.981-9.231c0-3.231,1.673-8.021,5.134-10.849c3.521-2.828,7.905-3.404,11.715-3.404
+	c5.135,0,8.25,1.27,10.443,2.597c0.288,0.173,0.808,0.403,0.808,0.98c0,0.288-0.115,0.52-0.288,0.981l-1.559,3.98
+	c-0.635,1.731-0.75,1.731-1.213,1.731c-1.382,0-1.729-4.328-9.347-4.328c-6.808,0-8.078,4.155-8.078,5.944
+	c0,1.904,1.386,3.059,3.001,3.693c3.75,1.384,9.405,0.98,12.752,6.173c1.097,1.674,1.559,3.636,1.559,5.599
+	c0,3.923-2.424,15.231-16.85,15.231c-7.731,0-13.963-3.518-13.963-4.731C262.716,747.178,262.888,746.717,263.119,746.025z"/>
+<g>
+	<path fill="#C5C5C5" d="M210.851,711.314c0.031,0.022,0.058,0.048,0.086,0.072C210.91,711.36,210.88,711.337,210.851,711.314z"/>
+	<path fill="#C5C5C5" d="M210.747,711.249c0.013,0.009,0.027,0.015,0.04,0.023c-0.022-0.014-0.042-0.032-0.065-0.044
+		C210.729,711.233,210.739,711.243,210.747,711.249z"/>
+	<path fill="#C5C5C5" d="M210.696,711.22c0.007,0.003,0.019,0.005,0.025,0.009c-0.011-0.007-0.032-0.014-0.046-0.021
+		C210.682,711.211,210.689,711.215,210.696,711.22z"/>
+	<path fill="#C5C5C5" d="M309.98,658.608c-0.828,0.442-4.576,5.122-8.023,5.509c0,0-9.263,1.012-11.954,0.594
+		c-2.717-0.423-3.919-0.406-4.819,0.278h-9.918c0,0-1.975,0.079-2.485,0.242c-0.491,0.157-0.65,0.918-0.65,0.918l-1.493,9.876
+		h-54.41l3.189-11.146l3.262-0.296c4.188,0,7.619-0.056,8.516-1.596c0.898-1.544-2.004-2.398-6.191-2.398l-12.268-0.396
+		c-8.662-2.263-8.314,1.251-9.212,2.795c-0.896,1.54,1.771,2.793,5.96,2.793l6.791-0.618l-3.688,12.878l-19.169,16.98
+		c-10.615-7.479-31.312-3.998-50.278,9.428c-6.849,4.852-27.257,20.622-31.788,26.399c3.857-4.207,22.977-18.424,28.088-22.042
+		c18.562-13.14,38.784-16.76,49.588-9.896l-18.783,16.721c0.03,0.051,0.11,0.095,0.127,0.15c0.065,0.085,0.042,0.213,0.141,0.302
+		c0.05,0.059,0.03,0.114,0.059,0.187l19.75-16.458c1.503,1.161,3.767,3.229,4.542,5.638c3.386,10.536,0.534,16.393-6.195,25.399
+		c8.048-8.78,13.496-20.022,9.821-29.118c-0.601-1.485-2.544-4.628-3.729-5.659l16.694-14.068l-5.141,28.823h2.569
+		c0.191,0,0.369,0.009,0.535,0.024c-0.063-0.015-0.11-0.024-0.11-0.024l5.628-30.278h55.023l-0.346,2.281l-58.114,29.348l0-0.001
+		c0.222,0.587,0.218,1.277,0.268,1.881l0.004,0.086c0.024,0.313,0.028,0.521,0.028,0.521l57.356-28.785l-0.824,8.697
+		c-6.101,2.228-12.42,5.529-18.555,9.873c-3.915,2.771-6.233,4.408-8.347,6.377h1.689c0.81-0.536,1.758-1.171,2.957-2.02
+		c7.283-5.156,14.822-8.836,21.949-11.003l-2.267,17.499c0.371,0.627,0.638,1.303,0.82,2.005l3.878-20.193
+		c13.498-3.489,25.183-1.334,30.304,6.893c5.584,8.975,4.355,21.189-5.737,34.056c12.827-13.998,15.657-28.412,9.436-38.415
+		c-5.513-8.86-18.648-10.681-33.458-5.983l4.102-26.008h8.444c0.391,0.717,2.723,0.527,5.296,0.711l10.768-0.644
+		c3.316,0.241,10.172-5.974,11.311-7.717C310.92,660.007,312.189,657.432,309.98,658.608z"/>
+</g>
+<g>
+	<path d="M392.883,485.083c-0.372,0.192-1.151,0.384-2.135,0.384c-2.279,0-3.982-1.439-3.982-4.102c0-2.543,1.715-4.246,4.222-4.246
+		c0.995,0,1.644,0.216,1.919,0.36l-0.264,0.852c-0.384-0.192-0.947-0.336-1.619-0.336c-1.895,0-3.154,1.211-3.154,3.334
+		c0,1.991,1.14,3.25,3.095,3.25c0.647,0,1.295-0.132,1.715-0.336L392.883,485.083z"/>
+	<path d="M401.018,481.785c-0.06-1.128-0.132-2.495-0.132-3.49h-0.024c-0.287,0.936-0.611,1.955-1.019,3.07l-1.428,3.922h-0.791
+		l-1.319-3.85c-0.384-1.151-0.696-2.184-0.924-3.143h-0.024c-0.023,1.008-0.084,2.351-0.155,3.574l-0.216,3.466h-0.996l0.564-8.084
+		h1.331l1.379,3.91c0.336,0.995,0.6,1.883,0.815,2.723h0.024c0.216-0.815,0.504-1.703,0.863-2.723l1.439-3.91h1.331l0.504,8.084
+		h-1.031L401.018,481.785z"/>
+	<path d="M405.652,485.335v-3.43l-2.567-4.654h1.2l1.139,2.231c0.3,0.611,0.552,1.104,0.804,1.667h0.024
+		c0.216-0.528,0.503-1.056,0.815-1.667l1.163-2.231h1.176l-2.699,4.642v3.442H405.652z"/>
+	<path d="M410.261,477.251h1.044v3.898h0.036c0.216-0.312,0.432-0.6,0.636-0.863l2.471-3.035h1.295l-2.927,3.431l3.154,4.653h-1.235
+		l-2.65-3.97l-0.779,0.888v3.082h-1.044V477.251z"/>
+	<path d="M392.066,495.754c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C391.119,491.808,392.066,493.271,392.066,495.754z M387.833,495.873c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C388.505,492.623,387.833,493.751,387.833,495.873z"/>
+	<path d="M403.31,495.754c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C402.362,491.808,403.31,493.271,403.31,495.754z M399.076,495.873c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C399.748,492.623,399.076,493.751,399.076,495.873z"/>
+	<path d="M414.554,495.754c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C413.606,491.808,414.554,493.271,414.554,495.754z M410.32,495.873c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C410.992,492.623,410.32,493.751,410.32,495.873z"/>
+	<path d="M420.856,498.536c0.3,0.18,0.983,0.479,1.727,0.479c1.344,0,1.775-0.852,1.763-1.511c-0.012-1.092-0.995-1.56-2.015-1.56
+		h-0.588v-0.791h0.588c0.768,0,1.739-0.396,1.739-1.319c0-0.624-0.396-1.176-1.367-1.176c-0.624,0-1.224,0.276-1.56,0.516
+		l-0.287-0.768c0.419-0.3,1.211-0.6,2.051-0.6c1.535,0,2.23,0.911,2.23,1.859c0,0.815-0.492,1.499-1.439,1.847v0.024
+		c0.96,0.18,1.728,0.899,1.739,1.99c0,1.247-0.983,2.339-2.843,2.339c-0.875,0-1.643-0.275-2.026-0.527L420.856,498.536z"/>
+	<path d="M431.953,495.754c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C431.006,491.808,431.953,493.271,431.953,495.754z M427.72,495.873c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C428.392,492.623,427.72,493.751,427.72,495.873z"/>
+	<path d="M392.066,510.153c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C391.119,506.207,392.066,507.67,392.066,510.153z M387.833,510.272c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C388.505,507.022,387.833,508.15,387.833,510.272z"/>
+	<path d="M403.31,510.153c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C402.362,506.207,403.31,507.67,403.31,510.153z M399.076,510.272c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C399.748,507.022,399.076,508.15,399.076,510.272z"/>
+	<path d="M414.554,510.153c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C413.606,506.207,414.554,507.67,414.554,510.153z M410.32,510.272c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C410.992,507.022,410.32,508.15,410.32,510.272z"/>
+	<path d="M425.665,506.339v0.696l-3.394,7.1h-1.092l3.382-6.896v-0.023h-3.813v-0.876H425.665z"/>
+	<path d="M431.953,510.153c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C431.006,506.207,431.953,507.67,431.953,510.153z M427.72,510.272c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C428.392,507.022,427.72,508.15,427.72,510.272z"/>
+	<path d="M392.066,524.554c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C391.119,520.607,392.066,522.07,392.066,524.554z M387.833,524.673c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C388.505,521.423,387.833,522.551,387.833,524.673z"/>
+	<path d="M403.31,524.554c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C402.362,520.607,403.31,522.07,403.31,524.554z M399.076,524.673c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C399.748,521.423,399.076,522.551,399.076,524.673z"/>
+	<path d="M414.554,524.554c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C413.606,520.607,414.554,522.07,414.554,524.554z M410.32,524.673c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C410.992,521.423,410.32,522.551,410.32,524.673z"/>
+	<path d="M425.797,524.554c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C424.85,520.607,425.797,522.07,425.797,524.554z M421.563,524.673c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C422.235,521.423,421.563,522.551,421.563,524.673z"/>
+</g>
+<g>
+	<path d="M457.549,104.105c-0.373,0.192-1.152,0.384-2.135,0.384c-2.279,0-3.982-1.439-3.982-4.102c0-2.543,1.715-4.246,4.221-4.246
+		c0.996,0,1.645,0.216,1.92,0.36l-0.264,0.852c-0.385-0.192-0.947-0.336-1.619-0.336c-1.895,0-3.154,1.211-3.154,3.334
+		c0,1.991,1.139,3.25,3.094,3.25c0.648,0,1.295-0.132,1.715-0.336L457.549,104.105z"/>
+	<path d="M465.684,100.807c-0.061-1.128-0.133-2.495-0.133-3.49h-0.023c-0.287,0.936-0.611,1.955-1.02,3.07l-1.428,3.922h-0.791
+		l-1.318-3.85c-0.385-1.151-0.697-2.184-0.924-3.143h-0.025c-0.023,1.008-0.084,2.351-0.154,3.574l-0.217,3.466h-0.996l0.564-8.084
+		h1.332l1.379,3.91c0.336,0.995,0.6,1.883,0.814,2.723h0.025c0.215-0.815,0.504-1.703,0.863-2.723l1.439-3.91h1.33l0.504,8.084
+		h-1.031L465.684,100.807z"/>
+	<path d="M470.318,104.357v-3.43l-2.568-4.654h1.201l1.139,2.231c0.299,0.611,0.551,1.104,0.803,1.667h0.025
+		c0.215-0.528,0.502-1.056,0.814-1.667l1.164-2.231h1.176l-2.699,4.642v3.442H470.318z"/>
+	<path d="M474.926,96.273h1.045v3.898h0.035c0.217-0.312,0.432-0.6,0.637-0.863l2.471-3.035h1.295l-2.928,3.431l3.154,4.653H479.4
+		l-2.65-3.97l-0.779,0.888v3.082h-1.045V96.273z"/>
+	<path d="M456.732,114.776c0,2.65-0.996,4.113-2.711,4.113c-1.523,0-2.566-1.427-2.59-4.006c0-2.626,1.139-4.054,2.723-4.054
+		C455.785,110.83,456.732,112.292,456.732,114.776z M452.498,114.895c0,2.027,0.625,3.179,1.584,3.179
+		c1.066,0,1.582-1.26,1.582-3.25c0-1.919-0.479-3.179-1.582-3.179C453.17,111.645,452.498,112.773,452.498,114.895z"/>
+	<path d="M462.783,118.757v-0.647l0.826-0.804c1.992-1.895,2.902-2.902,2.902-4.078c0-0.791-0.371-1.522-1.535-1.522
+		c-0.707,0-1.295,0.359-1.654,0.659l-0.336-0.743c0.527-0.444,1.307-0.792,2.195-0.792c1.678,0,2.387,1.151,2.387,2.267
+		c0,1.439-1.045,2.603-2.688,4.186l-0.611,0.576v0.023h3.49v0.876H462.783z"/>
+	<path d="M471.229,111.945h-0.023l-1.355,0.731l-0.203-0.803l1.703-0.912h0.898v7.796h-1.02V111.945z"/>
+	<path d="M481.621,114.656c-0.875-0.408-1.248-1.079-1.248-1.751c0-1.235,1.045-2.075,2.424-2.075c1.51,0,2.277,0.936,2.277,1.919
+		c0,0.66-0.334,1.379-1.295,1.823v0.036c0.973,0.384,1.572,1.079,1.572,2.015c0,1.367-1.164,2.267-2.65,2.267
+		c-1.633,0-2.615-0.959-2.615-2.099c0-0.983,0.588-1.691,1.547-2.099L481.621,114.656z M484.283,116.73
+		c0-0.935-0.66-1.402-1.715-1.702c-0.912,0.264-1.402,0.875-1.402,1.619c-0.037,0.779,0.563,1.475,1.559,1.475
+		C483.672,118.122,484.283,117.534,484.283,116.73z M481.381,112.833c-0.012,0.779,0.588,1.199,1.488,1.439
+		c0.67-0.229,1.188-0.708,1.188-1.415c0-0.624-0.373-1.271-1.32-1.271C481.861,111.585,481.381,112.161,481.381,112.833z"/>
+	<path d="M489.6,118.757v-2.135h-3.621v-0.684l3.479-4.978h1.139v4.846h1.092v0.815h-1.092v2.135H489.6z M489.6,115.807v-2.603
+		c0-0.408,0.012-0.815,0.037-1.224H489.6c-0.238,0.456-0.432,0.792-0.646,1.151l-1.908,2.65v0.024H489.6z"/>
+	<path d="M502.773,114.776c0,2.65-0.994,4.113-2.709,4.113c-1.523,0-2.566-1.427-2.592-4.006c0-2.626,1.141-4.054,2.723-4.054
+		C501.826,110.83,502.773,112.292,502.773,114.776z M498.541,114.895c0,2.027,0.623,3.179,1.582,3.179
+		c1.068,0,1.584-1.26,1.584-3.25c0-1.919-0.48-3.179-1.584-3.179C499.213,111.645,498.541,112.773,498.541,114.895z"/>
+	<path d="M453.83,126.344h-0.023l-1.355,0.731l-0.205-0.803l1.703-0.912h0.9v7.796h-1.02V126.344z"/>
+	<path d="M462.889,129.175c0,2.65-0.996,4.113-2.711,4.113c-1.523,0-2.566-1.427-2.59-4.006c0-2.626,1.139-4.054,2.723-4.054
+		C461.941,125.229,462.889,126.692,462.889,129.175z M458.654,129.294c0,2.027,0.625,3.179,1.584,3.179
+		c1.066,0,1.582-1.26,1.582-3.25c0-1.919-0.479-3.179-1.582-3.179C459.326,126.044,458.654,127.172,458.654,129.294z"/>
+	<path d="M469.043,129.175c0,2.65-0.994,4.113-2.709,4.113c-1.523,0-2.566-1.427-2.592-4.006c0-2.626,1.141-4.054,2.723-4.054
+		C468.096,125.229,469.043,126.692,469.043,129.175z M464.811,129.294c0,2.027,0.623,3.179,1.582,3.179
+		c1.068,0,1.584-1.26,1.584-3.25c0-1.919-0.48-3.179-1.584-3.179C465.482,126.044,464.811,127.172,464.811,129.294z"/>
+	<path d="M478.357,133.157v-2.135h-3.623v-0.684l3.479-4.978h1.141v4.846h1.09v0.815h-1.09v2.135H478.357z M478.357,130.207v-2.603
+		c0-0.408,0.012-0.815,0.035-1.224h-0.035c-0.24,0.456-0.432,0.792-0.648,1.151l-1.906,2.65v0.024H478.357z"/>
+	<path d="M481.502,131.958c0.301,0.18,0.984,0.479,1.727,0.479c1.344,0,1.775-0.852,1.764-1.511c-0.012-1.092-0.996-1.56-2.016-1.56
+		h-0.588v-0.791h0.588c0.768,0,1.74-0.396,1.74-1.319c0-0.624-0.396-1.176-1.367-1.176c-0.625,0-1.225,0.276-1.561,0.516
+		l-0.287-0.768c0.42-0.3,1.211-0.6,2.051-0.6c1.535,0,2.23,0.911,2.23,1.859c0,0.815-0.492,1.499-1.439,1.847v0.024
+		c0.961,0.18,1.729,0.899,1.74,1.99c0,1.248-0.984,2.339-2.844,2.339c-0.875,0-1.643-0.275-2.025-0.527L481.502,131.958z"/>
+	<path d="M494.785,126.344h-0.023l-1.355,0.731l-0.205-0.803l1.703-0.912h0.9v7.796h-1.02V126.344z"/>
+	<path d="M499.262,132.414c0.227,0.023,0.492,0,0.852-0.036c0.611-0.084,1.188-0.324,1.631-0.756
+		c0.516-0.468,0.887-1.151,1.031-2.063h-0.035c-0.434,0.527-1.057,0.827-1.848,0.827c-1.391,0-2.291-1.056-2.291-2.387
+		c0-1.476,1.068-2.771,2.662-2.771c1.596,0,2.578,1.283,2.578,3.298c0,1.703-0.574,2.903-1.342,3.646
+		c-0.6,0.588-1.428,0.947-2.268,1.043c-0.383,0.061-0.719,0.072-0.971,0.061V132.414z M499.645,127.94
+		c0,0.971,0.588,1.654,1.5,1.654c0.707,0,1.26-0.348,1.535-0.815c0.061-0.107,0.096-0.216,0.096-0.396
+		c0-1.331-0.492-2.351-1.607-2.351C500.281,126.033,499.645,126.825,499.645,127.94z"/>
+	<path d="M514.547,126.249h-2.975l-0.299,2.003c0.18-0.024,0.348-0.036,0.635-0.036c0.611,0,1.199,0.12,1.68,0.42
+		c0.611,0.336,1.115,1.02,1.115,1.991c0,1.522-1.211,2.662-2.902,2.662c-0.852,0-1.559-0.24-1.943-0.479l0.264-0.804
+		c0.324,0.192,0.961,0.432,1.68,0.432c0.982,0,1.848-0.647,1.834-1.691c0-1.007-0.684-1.715-2.23-1.715
+		c-0.455,0-0.803,0.036-1.09,0.072l0.502-3.742h3.73V126.249z"/>
+	<path d="M456.732,143.576c0,2.65-0.996,4.113-2.711,4.113c-1.523,0-2.566-1.427-2.59-4.006c0-2.626,1.139-4.054,2.723-4.054
+		C455.785,139.629,456.732,141.092,456.732,143.576z M452.498,143.695c0,2.027,0.625,3.179,1.584,3.179
+		c1.066,0,1.582-1.26,1.582-3.25c0-1.919-0.479-3.179-1.582-3.179C453.17,140.445,452.498,141.573,452.498,143.695z"/>
+	<path d="M467.975,143.576c0,2.65-0.994,4.113-2.709,4.113c-1.523,0-2.566-1.427-2.592-4.006c0-2.626,1.141-4.054,2.723-4.054
+		C467.027,139.629,467.975,141.092,467.975,143.576z M463.742,143.695c0,2.027,0.623,3.179,1.582,3.179
+		c1.068,0,1.584-1.26,1.584-3.25c0-1.919-0.48-3.179-1.584-3.179C464.414,140.445,463.742,141.573,463.742,143.695z"/>
+	<path d="M479.219,143.576c0,2.65-0.994,4.113-2.709,4.113c-1.523,0-2.566-1.427-2.592-4.006c0-2.626,1.141-4.054,2.723-4.054
+		C478.271,139.629,479.219,141.092,479.219,143.576z M474.986,143.695c0,2.027,0.623,3.179,1.582,3.179
+		c1.068,0,1.584-1.26,1.584-3.25c0-1.919-0.48-3.179-1.584-3.179C475.658,140.445,474.986,141.573,474.986,143.695z"/>
+	<path d="M487.561,140.745h-0.023l-1.355,0.731l-0.205-0.803l1.703-0.912h0.9v7.796h-1.02V140.745z"/>
+	<path d="M496.619,143.576c0,2.65-0.996,4.113-2.711,4.113c-1.523,0-2.566-1.427-2.59-4.006c0-2.626,1.139-4.054,2.723-4.054
+		C495.672,139.629,496.619,141.092,496.619,143.576z M492.385,143.695c0,2.027,0.625,3.179,1.584,3.179
+		c1.066,0,1.582-1.26,1.582-3.25c0-1.919-0.479-3.179-1.582-3.179C493.057,140.445,492.385,141.573,492.385,143.695z"/>
+	<path d="M502.773,143.576c0,2.65-0.994,4.113-2.709,4.113c-1.523,0-2.566-1.427-2.592-4.006c0-2.626,1.141-4.054,2.723-4.054
+		C501.826,139.629,502.773,141.092,502.773,143.576z M498.541,143.695c0,2.027,0.623,3.179,1.582,3.179
+		c1.068,0,1.584-1.26,1.584-3.25c0-1.919-0.48-3.179-1.584-3.179C499.213,140.445,498.541,141.573,498.541,143.695z"/>
+</g>
+<g>
+	<path d="M392.883,693.083c-0.372,0.192-1.151,0.384-2.135,0.384c-2.279,0-3.982-1.439-3.982-4.102c0-2.543,1.715-4.246,4.222-4.246
+		c0.995,0,1.644,0.216,1.919,0.36l-0.264,0.852c-0.384-0.192-0.947-0.336-1.619-0.336c-1.895,0-3.154,1.211-3.154,3.334
+		c0,1.991,1.14,3.25,3.095,3.25c0.647,0,1.295-0.132,1.715-0.336L392.883,693.083z"/>
+	<path d="M401.018,689.785c-0.06-1.128-0.132-2.495-0.132-3.49h-0.024c-0.287,0.936-0.611,1.955-1.019,3.07l-1.428,3.922h-0.791
+		l-1.319-3.85c-0.384-1.151-0.696-2.184-0.924-3.143h-0.024c-0.023,1.008-0.084,2.351-0.155,3.574l-0.216,3.466h-0.996l0.564-8.084
+		h1.331l1.379,3.91c0.336,0.995,0.6,1.883,0.815,2.723h0.024c0.216-0.815,0.504-1.703,0.863-2.723l1.439-3.91h1.331l0.504,8.084
+		h-1.031L401.018,689.785z"/>
+	<path d="M405.652,693.335v-3.43l-2.567-4.654h1.2l1.139,2.231c0.3,0.611,0.552,1.104,0.804,1.667h0.024
+		c0.216-0.528,0.503-1.056,0.815-1.667l1.163-2.231h1.176l-2.699,4.642v3.442H405.652z"/>
+	<path d="M410.261,685.251h1.044v3.898h0.036c0.216-0.312,0.432-0.6,0.636-0.863l2.471-3.035h1.295l-2.927,3.431l3.154,4.653h-1.235
+		l-2.65-3.97l-0.779,0.888v3.082h-1.044V685.251z"/>
+	<path d="M392.066,703.754c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C391.119,699.808,392.066,701.271,392.066,703.754z M387.833,703.873c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C388.505,700.623,387.833,701.751,387.833,703.873z"/>
+	<path d="M403.31,703.754c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C402.362,699.808,403.31,701.271,403.31,703.754z M399.076,703.873c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C399.748,700.623,399.076,701.751,399.076,703.873z"/>
+	<path d="M414.554,703.754c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C413.606,699.808,414.554,701.271,414.554,703.754z M410.32,703.873c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C410.992,700.623,410.32,701.751,410.32,703.873z"/>
+	<path d="M420.856,706.536c0.3,0.18,0.983,0.479,1.727,0.479c1.344,0,1.775-0.852,1.763-1.511c-0.012-1.092-0.995-1.56-2.015-1.56
+		h-0.588v-0.791h0.588c0.768,0,1.739-0.396,1.739-1.319c0-0.624-0.396-1.176-1.367-1.176c-0.624,0-1.224,0.276-1.56,0.516
+		l-0.287-0.768c0.419-0.3,1.211-0.6,2.051-0.6c1.535,0,2.23,0.911,2.23,1.859c0,0.815-0.492,1.499-1.439,1.847v0.024
+		c0.96,0.18,1.728,0.899,1.739,1.99c0,1.247-0.983,2.339-2.843,2.339c-0.875,0-1.643-0.275-2.026-0.527L420.856,706.536z"/>
+	<path d="M431.953,703.754c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C431.006,699.808,431.953,701.271,431.953,703.754z M427.72,703.873c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C428.392,700.623,427.72,701.751,427.72,703.873z"/>
+	<path d="M392.066,718.153c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C391.119,714.207,392.066,715.67,392.066,718.153z M387.833,718.272c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C388.505,715.022,387.833,716.15,387.833,718.272z"/>
+	<path d="M403.31,718.153c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C402.362,714.207,403.31,715.67,403.31,718.153z M399.076,718.272c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C399.748,715.022,399.076,716.15,399.076,718.272z"/>
+	<path d="M414.554,718.153c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C413.606,714.207,414.554,715.67,414.554,718.153z M410.32,718.272c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C410.992,715.022,410.32,716.15,410.32,718.272z"/>
+	<path d="M425.665,714.339v0.696l-3.394,7.1h-1.092l3.382-6.896v-0.023h-3.813v-0.876H425.665z"/>
+	<path d="M431.953,718.153c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C431.006,714.207,431.953,715.67,431.953,718.153z M427.72,718.272c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C428.392,715.022,427.72,716.15,427.72,718.272z"/>
+	<path d="M392.066,732.554c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C391.119,728.607,392.066,730.07,392.066,732.554z M387.833,732.673c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C388.505,729.423,387.833,730.551,387.833,732.673z"/>
+	<path d="M403.31,732.554c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C402.362,728.607,403.31,730.07,403.31,732.554z M399.076,732.673c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C399.748,729.423,399.076,730.551,399.076,732.673z"/>
+	<path d="M414.554,732.554c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C413.606,728.607,414.554,730.07,414.554,732.554z M410.32,732.673c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C410.992,729.423,410.32,730.551,410.32,732.673z"/>
+	<path d="M422.895,729.723h-0.023l-1.355,0.731l-0.204-0.803l1.703-0.912h0.899v7.796h-1.02V729.723z"/>
+	<path d="M431.953,732.554c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C431.006,728.607,431.953,730.07,431.953,732.554z M427.72,732.673c0,2.027,0.624,3.179,1.583,3.179c1.067,0,1.583-1.26,1.583-3.25
+		c0-1.919-0.479-3.179-1.583-3.179C428.392,729.423,427.72,730.551,427.72,732.673z"/>
+	<path d="M438.108,732.554c0,2.65-0.995,4.113-2.71,4.113c-1.523,0-2.566-1.427-2.591-4.006c0-2.626,1.14-4.054,2.723-4.054
+		C437.161,728.607,438.108,730.07,438.108,732.554z M433.875,732.673c0,2.027,0.624,3.179,1.583,3.179
+		c1.067,0,1.583-1.26,1.583-3.25c0-1.919-0.479-3.179-1.583-3.179C434.547,729.423,433.875,730.551,433.875,732.673z"/>
+</g>
+</svg>
diff --git a/docs/conf.py b/docs/conf.py
index 4050405..3280154 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,26 +1,8 @@
-###############################################################################
-#
-# Copyright (C) 2014-2016 PyWPS Development Team, represented by Jachym Cepicky
-#
-# 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.
-#
-###############################################################################
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
 
 import sys
 
@@ -37,7 +19,7 @@ with open('../VERSION.txt') as f:
     version = f.read().strip()
 
 release = version
-latex_logo = 'pywps.png'
+latex_logo = '_static/pywps.png'
 
 extensions = ['sphinx.ext.extlinks',
               'sphinx.ext.autodoc',
@@ -51,10 +33,30 @@ master_doc = 'index'
 
 pygments_style = 'sphinx'
 
-html_theme = 'default'
-htmlhelp_basename = 'PyWPSdoc'
-html_logo = 'pywps.png'
+html_static_path = ['_static']
 
+htmlhelp_basename = 'PyWPSdoc'
+#html_logo = 'pywps.png'
+
+html_theme = 'alabaster'
+# alabaster settings
+html_sidebars = {
+    '**': [
+        'about.html',
+        'navigation.html',
+        'searchbox.html',
+    ]
+}
+html_theme_options = {
+    'show_related': True,
+    'travis_button': True,
+    'github_banner': True,
+    'github_user': 'geopython',
+    'github_repo': 'pywps',
+    'github_button': True,
+    'logo': 'pywps.png',
+    'logo_name': False
+}
 
 class Mock(object):
     def __init__(self, *args, **kwargs):
diff --git a/docs/configuration.rst b/docs/configuration.rst
index 29197a2..99851bc 100644
--- a/docs/configuration.rst
+++ b/docs/configuration.rst
@@ -1,6 +1,5 @@
 .. _configuration:
 
-=============
 Configuration
 =============
 
@@ -16,6 +15,7 @@ The configuration file has 3 sections:
 
     * `metadata:main` for the server metadata inputs
     * `server` for server configuration
+    * `loggging` for logging configuration
     * `grass` for *optional* configuration to support `GRASS GIS
       <http://grass.osgeo.org>`_
 
@@ -98,13 +98,6 @@ configuration file <http://docs.pycsw.org/en/latest/configuration.html>`_.
     https://docs.python.org/2/library/codecs.html#standard-encodings).  Default
     value is 'UTF-8'
 
-:loglevel:
-    the logging level (see
-    http://docs.python.org/library/logging.html#logging-levels)
-
-:logfile:
-    the full file path to the log file
-
 :parallelprocesses:
     maximum number of parallel running processes - set this number carefully.
     The effective number of parallel running processes is limited by the number 
@@ -113,10 +106,6 @@ configuration file <http://docs.pycsw.org/en/latest/configuration.html>`_.
     reasonable number of parallel running processes is not higher than the 
     number of processor cores.
 
-:logdatabase:
-    SQLite3 file, where the login about requests/responses is to be stored. It
-    can be set to `":memory:"` to store the database in memory.
-
 :maxrequestsize:
     maximal request size. 0 for no limit 
     
@@ -138,6 +127,21 @@ configuration file <http://docs.pycsw.org/en/latest/configuration.html>`_.
         Example: `outputpath=/var/www/wps/outputs` shall correspond with
         `outputurl=http://foo.bar/wps/outputs`
 
+[logging]
+---------
+
+:level:
+    the logging level (see
+    http://docs.python.org/library/logging.html#logging-levels)
+
+:file:
+    the full file path to the log file for being able to see possible error
+    messages.
+
+:database:
+    Connection string to database where the login about requests/responses is to be stored. We are using `SQLAlchemy <http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls>`_
+    please use the configuration string. The default is SQLite3 `:memory:` object.
+
 
 [grass]
 -------
diff --git a/docs/demobuffer.py b/docs/demobuffer.py
index 4c1b966..9d614fc 100644
--- a/docs/demobuffer.py
+++ b/docs/demobuffer.py
@@ -1,13 +1,32 @@
-# PyWPS-4 example process to be used for the documenatation and as demonstration
-# how to create custom process instance
+###############################################################################
 #
-# The MIT License (MIT)
-# Copyright (c) 2016 PyWPS Project Steering Committee
-# https://opensource.org/licenses/MIT
+# Copyright (C) 2014-2016 PyWPS Development Team, represented by
+# PyWPS Project Steering Committee
 #
+# 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.
+#
+###############################################################################
+
 __author__ = 'Jachym Cepicky'
 
 from pywps import Process, LiteralInput, ComplexOutput, ComplexInput, Format
+from pywps.app.Common import Metadata
 from pywps.validator.mode import MODE
 from pywps.inout.formats import FORMATS
 
@@ -38,6 +57,7 @@ class DemoBuffer(Process):
             version='1.0.0',
             title='Buffer',
             abstract='This process demonstrates, how to create any process in PyWPS environment',
+            metadata=[Metadata('process metadata 1', 'http://example.org/1'), Metadata('process metadata 2', 'http://example.org/2')])
             inputs=inputs,
             outputs=outputs,
             store_supported=True,
diff --git a/docs/deployment.rst b/docs/deployment.rst
index 9fd52ef..12ce04b 100644
--- a/docs/deployment.rst
+++ b/docs/deployment.rst
@@ -1,6 +1,5 @@
 .. _deployment:
 
-=================================
 Deployment to a production server
 =================================
 
@@ -101,7 +100,7 @@ First, the WSGI module must be installed and enabled::
 You then can edit your site configuration file
 (`/etc/apache2/sites-enabled/yoursite.conf`) and add the following::
 
-        # PyWPS-4
+        # PyWPS
         WSGIDaemonProcess pywps home=/path/to/pywps user=www-data group=www-data processes=2 threads=5
         WSGIScriptAlias /pywps /path/to/pywps/pywps.wsgi process-group=pywps
 
@@ -152,9 +151,8 @@ The result should be an XML-encoded error message.
 .. code-block:: xml
 
     <?xml version="1.0" encoding="UTF-8"?>
-    <!-- PyWPS 4.0.0-alpha2 -->
     <ows:ExceptionReport xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd" version="1.0.0">
-        <ows:Exception exceptionCode="MissingParameterValue" locator="service" >
+        <ows:Exception exceptionCode="MissingParameterValue" locator="service">
             <ows:ExceptionText>service</ows:ExceptionText>
         </ows:Exception>
     </ows:ExceptionReport>
diff --git a/docs/development.rst b/docs/development.rst
index 2291b00..13d4a73 100644
--- a/docs/development.rst
+++ b/docs/development.rst
@@ -1,4 +1,5 @@
-================
+.. _development:
+
 Developers Guide
 ================
 
diff --git a/docs/exceptions.rst b/docs/exceptions.rst
index 0015cb7..5abc6db 100644
--- a/docs/exceptions.rst
+++ b/docs/exceptions.rst
@@ -1,12 +1,11 @@
 .. _exceptions:
 
-==========
 Exceptions
 ==========
 
 .. module:: pywps.exceptions
 
-PyWPS-4 will throw exceptions based on the error occurred.
+PyWPS will throw exceptions based on the error occurred.
 The exceptions will point out what is missing or what went wrong
 as accurately as possible.
 
diff --git a/docs/external_tools.rst b/docs/external-tools.rst
similarity index 65%
rename from docs/external_tools.rst
rename to docs/external-tools.rst
index 417c37e..f785c13 100644
--- a/docs/external_tools.rst
+++ b/docs/external-tools.rst
@@ -1,10 +1,8 @@
-########################
 PyWPS and external tools
-########################
+========================
 
-=========
 GRASS GIS
-=========
+---------
 
 .. todo:: How to setup and get GRASS GIS up and running with PyWPS and example
         process
diff --git a/docs/index.rst b/docs/index.rst
index cd2d9bf..9a724c9 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,25 +1,22 @@
-=====================================
-Welcome to the PyWPS-4 documentation!
-=====================================
+.. _index:
 
-.. note:: Please be awere that PyWPS-4 is still in pre-release state, 
-   there is no stable release yet.
-   
+Welcome to the PyWPS |release| documentation!
+=============================================
 
 PyWPS is a server side implementation of the `OGC Web Processing Service 
-(OGC WPS) standard <http://opengeospatial.org/standards/wps>`_ , using the 
+(OGC WPS) standard <http://opengeospatial.org/standards/wps>`_, using the 
 `Python <http://python.org>`_ programming language. PyWPS is currently 
 supporting WPS 1.0.0. Support for the version 2.0.0. of OGC WPS standard is 
 presently being planned.
 
-PyWPS has a bicycle in it's logo, because:
+Like the bicycle in the logo, PyWPS is:
 
-* It's simple to maintain
-* It's fast to drive
-* It can carry a lot
-* It's easy to hack
+* simple to maintain
+* fast to drive
+* able to carry a lot
+* easy to hack
 
-**Mount your bike and setup & configure your PyWPS instance!**
+**Mount your bike and setup your PyWPS instance!**
 
 .. todo::
     * request queue management (probably linked from documentation)
@@ -29,7 +26,7 @@ Contents:
 ---------
 
 .. toctree::
-   :maxdepth: 2
+   :maxdepth: 3
 
    wps
    pywps
@@ -38,7 +35,7 @@ Contents:
    process
    deployment
    migration
-   external_tools
+   external-tools
    api
    development
    exceptions
diff --git a/docs/install.rst b/docs/install.rst
index 0c1e71b..d029a37 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -1,11 +1,9 @@
 .. _installation:
 
-============
 Installation
 ============
 
-
-.. note:: PyWPS-4 is not tested on the MS Windows platform. Please join the
+.. note:: PyWPS is not tested on the MS Windows platform. Please join the
     development team if you need this platform to be supported. This is mainly 
     because of the lack of a multiprocessing library.  It is used to process 
     asynchronous execution, i.e., when making requests storing the response 
@@ -16,53 +14,80 @@ Installation
 Dependencies and requirements
 -----------------------------
 
-PyWPS-4 runs on Python 2.7, 3.3 or newer. PyWPS is currently tested and
-developed on Linux (mostly Ubuntu). In the documentation we take this 
+PyWPS runs on Python 2.7, 3.3 or higher. PyWPS is currently tested and
+developed on Linux (mostly Ubuntu).  In the documentation we take this 
 distribution as reference.
 
-Prior to installing PyWPS-4, Git and the Python bindings for GDAL must be
+Prior to installing PyWPS, Git and the Python bindings for GDAL must be
 installed in the system.  In Debian based systems these packages can be
 installed with a tool like *apt*::
 
-    $ sudo apt install git python-gdal
+    $ sudo apt-get install git python-gdal
+
+Alternatively, if GDAL is already installed on your system you can
+install the GDAL Python bindings via pip with::
 
+    $ pip install GDAL==1.10.0 --global-option=build_ext --global-option="-I/usr/include/gdal"
 
 Download and install
 --------------------
 
-Using PIP
-        The easiest way to install PyWPS-4 is using the Python Package Index
+Using pip
+        The easiest way to install PyWPS is using the Python Package Index
         (PIP).  It fetches the source code from the repository and installs it
         automatically in the system.  This might require superuser permissions
         (e.g. *sudo* in Debian based systems)::
 
             $ sudo pip install -e git+https://github.com/geopython/pywps.git@master#egg=pywps-dev
 
+.. todo::
+
+  * document Debian / Ubuntu package support
+
+
 Manual installation
-        In alternative PyWPS-4 can be installed manually.
-        It requires the cloning of the source code from the repository and then the
-        usage of the `setup.py` script.  An example again for Debian based systems (note
+        Manual installation of PyWPS requires `downloading <http://pywps.org/download>`_ the
+        source code followed by usage of the `setup.py` script.  An example again for Debian based systems (note
         the usage of `sudo` for install)::
 
-            $ git clone https://github.com/geopython/pywps.git pywps-4
-
-            $ cd pywps-4/
+            $ tar zxf pywps-x.y.z.tar.gz
+            $ cd pywps-x.y.z/
 
         Then install the package dependencies using pip::
 
             $ pip install -r requirements.txt
+            $ pip install -r requirements-gdal.txt  # for GDAL Python bindings (if python-gdal is not already installed by `apt-get`)
             $ pip install -r requirements-dev.txt  # for developer tasks
 
         To install PyWPS system-wide run::
 
             $ sudo python setup.py install
 
+For Developers
+        Installation of the source code using Git and Python's virtualenv tool::
+
+            $ virtualenv my-pywps-env
+            $ cd my-pywps-env
+            $ source bin/activate
+            $ git clone https://github.com/geopython/pywps.git
+            $ cd pywps
+
+        Then install the package dependencies using pip as described in the Manual installation section. To install
+        PyWPS::
+
+            $ python setup.py install
+
+        Note that installing PyWPS via a virtualenv environment keeps the installation of PyWPS and its
+        dependencies isolated to the virtual environment and does not affect other parts of the system.  This
+        installation option is handy for development and / or users who may not have system-wide administration
+        privileges.
+
 .. _demo:
 
 The demo service and its sample processes
 -----------------------------------------
 
-To use PyWPS-4 the user must code processes and publish them through a service.
+To use PyWPS the user must code processes and publish them through a service.
 A demo service is available that makes up a good starting point for first time
 users. This launches a very simple built-in server (relying on `flask
 <http://flask.pocoo.org/>`_), which is good enough for testing but probably not
diff --git a/docs/migration.rst b/docs/migration.rst
index e1ac976..a44dd17 100644
--- a/docs/migration.rst
+++ b/docs/migration.rst
@@ -1,5 +1,6 @@
-==============================
-Migrating from PyWP 3.x to 4.x
-==============================
+.. _migration:
+
+Migrating from PyWPS 3.x to 4.x
+===============================
 
 TODO
diff --git a/docs/process.rst b/docs/process.rst
index 6421af3..06d755a 100644
--- a/docs/process.rst
+++ b/docs/process.rst
@@ -2,7 +2,6 @@
 
 .. _process:
 
-#########
 Processes
 #########
 
@@ -311,7 +310,7 @@ Returning large data
 WPS allows for a clever method of returning a large data file: instead
 of embedding the data in the response, it can be saved separately, and
 a URL is returned from where the data can be downloaded. In the current
-implementation, PyWPS-4 saves the file in a folder specified
+implementation, PyWPS saves the file in a folder specified
 in the configuration passed by the service (or in a default location).
 The URL returned is embedded in the XML response.
 
@@ -375,17 +374,15 @@ process identifier and their inputs and outputs.
 A host, a port, a config file and the processes can be passed as arguments to the 
 :class:`Server` constructor.
 **host** and **port** will be **prioritised** if passed to the constructor, 
-otherwise the contents of the config file (*pywps.cfg*) are used. 
+otherwise the contents of the config file (`pywps.cfg`) are used. 
 
 
 Use the `run` method to start the server::
 
     ...
-    s = Server(host='0.0.0.0', processes=processes, config_file=config_file)
-
+    s = Server(host='localhost', processes=processes, config_file=config_file)
     s.run()
     ...
-    
 
 To make the server visible from another computer, replace ``localhost`` with ``0.0.0.0``.
     
diff --git a/docs/pywps.rst b/docs/pywps.rst
index ddabe2a..ba93c66 100644
--- a/docs/pywps.rst
+++ b/docs/pywps.rst
@@ -1,15 +1,14 @@
 .. _pywps:
 
-=====
 PyWPS
 =====
 
 .. todo:: 
 
-    * how are thnigs organised
-    * storage
-    * dblog
-    * relationship to grass gis
+  * how are things organised
+  * storage
+  * dblog
+  * relationship to grass gis
 
 PyWPS philosophy
 ----------------
diff --git a/docs/wps.rst b/docs/wps.rst
index 29e4389..120d147 100644
--- a/docs/wps.rst
+++ b/docs/wps.rst
@@ -1,6 +1,5 @@
 .. _wps:
 
-====================================
 OGC Web Processing Service (OGC WPS)
 ====================================
 
@@ -25,7 +24,7 @@ before, there is no communication history between the server and the client.
 Process
 -------
 
-A process `p` is a function that for each input returns a corresponding output
+A process `p` is a function that for each input returns a corresponding output:
 
 .. math::
 
@@ -43,7 +42,7 @@ two raster maps together) or very complicated (climate change model). It can
 take short time (seconds) or long (days) to be calculated. Process is, what you,
 as PyWPS user, want to expose to other people and let their data processed.
 
-Every process has
+Every process has the following properties:
 
 Identifier
     Unique process identifier
@@ -55,14 +54,15 @@ Abstract
     Longer description of the process, what it does, how is it supposed to be
     used
 
-And list of in- and outputs.
+And a list of inputs and outputs.
+
+Data inputs and outputs
+-----------------------
 
-Data in- and outputs
---------------------
-OGC WPS defines 3 types of data inputs and data outputs *LiteralData*,
+OGC WPS defines 3 types of data inputs and outputs: *LiteralData*,
 *ComplexData* and *BoundingBoxData*.
 
-All data types do need to have following attributes:
+All data types do need to have following properties:
 
 Identifier
     Unique input identifier
@@ -122,7 +122,7 @@ region.
 
 Passing data to process instance
 --------------------------------
-There are 3 typical ways, how to pass the input data from the client to the
+There are typically 3 approaches to pass the input data from the client to the
 server:
 
 **Data are on the server already**
@@ -193,10 +193,10 @@ ProcessFailed
 
 Request encoding, HTTP GET and POST
 -----------------------------------
-The request can be encoded either using Key-value-pairs (KVP) or as the
-XML-formatted document.
 
-Key-value-pair
+The request can be encoded either using key-value pairs (KVP) or an XML payload.
+
+Key-value pairs
     is usually sent via `HTTP GET request method
     <https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods>`_
     encoded directly in the URL. The keys and values are separated with `=` sign and
@@ -205,14 +205,14 @@ Key-value-pair
 
             http://server.domain/wps?service=WPS&request=GetCapabilities&version=1.0.0
 
-    In this example, there are 3 pairs of input parameter: service, request and
-    version with values `WPS`, `GetCapabilities` and `1.0.0` respectively.
+    In this example, there are 3 pairs of input parameter: `service`, `request` and
+    `version` with values `WPS`, `GetCapabilities` and `1.0.0` respectively.
 
-XML
-    is document sent via `HTTP POST request method
+XML payload
+    is XML data sent via `HTTP POST request method
     <https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods>`_.
     The XML document can be more rich, having more parameters, better to be
-    parsed in complex structures. Client can also encode whole datasets to the
+    parsed in complex structures. The Client can also encode entire datasets to the
     request, including raster (encoded using base64) or vector data (usually as GML file).::
 
         <?xml version="1.0" encoding="UTF-8"?>
diff --git a/pywps/__init__.py b/pywps/__init__.py
index 1726312..94c1402 100644
--- a/pywps/__init__.py
+++ b/pywps/__init__.py
@@ -1,31 +1,8 @@
-##############################################################################
-#
-# Author:    Alex Morega & Calin Ciociu
-#
-# License:
-#
-# Web Processing Service implementation
-# Copyright (C) 2015 PyWPS Development Team, represented by Jachym Cepicky
-#
-# 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.
-#
-##############################################################################
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
 
 import logging
 
@@ -33,7 +10,7 @@ import os
 
 from lxml.builder import ElementMaker
 
-__version__ = '4.0.0-beta1'
+__version__ = '4.0.0rc3'
 
 LOGGER = logging.getLogger('PYWPS')
 LOGGER.debug('setting core variables')
diff --git a/pywps/_compat.py b/pywps/_compat.py
index 95672a4..b8c8e7d 100644
--- a/pywps/_compat.py
+++ b/pywps/_compat.py
@@ -1,41 +1,20 @@
-###############################################################################
-#
-# Author:    Alex Morega (?)
-#            
-# License:
-#
-# Web Processing Service implementation
-# Copyright (C) 2015 PyWPS Development Team, represented by Jachym Cepicky
-#
-# 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.
-#
-###############################################################################
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
 
 import logging
 import sys
 
+__author__ = "Alex Morega"
+
 LOGGER = logging.getLogger('PYWPS')
 PY2 = sys.version_info[0] == 2
 
 if PY2:
     LOGGER.debug('Python 2.x')
-    text_type = unicode
+    text_type = unicode  # noqa
     from StringIO import StringIO
     from flufl.enum import Enum
     from urlparse import urlparse
diff --git a/pywps/app/Common.py b/pywps/app/Common.py
new file mode 100644
index 0000000..a01937e
--- /dev/null
+++ b/pywps/app/Common.py
@@ -0,0 +1,31 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
+import logging
+
+LOGGER = logging.getLogger("PYWPS")
+
+
+class Metadata(object):
+    """
+    ows:Metadata content model.
+
+    :param title: Metadata title, human readable string
+    :param href: fully qualified URL
+    :param type_: fully qualified URL
+    """
+
+    def __init__(self, title, href=None, type_='simple'):
+        self.title = title
+        self.href = href
+        self.type = type_
+
+    def __iter__(self):
+        yield '{http://www.w3.org/1999/xlink}title', self.title
+        if self.href is not None:
+            yield '{http://www.w3.org/1999/xlink}href', self.href
+        yield '{http://www.w3.org/1999/xlink}type', self.type
diff --git a/pywps/app/Process.py b/pywps/app/Process.py
index f0c3761..8aa93ad 100644
--- a/pywps/app/Process.py
+++ b/pywps/app/Process.py
@@ -1,27 +1,9 @@
-###############################################################################
-#
-# Copyright (C) 2014-2016 PyWPS Development Team, represented by
-# PyWPS Project Steering Committee
-#
-# 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.
-#
-###############################################################################
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 
 import logging
 import os
@@ -37,12 +19,13 @@ from pywps.app.WPSResponse import STATUS
 from pywps.app.WPSRequest import WPSRequest
 import pywps.configuration as config
 from pywps._compat import PY2
-from pywps.exceptions import StorageNotSupported, OperationNotSupported, \
-    ServerBusy, NoApplicableCode
+from pywps.exceptions import (StorageNotSupported, OperationNotSupported,
+                              ServerBusy, NoApplicableCode)
 
 
 LOGGER = logging.getLogger("PYWPS")
 
+
 class Process(object):
     """
     :param handler: A callable that gets invoked for each incoming
@@ -58,6 +41,8 @@ class Process(object):
                    should be :class:`~LiteralOutput` and :class:`~ComplexOutput`
                    and :class:`~BoundingBoxOutput`
                    objects.
+    :param metadata: List of metadata advertised by this process. They
+                     should be :class:`pywps.app.Common.Metadata` objects.
     """
 
     def __init__(self, handler, identifier, title, abstract='', profile=[], metadata=[], inputs=[],
@@ -78,7 +63,6 @@ class Process(object):
         self._grass_mapset = None
         self.grass_location = grass_location
 
-
         if store_supported:
             self.store_supported = 'true'
         else:
@@ -89,8 +73,6 @@ class Process(object):
         else:
             self.status_supported = 'false'
 
-
-
     def capabilities_xml(self):
         doc = WPS.Process(
             OWS.Identifier(self.identifier),
@@ -98,9 +80,8 @@ class Process(object):
         )
         if self.abstract:
             doc.append(OWS.Abstract(self.abstract))
-        # TODO: See Table 32 Metadata in OGC 06-121r3
-        #for m in self.metadata:
-        #    doc.append(OWS.Metadata(m))
+        for m in self.metadata:
+            doc.append(OWS.Metadata(dict(m)))
         if self.profile:
             doc.append(OWS.Profile(self.profile))
         if self.version != 'None':
@@ -130,7 +111,7 @@ class Process(object):
             doc.append(OWS.Abstract(self.abstract))
 
         for m in self.metadata:
-            doc.append(OWS.Metadata({'{http://www.w3.org/1999/xlink}title': m}))
+            doc.append(OWS.Metadata(dict(m)))
 
         for p in self.profile:
             doc.append(WPS.Profile(p))
@@ -152,7 +133,6 @@ class Process(object):
             if self.store_supported != 'true':
                 raise StorageNotSupported('Process does not support the storing of the execute response')
 
-
             if wps_request.status == 'true':
                 if self.status_supported != 'true':
                     raise OperationNotSupported('Process does not support the updating of status')
@@ -189,15 +169,15 @@ class Process(object):
         :return: wps_response or None
         """
 
-        maxparalel = int(config.get_config_value('server', 'parallelprocesses'))
-        running = len(dblog.get_running())
-        stored = len(dblog.get_stored())
+        maxparallel = int(config.get_config_value('server', 'parallelprocesses'))
+        running = dblog.get_running().count()
+        stored = dblog.get_stored().count()
 
         # async
         if async:
 
             # run immedietly
-            if running < maxparalel:
+            if running < maxparallel or maxparallel == -1:
                 self._run_async(wps_request, wps_response)
 
             # try to store for later usage
@@ -207,7 +187,7 @@ class Process(object):
 
         # not async
         else:
-            if running < maxparalel:
+            if running < maxparallel or maxparallel == -1:
                 wps_response = self._run_process(wps_request, wps_response)
             else:
                 raise ServerBusy('Maximum number of parallel running processes reached. Please try later.')
@@ -222,7 +202,6 @@ class Process(object):
         )
         process.start()
 
-
     def _store_process(self, stored, wps_request, wps_response):
         """Try to store given requests
         """
@@ -242,10 +221,10 @@ class Process(object):
             wps_response.update_status('PyWPS Process started', 0)
             wps_response = self.handler(wps_request, wps_response)
 
-            if (not wps_response.status_percentage) or (wps_response.status_percentage != 100):
-                LOGGER.debug('Updating process status to 100% if everything went correctly')
-                wps_response.update_status('PyWPS Process finished', 100,
-                        STATUS.DONE_STATUS, clean=self.async)
+            # if (not wps_response.status_percentage) or (wps_response.status_percentage != 100):
+            LOGGER.debug('Updating process status to 100% if everything went correctly')
+            wps_response.update_status('PyWPS Process {} finished'.format(self.title),
+                                       100, STATUS.DONE_STATUS, clean=self.async)
         except Exception as e:
             traceback.print_exc()
             LOGGER.debug('Retrieving file and line number where exception occurred')
@@ -276,9 +255,9 @@ class Process(object):
                 wps_response.update_status(msg, -1)
 
         # tr
-        stored_requests = dblog.get_first_stored()
-        if len(stored_requests) > 0:
-            (uuid, request_json) = stored_requests[0]
+        stored_request = dblog.get_first_stored()
+        if stored_request:
+            (uuid, request_json) = (stored_request.uuid, stored_request.request)
             new_wps_request = WPSRequest()
             new_wps_request.json = json.loads(request_json)
             new_wps_response = WPSResponse(self, new_wps_request, uuid)
@@ -287,18 +266,22 @@ class Process(object):
             self._run_async(new_wps_request, new_wps_response)
             dblog.remove_stored(uuid)
 
-
         return wps_response
 
     def clean(self):
         """Clean the process working dir and other temporary files
         """
         LOGGER.info("Removing temporary working directory: %s" % self.workdir)
-        if os.path.isdir(self.workdir):
-            shutil.rmtree(self.workdir)
-        if self._grass_mapset and os.path.isdir(self._grass_mapset):
-            LOGGER.info("Removing temporary GRASS GIS mapset: %s" % self._grass_mapset)
-            shutil.rmtree(self._grass_mapset)
+        try:
+            if os.path.isdir(self.workdir):
+                shutil.rmtree(self.workdir)
+            if self._grass_mapset and os.path.isdir(self._grass_mapset):
+                LOGGER.info("Removing temporary GRASS GIS mapset: %s" % self._grass_mapset)
+                shutil.rmtree(self._grass_mapset)
+        except WindowsError as err:
+                LOGGER.error('Windows Error: %s', err)
+        except Exception as err:
+                LOGGER.error('Unable to remove directory: %s', err)
 
     def set_workdir(self, workdir):
         """Set working dir for all inputs and outputs
@@ -328,20 +311,19 @@ class Process(object):
 
         if not PY2:
             LOGGER.warning('Seems PyWPS is running in Python-3 ' +
-                'environment, but GRASS GIS supports Python-2 only')
+                           'environment, but GRASS GIS supports Python-2 only')
             return
 
         if self.grass_location:
 
             from grass.script import core as grass
-            import grass.script.setup as gsetup
 
             dbase = ''
             location = ''
 
             # HOME needs to be set - and that is usually not the case for httpd
             # server
-            os.environ['HOME'] =  self.workdir
+            os.environ['HOME'] = self.workdir
 
             # GISRC envvariable needs to be set
             gisrc = open(os.path.join(self.workdir, 'GISRC'), 'w')
@@ -354,7 +336,7 @@ class Process(object):
             if self.grass_location.lower().startswith('epsg:'):
                 epsg = self.grass_location.lower().replace('epsg:', '')
                 dbase = self.workdir
-                os.environ['GISDBASE'] =  self.workdir
+                os.environ['GISDBASE'] = self.workdir
                 location = 'pywps_location'
                 grass.run_command('g.gisenv', set="GISDBASE=%s" % dbase)
                 grass.run_command('g.proj', flags="t", location=location, epsg=epsg)
@@ -368,19 +350,19 @@ class Process(object):
                 grass.run_command('g.gisenv', set="GISDBASE=%s" % dbase)
 
             else:
-                raise NoApplicableCode(
-                    'Location does exists or does not seem to be in "EPSG:XXXX" form nor is it existing directory: %s' % location)
+                raise NoApplicableCode('Location does exists or does not seem ' +
+                                       'to be in "EPSG:XXXX" form nor is it existing directory: %s' % location)
 
             # copy projection files from PERMAMENT mapset to temporary mapset
             mapset_name = tempfile.mkdtemp(prefix='pywps_', dir=os.path.join(dbase, location))
             shutil.copy(os.path.join(dbase, location, 'PERMANENT',
-                'DEFAULT_WIND'), os.path.join(mapset_name, 'WIND'))
+                        'DEFAULT_WIND'), os.path.join(mapset_name, 'WIND'))
             shutil.copy(os.path.join(dbase, location, 'PERMANENT',
-                'PROJ_EPSG'), os.path.join(mapset_name, 'PROJ_EPSG'))
+                        'PROJ_EPSG'), os.path.join(mapset_name, 'PROJ_EPSG'))
             shutil.copy(os.path.join(dbase, location, 'PERMANENT',
-                'PROJ_INFO'), os.path.join(mapset_name, 'PROJ_INFO'))
+                        'PROJ_INFO'), os.path.join(mapset_name, 'PROJ_INFO'))
             shutil.copy(os.path.join(dbase, location, 'PERMANENT',
-                'PROJ_UNITS'), os.path.join(mapset_name, 'PROJ_UNITS'))
+                        'PROJ_UNITS'), os.path.join(mapset_name, 'PROJ_UNITS'))
 
             # set _grass_mapset attribute - will be deleted once handler ends
             self._grass_mapset = mapset_name
@@ -390,7 +372,7 @@ class Process(object):
             grass.run_command('g.gisenv', set="LOCATION_NAME=%s" % location)
             grass.run_command('g.gisenv', set="MAPSET=%s" % os.path.basename(mapset_name))
 
-            LOGGER.debug(
-                'GRASS environment initialised with GISRC {}, GISBASE {}, GISDBASE {}, LOCATION {}, MAPSET {}'.format(
-                os.environ.get('GISRC'), os.environ.get('GISBASE'),
-                dbase, location, os.path.basename(mapset_name)))
+            LOGGER.debug('GRASS environment initialised')
+            LOGGER.debug('GISRC {}, GISBASE {}, GISDBASE {}, LOCATION {}, MAPSET {}'.format(
+                         os.environ.get('GISRC'), os.environ.get('GISBASE'),
+                         dbase, location, os.path.basename(mapset_name)))
diff --git a/pywps/app/Service.py b/pywps/app/Service.py
index d5e4a5b..c786c6f 100644
--- a/pywps/app/Service.py
+++ b/pywps/app/Service.py
@@ -1,9 +1,15 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 import logging
 import tempfile
-from werkzeug.exceptions import BadRequest, HTTPException
+from werkzeug.exceptions import HTTPException
 from werkzeug.wrappers import Request, Response
 from pywps import WPS, OWS
-from pywps.inout import Format
 from pywps._compat import PY2
 from pywps._compat import urlopen
 from pywps.app.basic import xml_response
@@ -18,9 +24,11 @@ from collections import deque
 import os
 import sys
 import uuid
+import copy
 
 LOGGER = logging.getLogger("PYWPS")
 
+
 class Service(object):
 
     """ The top-level object that represents a WPS service. It's a WSGI
@@ -38,16 +46,15 @@ class Service(object):
         if cfgfiles:
             config.load_configuration(cfgfiles)
 
-        if config.get_config_value('server', 'logfile') and config.get_config_value('server', 'loglevel'):
-            LOGGER.setLevel(getattr(logging, config.get_config_value('server', 'loglevel')))
-            msg_fmt = '%(asctime)s] [%(levelname)s] file=%(pathname)s line=%(lineno)s module=%(module)s function=%(funcName)s %(message)s'
-            fh = logging.FileHandler(config.get_config_value('server', 'logfile'))
+        if config.get_config_value('logging', 'file') and config.get_config_value('logging', 'level'):
+            LOGGER.setLevel(getattr(logging, config.get_config_value('logging', 'level')))
+            msg_fmt = '%(asctime)s] [%(levelname)s] file=%(pathname)s line=%(lineno)s module=%(module)s function=%(funcName)s %(message)s'  # noqa
+            fh = logging.FileHandler(config.get_config_value('logging', 'file'))
             fh.setFormatter(logging.Formatter(msg_fmt))
             LOGGER.addHandler(fh)
         else:  # NullHandler
             LOGGER.addHandler(logging.NullHandler())
 
-
     def get_capabilities(self):
         process_elements = [p.capabilities_xml()
                             for p in self.processes.values()]
@@ -57,8 +64,8 @@ class Service(object):
         doc.attrib['service'] = 'WPS'
         doc.attrib['version'] = '1.0.0'
         doc.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = 'en-US'
-        doc.attrib[
-            '{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = 'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsGetCapabilities_response.xsd'
+        doc.attrib['{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = \
+            'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsGetCapabilities_response.xsd'
         # TODO: check Table 7 in OGC 05-007r7
         doc.attrib['updateSequence'] = '1'
 
@@ -183,17 +190,15 @@ class Service(object):
 
         doc.append(service_prov_doc)
 
+        server_href = {'{http://www.w3.org/1999/xlink}href': config.get_config_value('server', 'url')}
+
         # Operations Metadata
         operations_metadata_doc = OWS.OperationsMetadata(
             OWS.Operation(
                 OWS.DCP(
                     OWS.HTTP(
-                        OWS.Get({'{http://www.w3.org/1999/xlink}href':
-                            config.get_config_value('server', 'url')
-                        }),
-                        OWS.Post({'{http://www.w3.org/1999/xlink}href':
-                            config.get_config_value('server', 'url'),
-                        })
+                        OWS.Get(server_href),
+                        OWS.Post(server_href)
                     )
                 ),
                 name="GetCapabilities"
@@ -201,12 +206,8 @@ class Service(object):
             OWS.Operation(
                 OWS.DCP(
                     OWS.HTTP(
-                        OWS.Get({'{http://www.w3.org/1999/xlink}href':
-                            config.get_config_value('server', 'url'),
-                        }),
-                        OWS.Post({'{http://www.w3.org/1999/xlink}href':
-                            config.get_config_value('server', 'url'),
-                        })
+                        OWS.Get(server_href),
+                        OWS.Post(server_href)
                     )
                 ),
                 name="DescribeProcess"
@@ -214,12 +215,8 @@ class Service(object):
             OWS.Operation(
                 OWS.DCP(
                     OWS.HTTP(
-                        OWS.Get({'{http://www.w3.org/1999/xlink}href':
-                            config.get_config_value('server', 'url'),
-                        }),
-                        OWS.Post({'{http://www.w3.org/1999/xlink}href':
-                            config.get_config_value('server', 'url'),
-                        })
+                        OWS.Get(server_href),
+                        OWS.Post(server_href)
                     )
                 ),
                 name="Execute"
@@ -273,8 +270,8 @@ class Service(object):
         doc = WPS.ProcessDescriptions(
             *identifier_elements
         )
-        doc.attrib[
-            '{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = 'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsDescribeProcess_response.xsd'
+        doc.attrib['{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = \
+            'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsDescribeProcess_response.xsd'
         doc.attrib['service'] = 'WPS'
         doc.attrib['version'] = '1.0.0'
         doc.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = 'en-US'
@@ -292,8 +289,12 @@ class Service(object):
         try:
             process = self.processes[identifier]
 
-            workdir = os.path.abspath(
-                    config.get_config_value('server', 'workdir'))
+            # make deep copy of the process instace
+            # so that processes are not overriding each other
+            # just for execute
+            process = copy.deepcopy(process)
+
+            workdir = os.path.abspath(config.get_config_value('server', 'workdir'))
             tempdir = tempfile.mkdtemp(prefix='pywps_process_', dir=workdir)
             process.set_workdir(tempdir)
         except KeyError:
@@ -325,21 +326,22 @@ class Service(object):
                     raise MissingParameterValue(
                         inpt.identifier, inpt.identifier)
                 else:
-                    inputs = deque(maxlen=inpt.max_occurs)
-                    inputs.append(inpt.clone())
-                    data_inputs[inpt.identifier] = inputs
-
-            # Replace the dicts with the dict of Literal/Complex inputs
-            # set the input to the type defined in the process
-            if isinstance(inpt, ComplexInput):
-                data_inputs[inpt.identifier] = self.create_complex_inputs(
-                    inpt, wps_request.inputs[inpt.identifier])
-            elif isinstance(inpt, LiteralInput):
-                data_inputs[inpt.identifier] = self.create_literal_inputs(
-                    inpt, wps_request.inputs[inpt.identifier])
-            elif isinstance(inpt, BoundingBoxInput):
-                data_inputs[inpt.identifier] = self.create_bbox_inputs(
-                    inpt, wps_request.inputs[inpt.identifier])
+                    # inputs = deque(maxlen=inpt.max_occurs)
+                    # inputs.append(inpt.clone())
+                    # data_inputs[inpt.identifier] = inputs
+                    pass
+            else:
+                # Replace the dicts with the dict of Literal/Complex inputs
+                # set the input to the type defined in the process.
+                if isinstance(inpt, ComplexInput):
+                    data_inputs[inpt.identifier] = self.create_complex_inputs(
+                        inpt, wps_request.inputs[inpt.identifier])
+                elif isinstance(inpt, LiteralInput):
+                    data_inputs[inpt.identifier] = self.create_literal_inputs(
+                        inpt, wps_request.inputs[inpt.identifier])
+                elif isinstance(inpt, BoundingBoxInput):
+                    data_inputs[inpt.identifier] = self.create_bbox_inputs(
+                        inpt, wps_request.inputs[inpt.identifier])
 
         wps_request.inputs = data_inputs
 
@@ -393,12 +395,9 @@ class Service(object):
 
         def href_handler(complexinput, datain):
             """<wps:Reference /> handler"""
-            tmp_dir = config.get_config_value('server', 'workdir')
-
             # save the reference input in workdir
             tmp_file = tempfile.mkstemp(dir=complexinput.workdir)[1]
 
-
             try:
                 (reference_file, reference_file_data) = _openurl(datain)
                 data_size = reference_file.headers.get('Content-Length', 0)
@@ -529,11 +528,10 @@ class Service(object):
 
             python_path = os.path.join(gisbase, 'etc', 'python')
             os.environ['PYTHONPATH'] = '{}:{}'.format(os.environ.get('PYTHONPATH'),
-                    python_path)
+                                                      python_path)
             os.putenv('PYTHONPATH', os.environ.get('PYTHONPATH'))
             sys.path.insert(0, python_path)
 
-
     def create_bbox_inputs(self, source, inputs):
         """ Takes the http_request and parses the input to objects
         :return collections.deque:
@@ -560,7 +558,7 @@ class Service(object):
         request_uuid = uuid.uuid1()
 
         environ_cfg = http_request.environ.get('PYWPS_CFG')
-        if not 'PYWPS_CFG' in os.environ and environ_cfg:
+        if 'PYWPS_CFG' not in os.environ and environ_cfg:
             LOGGER.debug('Setting PYWPS_CFG to %s', environ_cfg)
             os.environ['PYWPS_CFG'] = environ_cfg
 
@@ -600,7 +598,10 @@ class Service(object):
                 message = e.locator
                 status = e.code
                 status_percentage = 100
-            update_response(request_uuid, FakeResponse, close=True)
+            try:
+                update_response(request_uuid, FakeResponse, close=True)
+            except NoApplicableCode as e:
+                return e
             return e
 
 
@@ -613,16 +614,15 @@ def _openurl(inpt):
 
     LOGGER.debug('Fetching URL %s', href)
     if inpt.get('method') == 'POST':
-        if inpt.has_key('body'):
+        if 'body' in inpt:
             data = inpt.get('body')
-        elif inpt.has_key('bodyreference'):
+        elif 'bodyreference' in inpt:
             data = urlopen(url=inpt.get('bodyreference')).read()
 
         reference_file = urlopen(url=href, data=data)
     else:
         reference_file = urlopen(url=href)
 
-
     if PY2:
         reference_file_data = reference_file.read()
     else:
diff --git a/pywps/app/WPSRequest.py b/pywps/app/WPSRequest.py
index 8da6deb..6530edf 100644
--- a/pywps/app/WPSRequest.py
+++ b/pywps/app/WPSRequest.py
@@ -1,3 +1,11 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
+import logging
 import lxml
 import lxml.etree
 from werkzeug.exceptions import MethodNotAllowed
@@ -9,8 +17,6 @@ from pywps.inout.basic import LiteralInput, ComplexInput, BBoxInput
 from pywps.exceptions import NoApplicableCode, OperationNotSupported, MissingParameterValue, VersionNegotiationFailed, \
     InvalidParameterValue, FileSizeExceeded
 from pywps import configuration
-from pywps._compat import PY2
-from pywps.validator.base import emptyvalidator
 from pywps.validator.mode import MODE
 from pywps.inout.literaltypes import AnyValue, NoValue, ValuesReference, AllowedValue
 
@@ -18,6 +24,8 @@ from pywps.inout.formats import Format
 
 import json
 
+LOGGER = logging.getLogger("PYWPS")
+
 
 class WPSRequest(object):
 
@@ -379,28 +387,28 @@ class WPSRequest(object):
                             ))
 
                     inpt = LiteralInput(
-                        identifier = inpt_def['identifier'],
-                        title = inpt_def.get('title'),
-                        abstract = inpt_def.get('abstract'),
-                        data_type = inpt_def.get('data_type'),
-                        workdir = inpt_def.get('workdir'),
-                        allowed_values = AnyValue,
-                        uoms = inpt_def.get('uoms'),
-                        mode = inpt_def.get('mode')
+                        identifier=inpt_def['identifier'],
+                        title=inpt_def.get('title'),
+                        abstract=inpt_def.get('abstract'),
+                        data_type=inpt_def.get('data_type'),
+                        workdir=inpt_def.get('workdir'),
+                        allowed_values=AnyValue,
+                        uoms=inpt_def.get('uoms'),
+                        mode=inpt_def.get('mode')
                     )
                     inpt.uom = inpt_def.get('uom')
                     inpt.data = inpt_def.get('data')
 
                 elif inpt_def['type'] == 'bbox':
                     inpt = BBoxInput(
-                         identifier = inpt_def['identifier'],
-                         title = inpt_def['title'],
-                         abstract = inpt_def['abstract'],
-                         crss = inpt_def['crs'],
-                         dimensions = inpt_def['dimensions'],
-                         workdir = inpt_def['workdir'],
-                         mode = inpt_def['mode']
-                     )
+                        identifier=inpt_def['identifier'],
+                        title=inpt_def['title'],
+                        abstract=inpt_def['abstract'],
+                        crss=inpt_def['crs'],
+                        dimensions=inpt_def['dimensions'],
+                        workdir=inpt_def['workdir'],
+                        mode=inpt_def['mode']
+                    )
                     inpt.ll = inpt_def['bbox'][0]
                     inpt.ur = inpt_def['bbox'][1]
 
@@ -409,6 +417,7 @@ class WPSRequest(object):
             else:
                 self.inputs[identifier] = [inpt]
 
+
 def get_inputs_from_xml(doc):
     the_inputs = {}
     for input_el in xpath_ns(doc, '/wps:Execute/wps:DataInputs/wps:Input'):
@@ -548,6 +557,7 @@ def get_data_from_kvp(data, part=None):
             else:
                 the_data[identifier] = io
         except Exception as e:
+            LOGGER.warning(e)
             the_data[d] = {'identifier': d, 'data': ''}
 
     return the_data
@@ -590,7 +600,7 @@ def _get_dataelement_value(value_el):
 
     if isinstance(value_el, lxml.etree._Element):
         if PY2:
-            return lxml.etree.tostring(value_el, encoding=unicode)
+            return lxml.etree.tostring(value_el, encoding=unicode)  # noqa
         else:
             return lxml.etree.tostring(value_el, encoding=str)
     else:
diff --git a/pywps/app/WPSResponse.py b/pywps/app/WPSResponse.py
index 5755a53..2180c1c 100644
--- a/pywps/app/WPSResponse.py
+++ b/pywps/app/WPSResponse.py
@@ -1,3 +1,10 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 import os
 from lxml import etree
 import time
@@ -10,10 +17,11 @@ import pywps.configuration as config
 from pywps.dblog import update_response
 from collections import namedtuple
 
-_STATUS = namedtuple('Status', 'NO_STATUS, STORE_STATUS,'
-        'STORE_AND_UPDATE_STATUS, DONE_STATUS')
+_STATUS = namedtuple('Status', 'ERROR_STATUS, NO_STATUS, STORE_STATUS,'
+                     'STORE_AND_UPDATE_STATUS, DONE_STATUS')
+
+STATUS = _STATUS(0, 10, 20, 30, 40)
 
-STATUS = _STATUS(0, 1, 2, 3)
 
 class WPSResponse(object):
 
@@ -35,7 +43,7 @@ class WPSResponse(object):
         self.uuid = uuid
 
     def update_status(self, message=None, status_percentage=None, status=None,
-            clean=True):
+                      clean=True):
         """
         Update status report of currently running process instance
 
@@ -124,7 +132,8 @@ class WPSResponse(object):
 
     def _construct_doc(self):
         doc = WPS.ExecuteResponse()
-        doc.attrib['{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = 'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsExecute_response.xsd'
+        doc.attrib['{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] = \
+            'http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsExecute_response.xsd'
         doc.attrib['service'] = 'WPS'
         doc.attrib['version'] = '1.0.0'
         doc.attrib['{http://www.w3.org/XML/1998/namespace}lang'] = 'en-US'
@@ -145,7 +154,7 @@ class WPSResponse(object):
         if self.process.abstract:
             process_doc.append(OWS.Abstract(self.process.abstract))
         # TODO: See Table 32 Metadata in OGC 06-121r3
-        #for m in self.process.metadata:
+        # for m in self.process.metadata:
         #    process_doc.append(OWS.Metadata(m))
         if self.process.profile:
             process_doc.append(OWS.Profile(self.process.profile))
@@ -155,14 +164,13 @@ class WPSResponse(object):
 
         # Status XML
         # return the correct response depending on the progress of the process
-        if self.status >= STATUS.STORE_AND_UPDATE_STATUS:
+        if self.status == STATUS.STORE_AND_UPDATE_STATUS:
             if self.status_percentage == 0:
                 self.message = 'PyWPS Process %s accepted' % self.process.identifier
                 status_doc = self._process_accepted()
                 doc.append(status_doc)
-                #self.write_response_doc(doc)
                 return doc
-            elif 0 < self.status_percentage < 100:
+            elif self.status_percentage > 0:
                 status_doc = self._process_started()
                 doc.append(status_doc)
                 return doc
@@ -175,20 +183,21 @@ class WPSResponse(object):
 
         # TODO: add paused status
 
-        status_doc = self._process_succeeded()
-        doc.append(status_doc)
+        if self.status == STATUS.DONE_STATUS:
+            status_doc = self._process_succeeded()
+            doc.append(status_doc)
 
-        # DataInputs and DataOutputs definition XML if lineage=true
-        if self.wps_request.lineage == 'true':
-            data_inputs = [self.wps_request.inputs[i][0].execute_xml() for i in self.wps_request.inputs]
-            doc.append(WPS.DataInputs(*data_inputs))
+            # DataInputs and DataOutputs definition XML if lineage=true
+            if self.wps_request.lineage == 'true':
+                data_inputs = [self.wps_request.inputs[i][0].execute_xml() for i in self.wps_request.inputs]
+                doc.append(WPS.DataInputs(*data_inputs))
 
-            output_definitions = [self.outputs[o].execute_xml_lineage() for o in self.outputs]
-            doc.append(WPS.OutputDefinitions(*output_definitions))
+                output_definitions = [self.outputs[o].execute_xml_lineage() for o in self.outputs]
+                doc.append(WPS.OutputDefinitions(*output_definitions))
 
-        # Process outputs XML
-        output_elements = [self.outputs[o].execute_xml() for o in self.outputs]
-        doc.append(WPS.ProcessOutputs(*output_elements))
+            # Process outputs XML
+            output_elements = [self.outputs[o].execute_xml() for o in self.outputs]
+            doc.append(WPS.ProcessOutputs(*output_elements))
         return doc
 
     def call_on_close(self, function):
diff --git a/pywps/app/__init__.py b/pywps/app/__init__.py
index b828b35..fb0f8f4 100644
--- a/pywps/app/__init__.py
+++ b/pywps/app/__init__.py
@@ -1,6 +1,13 @@
-from pywps.app.Process import Process
-from pywps.app.Service import Service
-from pywps.app.WPSResponse import WPSResponse
-from pywps.app.WPSRequest import WPSRequest
-from pywps.app.WPSRequest import get_inputs_from_xml
-from pywps.app.WPSRequest import get_output_from_xml
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
+from pywps.app.Process import Process  # noqa: F401
+from pywps.app.Service import Service  # noqa: F401
+from pywps.app.WPSResponse import WPSResponse  # noqa: F401
+from pywps.app.WPSRequest import WPSRequest  # noqa: F401
+from pywps.app.WPSRequest import get_inputs_from_xml  # noqa: F401
+from pywps.app.WPSRequest import get_output_from_xml  # noqa: F401
diff --git a/pywps/app/basic.py b/pywps/app/basic.py
index d998bed..837ed32 100644
--- a/pywps/app/basic.py
+++ b/pywps/app/basic.py
@@ -1,10 +1,18 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 import logging
 import lxml
 from werkzeug.wrappers import Response
-from pywps import __version__, OWS, NAMESPACES, OGCUNIT
+from pywps import __version__, NAMESPACES
 
 LOGGER = logging.getLogger('PYWPS')
 
+
 def xpath_ns(el, path):
     return el.xpath(path, namespaces=NAMESPACES)
 
@@ -17,5 +25,5 @@ def xml_response(doc):
     xml = lxml.etree.tostring(doc, pretty_print=True)
     response = Response(pywps_version_comment.encode('utf8') + xml,
                         content_type='text/xml')
-    response.status_percentage = 100;
+    response.status_percentage = 100
     return response
diff --git a/pywps/configuration.py b/pywps/configuration.py
index 898cead..8c11521 100755
--- a/pywps/configuration.py
+++ b/pywps/configuration.py
@@ -1,30 +1,12 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """
 Reads the PyWPS configuration file
 """
-# Author:    Calin Ciociu
-#            
-# License:
-#
-# Web Processing Service implementation
-# Copyright (C) 2015 PyWPS Development Team, represented by Jachym Cepicky
-#
-# 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 sys
@@ -38,6 +20,8 @@ if PY2:
 else:
     import configparser
 
+__author__ = "Calin Ciociu"
+
 
 CONFIG = None
 LOGGER = logging.getLogger("PYWPS")
@@ -100,15 +84,18 @@ def load_configuration(cfgfiles=None):
     outputpath = tempfile.gettempdir()
     CONFIG.set('server', 'outputurl', 'file:///%s' % outputpath)
     CONFIG.set('server', 'outputpath', outputpath)
-    CONFIG.set('server', 'logfile', '')
-    CONFIG.set('server', 'logdatabase', ':memory:')
-    CONFIG.set('server', 'loglevel', 'INFO')
-    CONFIG.set('server', 'workdir',  tempfile.gettempdir())
+    CONFIG.set('server', 'workdir', tempfile.gettempdir())
     CONFIG.set('server', 'parallelprocesses', '2')
 
+    CONFIG.add_section('logging')
+    CONFIG.set('logging', 'file', '')
+    CONFIG.set('logging', 'level', 'DEBUG')
+    CONFIG.set('logging', 'database', 'sqlite:///:memory:')
+    CONFIG.set('logging', 'prefix', 'pywps_')
+
     CONFIG.add_section('metadata:main')
     CONFIG.set('metadata:main', 'identification_title', 'PyWPS Processing Service')
-    CONFIG.set('metadata:main', 'identification_abstract', 'PyWPS is an implementation of the Web Processing Service standard from the Open Geospatial Consortium. PyWPS is written in Python.')
+    CONFIG.set('metadata:main', 'identification_abstract', 'PyWPS is an implementation of the Web Processing Service standard from the Open Geospatial Consortium. PyWPS is written in Python.')  # noqa
     CONFIG.set('metadata:main', 'identification_keywords', 'PyWPS,WPS,OGC,processing')
     CONFIG.set('metadata:main', 'identification_keywords_type', 'theme')
     CONFIG.set('metadata:main', 'identification_fees', 'NONE')
@@ -147,6 +134,7 @@ def load_configuration(cfgfiles=None):
 
     _check_config()
 
+
 def _check_config():
     """Check some configuration values
     """
@@ -158,17 +146,14 @@ def _check_config():
 
         if not os.path.isdir(confvalue):
             LOGGER.warning('server->%s configuration value %s is not directory'
-                    % (confid, confvalue))
+                           % (confid, confvalue))
 
         if not os.path.isabs(confvalue):
-            LOGGER.warning(
-                    'server->%s configuration value %s is not absolute path, making it absolute to %s' %\
-                        (confid, confvalue, os.path.abspath(confvalue)))
+            LOGGER.warning('server->%s configuration value %s is not absolute path, making it absolute to %s' %
+                           (confid, confvalue, os.path.abspath(confvalue)))
             CONFIG.set('server', confid, os.path.abspath(confvalue))
 
-
-    [checkdir(n) for n in  ['workdir', 'outputpath']]
-
+    [checkdir(n) for n in ['workdir', 'outputpath']]
 
 
 def _get_default_config_files_location():
@@ -210,13 +195,14 @@ def _get_default_config_files_location():
             homePath = os.getenv("HOME")
             if homePath:
                 cfgfiles = (os.path.join(pywps.__path__[0], "etc", "pywps.cfg"), "/etc/pywps.cfg",
-                    os.path.join(os.getenv("HOME"), ".pywps.cfg"))
+                            os.path.join(os.getenv("HOME"), ".pywps.cfg"))
             else:
                 cfgfiles = (os.path.join(pywps.__path__[0], "etc",
                             "pywps.cfg"), "/etc/pywps.cfg")
 
     return cfgfiles
 
+
 def get_size_mb(mbsize):
     """Get real size of given obeject
 
diff --git a/pywps/dblog.py b/pywps/dblog.py
index 04e355b..9fca683 100644
--- a/pywps/dblog.py
+++ b/pywps/dblog.py
@@ -1,3 +1,10 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 """
 Implementation of logging for PyWPS-4
 """
@@ -11,80 +18,105 @@ import pickle
 import json
 import os
 
+import sqlalchemy
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import Column, Integer, String, VARCHAR, Float, DateTime, BLOB
+from sqlalchemy.orm import sessionmaker
+
 LOGGER = logging.getLogger('PYWPS')
-_CONNECTION = None
-_DATABASE = None
+_SESSION_MAKER = None
+
+
+_tableprefix = configuration.get_config_value('logging', 'prefix')
+_schema = configuration.get_config_value('logging', 'schema')
+
+Base = declarative_base()
+
+
+class ProcessInstance(Base):
+    __tablename__ = '{}requests'.format(_tableprefix)
+
+    uuid = Column(VARCHAR(255), primary_key=True, nullable=False)
+    pid = Column(Integer, nullable=False)
+    operation = Column(VARCHAR(30), nullable=False)
+    version = Column(VARCHAR(5), nullable=False)
+    time_start = Column(DateTime(), nullable=False)
+    time_end = Column(DateTime(), nullable=True)
+    identifier = Column(VARCHAR(255), nullable=True)
+    message = Column(String, nullable=True)
+    percent_done = Column(Float, nullable=True)
+    status = Column(Integer, nullable=True)
+
+
+class RequestInstance(Base):
+    __tablename__ = '{}stored_requests'.format(_tableprefix)
+
+    uuid = Column(VARCHAR(255), primary_key=True, nullable=False)
+    request = Column(BLOB, nullable=False)
+
 
 def log_request(uuid, request):
     """Write OGC WPS request (only the necessary parts) to database logging
     system
     """
 
-    conn = get_connection()
-    insert = """
-        INSERT INTO
-            pywps_requests (uuid, pid, operation, version, time_start, identifier)
-        VALUES
-            (?, ?, ?, ?, ?, ?)
-    """
-
     pid = os.getpid()
     operation = request.operation
     version = request.version
-    time_start = datetime.datetime.now().isoformat()
+    time_start = datetime.datetime.now()
     identifier = _get_identifier(request)
 
-    #LOGGER.debug(str((insert, str(uuid), pid, operation, version, time_start, identifier)))
+    session = get_session()
+    request = ProcessInstance(
+        uuid=str(uuid), pid=pid, operation=operation, version=version,
+        time_start=time_start, identifier=identifier)
+
+    session.add(request)
+    session.commit()
+    session.close()
+    # NoApplicableCode("Could commit to database: {}".format(e.message))
 
-    cur = conn.cursor()
-    cur.execute(insert, (str(uuid), pid, operation, version, time_start, identifier))
-    conn.commit()
-    close_connection()
 
 def get_running():
     """Returns running processes ids
     """
 
-    conn = get_connection()
-    cur = conn.cursor()
-
-    res = cur.execute('SELECT uuid FROM pywps_requests WHERE percent_done < 100 and percent_done > -1')
+    session = get_session()
+    running = session.query(ProcessInstance).filter(
+        ProcessInstance.percent_done < 100).filter(
+            ProcessInstance.percent_done > -1)
 
-    return res.fetchall()
+    return running
 
 
 def get_stored():
     """Returns running processes ids
     """
 
-    conn = get_connection()
-    cur = conn.cursor()
+    session = get_session()
+    stored = session.query(RequestInstance)
 
-    res = cur.execute('SELECT uuid FROM pywps_stored_requests')
+    return stored
 
-    return res.fetchall()
 
 def get_first_stored():
     """Returns running processes ids
     """
 
-    conn = get_connection()
-    cur = conn.cursor()
-
-    res = cur.execute('SELECT uuid,  request FROM pywps_stored_requests LIMIT 1')
-
-    return res.fetchall()
+    session = get_session()
+    request = session.query(RequestInstance).first()
 
+    return request
 
 
 def update_response(uuid, response, close=False):
     """Writes response to database
     """
 
-    conn = get_connection()
-    message = 'Null'
-    status_percentage = 'Null'
-    status = 'Null'
+    session = get_session()
+    message = None
+    status_percentage = None
+    status = None
 
     if hasattr(response, 'message'):
         message = response.message
@@ -93,25 +125,20 @@ def update_response(uuid, response, close=False):
     if hasattr(response, 'status'):
         status = response.status
 
-    update = """
-        UPDATE
-            pywps_requests
-        SET
-            pid = ?,
-            time_end = ?, message=?,
-            percent_done = ?, status=?
-        WHERE
-            uuid = ?
-    """
-
-    pid = os.getpid()
-    time_end = datetime.datetime.now().isoformat()
+        if status == '200 OK':
+            status = 3
+        elif status == 400:
+            status = 0
 
-    #LOGGER.debug(update % (pid, time_end, message, status_percentage, status, uuid))
-    cur = conn.cursor()
-    cur.execute(update, (pid, time_end, message, status_percentage, status, str(uuid)))
-    conn.commit()
-    close_connection()
+    requests = session.query(ProcessInstance).filter_by(uuid=str(uuid))
+    if requests.count():
+        request = requests.one()
+        request.time_end = datetime.datetime.now()
+        request.message = message
+        request.percent_done = status_percentage
+        request.status = status
+        session.commit()
+        session.close()
 
 
 def _get_identifier(request):
@@ -124,171 +151,54 @@ def _get_identifier(request):
         if request.identifiers:
             return ','.join(request.identifiers)
         else:
-            return 'Null'
+            return None
     else:
-        return 'NULL'
+        return None
+
 
-def get_connection():
+def get_session():
     """Get Connection for database
     """
 
     LOGGER.debug('Initializing database connection')
-    global _CONNECTION
-    global _DATABASE
+    global _SESSION_MAKER
 
-    if _CONNECTION:
-        return _CONNECTION
+    database = configuration.get_config_value('logging', 'database')
+    echo = True
+    level = configuration.get_config_value('logging', 'level')
+    if level in ['INFO']:
+        echo = False
+    try:
+        engine = sqlalchemy.create_engine(database, echo=echo)
+    except sqlalchemy.exc.SQLAlchemyError as e:
+        raise NoApplicableCode("Could not connect to database: {}".format(e.message))
 
-    if not _DATABASE:
-        database = configuration.get_config_value('server', 'logdatabase')
+    Session = sessionmaker(bind=engine)
+    ProcessInstance.metadata.create_all(engine)
+    RequestInstance.metadata.create_all(engine)
 
-        if not database:
-            database = ':memory:'
-        elif database == ':memory:':
-            pass
-        else:
-            database = os.path.abspath(database)
+    _SESSION_MAKER = Session
 
-        _DATABASE = database
-    else:
-        database = _DATABASE
-
-    connection = sqlite3.connect(database, check_same_thread=False)
-    if check_db_table(connection):
-        if check_db_columns(connection):
-            _CONNECTION = connection
-        else:
-            raise NoApplicableCode("""
-                Columns in the table 'pywps_requests' or 'pywps_stored_requests' in database '%s' are in
-                conflict
-            """ % database)
-
-    else:
-        _CONNECTION = sqlite3.connect(database, check_same_thread=False)
-        cursor = _CONNECTION.cursor()
-        createsql = """
-            CREATE TABLE pywps_requests(
-                uuid VARCHAR(255) not null primary key,
-                pid INTEGER not null,
-                operation varchar(30) not null,
-                version varchar(5) not null,
-                time_start text not null,
-                time_end text,
-                identifier text,
-                message text,
-                percent_done float,
-                status varchar(30)
-            )
-        """
-        cursor.execute(createsql)
-
-        createsql = """
-            CREATE TABLE pywps_stored_requests(
-                uuid VARCHAR(255) not null primary key,
-                request BLOB not null
-            )
-            """
-        cursor.execute(createsql)
-        _CONNECTION.commit()
-
-    return _CONNECTION
-
-def check_db_table(connection):
-    """Check for existing pywps_requests table in the datase
-
-    :return: boolean pywps_requests table is in database
-    """
+    return _SESSION_MAKER()
 
-    cursor = connection.cursor()
-    cursor.execute("""
-        SELECT
-            name
-        FROM
-            sqlite_master
-        WHERE
-            name='pywps_requests'
-    """)
-    table = cursor.fetchone()
-    if table:
-        LOGGER.debug('pywps_requests table exists')
-        return True
-    else:
-        LOGGER.debug('pywps_requests table does not exist')
-        return False
-
-
-def check_db_columns(connection):
-    """Simple check for existing columns in given database
-
-    we will make just simple check, this is not django
-
-    :return: all needed columns found
-    :rtype: boolean
-    """
-
-    def _check_table(name, needed_columns):
-        cur = connection.cursor()
-        cur.execute("""PRAGMA table_info('%s')""" % name)
-        metas = cur.fetchall()
-        columns = []
-        for column in metas:
-            columns.append(column[1])
-
-        needed_columns.sort()
-        columns.sort()
-
-        if columns == needed_columns:
-            return True
-        else:
-            return False
-
-    name = 'pywps_requests'
-    needed_columns = ['uuid', 'pid', 'operation', 'version', 'time_start',
-                      'time_end', 'identifier', 'message', 'percent_done',
-                      'status']
-
-    pywps_requests = _check_table(name, needed_columns)
-    pywps_stored_requests = _check_table('pywps_stored_requests', ['uuid', 'request'])
-
-
-    return pywps_requests and pywps_stored_requests
-
-def close_connection():
-    """close connection"""
-    LOGGER.debug('Closing DB connection')
-    global _CONNECTION
-    if _CONNECTION:
-        _CONNECTION.close()
-    _CONNECTION = None
 
 def store_process(uuid, request):
     """Save given request under given UUID for later usage
     """
 
-    conn = get_connection()
-    insert = """
-        INSERT INTO
-            pywps_stored_requests (uuid, request)
-        VALUES
-            (?, ?)
-    """
+    session = get_session()
+    request = RequestInstance(uuid=str(uuid), request=request.json)
+    session.add(request)
+    session.commit()
+    session.close()
 
-    cur = conn.cursor()
-    cur.execute(insert, (str(uuid), request.json))
-    conn.commit()
-    close_connection()
 
 def remove_stored(uuid):
     """Remove given request from stored requests
     """
 
-    conn = get_connection()
-    insert = """
-        DELETE FROM
-            pywps_stored_requests
-        WHERE uuid = ?
-    """
-    cur = conn.cursor()
-    cur.execute(insert, (str(uuid)))
-    conn.commit()
-    close_connection()
+    session = get_session()
+    request = session.query(RequestInstance).filter_by(name='uuid').first()
+    session.delete(request)
+    session.commit()
+    session.close()
diff --git a/pywps/dependencies.py b/pywps/dependencies.py
index 22154e7..fc815a8 100644
--- a/pywps/dependencies.py
+++ b/pywps/dependencies.py
@@ -1,27 +1,9 @@
-###############################################################################
-#
-# Copyright (C) 2014-2016 PyWPS Development Team, represented by 
-# PyWPS Project Steering Committee
-#
-# 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.
-#
-###############################################################################
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 
 try:
     from osgeo import gdal, ogr
diff --git a/pywps/exceptions.py b/pywps/exceptions.py
index a9c9f87..ebf13a5 100644
--- a/pywps/exceptions.py
+++ b/pywps/exceptions.py
@@ -1,3 +1,9 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """
 OGC OWS and WPS Exceptions
 
@@ -5,43 +11,21 @@ Based on OGC OWS, WPS and
 
 http://lists.opengeospatial.org/pipermail/wps-dev/2013-October/000335.html
 """
-# Author:    Alex Morega & Calin Ciociu
-#            
-# License:
-#
-# Web Processing Service implementation
-# Copyright (C) 2015 PyWPS Development Team, represented by Jachym Cepicky
-#
-# 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 werkzeug.exceptions import HTTPException, BadRequest, MethodNotAllowed
+
+
+from werkzeug.exceptions import HTTPException
 from werkzeug._compat import text_type
 from werkzeug.utils import escape
-from werkzeug.http import HTTP_STATUS_CODES
 
 import logging
 
 from pywps import __version__
 
-#logging.basicConfig()
+__author__ = "Alex Morega & Calin Ciociu"
+
 LOGGER = logging.getLogger('PYWPS')
 
+
 class NoApplicableCode(HTTPException):
     """No applicable code exception implementation
 
@@ -83,17 +67,17 @@ class NoApplicableCode(HTTPException):
         return text_type((
             u'<?xml version="1.0" encoding="UTF-8"?>\n'
             u'<!-- PyWPS %(version)s -->\n'
-            u'<ows:ExceptionReport xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd" version="1.0.0">\n'
+            u'<ows:ExceptionReport xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd" version="1.0.0">\n'  # noqa
             u'  <ows:Exception exceptionCode="%(name)s" locator="%(locator)s" >\n'
             u'      %(description)s\n'
             u'  </ows:Exception>\n'
             u'</ows:ExceptionReport>'
         ) % {
             'version': __version__,
-            'code':         self.code,
-            'locator':         escape(self.locator),
-            'name':         escape(self.name),
-            'description':  self.get_description(environ)
+            'code': self.code,
+            'locator': escape(self.locator),
+            'name': escape(self.name),
+            'description': self.get_description(environ)
         })
 
 
@@ -132,11 +116,13 @@ class StorageNotSupported(NoApplicableCode):
     """
     code = 400
 
+
 class NotEnoughStorage(NoApplicableCode):
     """Storage not supported exception implementation
     """
     code = 400
 
+
 class ServerBusy(NoApplicableCode):
     """Max number of operations exceeded
     """
@@ -148,12 +134,13 @@ class ServerBusy(NoApplicableCode):
         """Get the XML body."""
         return text_type((
             u'<?xml version="1.0" encoding="UTF-8"?>\n'
-            u'<ows:ExceptionReport xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ows/1.1 ../../../ows/1.1.0/owsExceptionReport.xsd" version="1.0.0">'
+            u'<ows:ExceptionReport xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ows/1.1 ../../../ows/1.1.0/owsExceptionReport.xsd" version="1.0.0">'  # noqa
             u'<ows:Exception exceptionCode="%(name)s">'
             u'%(description)s'
             u'</ows:Exception>'
             u'</ows:ExceptionReport>'
         ) % {
-            'name':         escape(self.name),
-            'description':  self.get_description(environ)
-        })
+            'name': escape(self.name),
+            'description': self.get_description(environ)
+            }
+        )
diff --git a/pywps/inout/__init__.py b/pywps/inout/__init__.py
index 1197a4c..0164332 100644
--- a/pywps/inout/__init__.py
+++ b/pywps/inout/__init__.py
@@ -1,3 +1,10 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 from pywps.inout.inputs import LiteralInput, ComplexInput, BoundingBoxInput
 from pywps.inout.outputs import LiteralOutput, ComplexOutput, BoundingBoxOutput
 from pywps.inout.formats import Format, FORMATS, get_format
diff --git a/pywps/inout/basic.py b/pywps/inout/basic.py
index ef88557..92b7cd6 100644
--- a/pywps/inout/basic.py
+++ b/pywps/inout/basic.py
@@ -1,14 +1,21 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 from pywps._compat import text_type, StringIO
-import tempfile, os
-from pywps.inout.literaltypes import LITERAL_DATA_TYPES, convert,\
-    AnyValue, AllowedValue, make_allowedvalues, is_anyvalue
+import os
+import tempfile
+from pywps.inout.literaltypes import (LITERAL_DATA_TYPES, convert,
+                                      make_allowedvalues, is_anyvalue)
 from pywps import OWS, OGCUNIT, NAMESPACES
 from pywps.validator.mode import MODE
 from pywps.validator.base import emptyvalidator
 from pywps.validator import get_validator
-from pywps.validator.literalvalidator import validate_anyvalue,\
-    validate_allowed_values
-from pywps.validator.allowed_value import ALLOWEDVALUETYPE
+from pywps.validator.literalvalidator import (validate_anyvalue,
+                                              validate_allowed_values)
 from pywps.exceptions import InvalidParameterValue
 import base64
 from collections import namedtuple
@@ -16,11 +23,12 @@ from collections import namedtuple
 _SOURCE_TYPE = namedtuple('SOURCE_TYPE', 'MEMORY, FILE, STREAM, DATA')
 SOURCE_TYPE = _SOURCE_TYPE(0, 1, 2, 3)
 
+
 class IOHandler(object):
     """Basic IO class. Provides functions, to accept input data in file,
     memory object and stream object and give them out in all three types
 
-    >>> # setting up 
+    >>> # setting up
     >>> import os
     >>> from io import RawIOBase
     >>> from io import FileIO
@@ -74,6 +82,7 @@ class IOHandler(object):
         self.source = None
         self._tempfile = None
         self.workdir = workdir
+        self._stream = None
 
         self.valid_mode = mode
 
@@ -101,7 +110,6 @@ class IOHandler(object):
 
         self._workdir = workdirpath
 
-
     def set_memory_object(self, memory_object):
         """Set source as in memory object"""
         self.source_type = SOURCE_TYPE.MEMORY
@@ -130,9 +138,7 @@ class IOHandler(object):
         if self.source_type == SOURCE_TYPE.FILE:
             return self.source
 
-        elif self.source_type == SOURCE_TYPE.STREAM or\
-             self.source_type == SOURCE_TYPE.DATA:
-
+        elif self.source_type == SOURCE_TYPE.STREAM or self.source_type == SOURCE_TYPE.DATA:
             if self._tempfile:
                 return self._tempfile
             else:
@@ -155,13 +161,17 @@ class IOHandler(object):
 
     def get_memory_object(self):
         """Get source as memory object"""
-        raise Exception("setmemory_object not implemented, Soeren promissed to implement at WPS Workshop on 23rd of January 2014")
+        # TODO: Soeren promissed to implement at WPS Workshop on 23rd of January 2014
+        raise NotImplementedError("setmemory_object not implemented")
 
     def get_stream(self):
         """Get source as stream object"""
         if self.source_type == SOURCE_TYPE.FILE:
+            if self._stream and not self._stream.closed:
+                self._stream.close()
             from io import FileIO
-            return FileIO(self.source, mode='r', closefd=True)
+            self._stream = FileIO(self.source, mode='r', closefd=True)
+            return self._stream
         elif self.source_type == SOURCE_TYPE.STREAM:
             return self.source
         elif self.source_type == SOURCE_TYPE.DATA:
@@ -250,6 +260,7 @@ class BasicIO:
         self.title = title
         self.abstract = abstract
 
+
 class BasicLiteral:
     """Basic literal input/output class
     """
@@ -273,8 +284,6 @@ class BasicLiteral:
             # default/current uom
             self.uom = self.uoms[0]
 
-
-
     @property
     def uom(self):
         return self._uom
@@ -339,19 +348,17 @@ class BasicComplex(object):
     def data_format(self):
         return self._data_format
 
-
     @data_format.setter
     def data_format(self, data_format):
         """self data_format setter
         """
         if self._is_supported(data_format):
             self._data_format = data_format
-            if not data_format.validate or\
-                data_format.validate == emptyvalidator:
+            if not data_format.validate or data_format.validate == emptyvalidator:
                 data_format.validate = get_validator(data_format.mime_type)
         else:
             raise InvalidParameterValue("Requested format "
-                                        "%s, %s, %s not supported" %\
+                                        "%s, %s, %s not supported" %
                                         (data_format.mime_type,
                                          data_format.encoding,
                                          data_format.schema),
@@ -367,7 +374,6 @@ class BasicComplex(object):
         return False
 
 
-
 class BasicBoundingBox(object):
     """Basic BoundingBox input/output class
     """
@@ -379,6 +385,7 @@ class BasicBoundingBox(object):
         self.ll = []
         self.ur = []
 
+
 class LiteralInput(BasicIO, BasicLiteral, SimpleHandler):
     """LiteralInput input abstract class
     """
@@ -435,7 +442,7 @@ class LiteralOutput(BasicIO, BasicLiteral, SimpleHandler):
         BasicIO.__init__(self, identifier, title, abstract)
         BasicLiteral.__init__(self, data_type, uoms)
         SimpleHandler.__init__(self, workdir=None, data_type=data_type,
-                mode=mode)
+                               mode=mode)
 
         self._storage = None
 
@@ -454,12 +461,13 @@ class LiteralOutput(BasicIO, BasicLiteral, SimpleHandler):
 
         return validate_anyvalue
 
+
 class BBoxInput(BasicIO, BasicBoundingBox, IOHandler):
     """Basic Bounding box input abstract class
     """
 
     def __init__(self, identifier, title=None, abstract=None, crss=None,
-            dimensions=None, workdir=None, mode=MODE.NONE):
+                 dimensions=None, workdir=None, mode=MODE.NONE):
         BasicIO.__init__(self, identifier, title, abstract)
         BasicBoundingBox.__init__(self, crss, dimensions)
         IOHandler.__init__(self, workdir=None, mode=mode)
@@ -497,7 +505,7 @@ class BBoxOutput(BasicIO, BasicBoundingBox, SimpleHandler):
     """
 
     def __init__(self, identifier, title=None, abstract=None, crss=None,
-            dimensions=None, workdir=None, mode=MODE.NONE):
+                 dimensions=None, workdir=None, mode=MODE.NONE):
         BasicIO.__init__(self, identifier, title, abstract)
         BasicBoundingBox.__init__(self, crss, dimensions)
         SimpleHandler.__init__(self, workdir=None, mode=mode)
@@ -620,7 +628,6 @@ class UOM(object):
 
 if __name__ == "__main__":
     import doctest
-    import os
     from pywps.wpsserver import temp_dir
 
     with temp_dir() as tmp:
diff --git a/pywps/inout/formats/__init__.py b/pywps/inout/formats/__init__.py
index 4ecedef..4582528 100644
--- a/pywps/inout/formats/__init__.py
+++ b/pywps/inout/formats/__init__.py
@@ -1,12 +1,18 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
+"""List of know mimetypes"""
+
 # List of known complex data formats
-# you can use any other, but thise are widly known and supported by polular
+# you can use any other, but thise are widly known and supported by popular
 # software packages
 # based on Web Processing Service Best Practices Discussion Paper, OGC 12-029
 # http://opengeospatial.org/standards/wps
 
-"""List of known mimetypes
-"""
-
 from lxml.builder import ElementMaker
 from collections import namedtuple
 import mimetypes
@@ -18,11 +24,12 @@ _FORMAT = namedtuple('FormatDefintion', 'mime_type,'
 _FORMATS = namedtuple('FORMATS', 'GEOJSON, JSON, SHP, GML, GEOTIFF, WCS,'
                                  'WCS100, WCS110, WCS20, WFS, WFS100,'
                                  'WFS110, WFS20, WMS, WMS130, WMS110,'
-                                 'WMS100')
+                                 'WMS100,'
+                                 'TEXT, NETCDF')
 FORMATS = _FORMATS(
-    _FORMAT('application/vnd.geo+json', '.geojson',  None),
-    _FORMAT('application/json', '.json',  None),
-    _FORMAT('application/x-zipped-shp', '.zip',  None),
+    _FORMAT('application/vnd.geo+json', '.geojson', None),
+    _FORMAT('application/json', '.json', None),
+    _FORMAT('application/x-zipped-shp', '.zip', None),
     _FORMAT('application/gml+xml', '.gml', None),
     _FORMAT('image/tiff; subtype=geotiff', '.tiff', None),
     _FORMAT('application/xogc-wcs', '.xml', None),
@@ -36,15 +43,20 @@ FORMATS = _FORMATS(
     _FORMAT('application/x-ogc-wms', '.xml', None),
     _FORMAT('application/x-ogc-wms; version=1.3.0', '.xml', None),
     _FORMAT('application/x-ogc-wms; version=1.1.0', '.xml', None),
-    _FORMAT('application/x-ogc-wms; version=1.0.0', '.xml', None)
+    _FORMAT('application/x-ogc-wms; version=1.0.0', '.xml', None),
+    _FORMAT('text/plain', '.txt', None),
+    _FORMAT('application/x-netcdf', '.nc', None),
 )
 
+
 def _get_mimetypes():
     """Add FORMATS to system wide mimetypes
     """
     mimetypes.init()
     for pywps_format in FORMATS:
         mimetypes.add_type(pywps_format.mime_type, pywps_format.extension, True)
+
+
 _get_mimetypes()
 
 
@@ -78,7 +90,6 @@ class Format(object):
         self.validate = validate
         self.extension = extension
 
-
     @property
     def mime_type(self):
         """Get format mime type
@@ -133,13 +144,12 @@ class Format(object):
         """
         self._schema = schema
 
-
     def same_as(self, frmt):
         """Check input frmt, if it seems to be the same as self
         """
-        return frmt.mime_type == self.mime_type and\
-               frmt.encoding == self.encoding and\
-               frmt.schema == self.schema
+        return all([frmt.mime_type == self.mime_type,
+                    frmt.encoding == self.encoding,
+                    frmt.schema == self.schema])
 
     def describe_xml(self):
         """Return describe process response element
@@ -150,7 +160,6 @@ class Format(object):
             elmar.MimeType(self.mime_type)
         )
 
-
         if self.encoding:
             doc.append(elmar.Encoding(self.encoding))
 
@@ -193,7 +202,7 @@ def get_format(frmt, validator=None):
     if frmt in FORMATS._asdict():
         formatdef = FORMATS._asdict()[frmt]
         outfrmt = Format(**formatdef._asdict())
-        outfrmt.validate=validator
+        outfrmt.validate = validator
         return outfrmt
     else:
         return Format('None', validate=validator)
diff --git a/pywps/inout/inputs.py b/pywps/inout/inputs.py
index f55e16c..004c6a7 100644
--- a/pywps/inout/inputs.py
+++ b/pywps/inout/inputs.py
@@ -1,3 +1,10 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 from pywps import configuration, E, OWS, WPS, OGCTYPE, NAMESPACES
 from pywps.inout import basic
 from copy import deepcopy
@@ -15,14 +22,14 @@ class BoundingBoxInput(basic.BBoxInput):
     :param int dimensions: 2 or 3
     :param int min_occurs: how many times this input occurs
     :param int max_occurs: how many times this input occurs
+    :param metadata: List of metadata advertised by this process. They
+                     should be :class:`pywps.app.Common.Metadata` objects.
     """
 
     def __init__(self, identifier, title, crss, abstract='',
-                 dimensions=2, metadata=None, min_occurs=1,
+                 dimensions=2, metadata=[], min_occurs=1,
                  max_occurs=1,
                  mode=MODE.NONE):
-        if metadata is None:
-            metadata = []
         basic.BBoxInput.__init__(self, identifier, title=title,
                                  abstract=abstract, crss=crss,
                                  dimensions=dimensions, mode=mode)
@@ -47,8 +54,8 @@ class BoundingBoxInput(basic.BBoxInput):
         if self.abstract:
             doc.append(OWS.Abstract(self.abstract))
 
-        if self.metadata:
-            doc.append(OWS.Metadata(*self.metadata))
+        for m in self.metadata:
+            doc.append(OWS.Metadata(dict(m)))
 
         bbox_data_doc = E.BoundingBoxData()
         doc.append(bbox_data_doc)
@@ -117,8 +124,6 @@ class ComplexInput(basic.ComplexInput):
                  max_occurs=1, mode=MODE.NONE):
         """constructor"""
 
-        if metadata is None:
-            metadata = []
         basic.ComplexInput.__init__(self, identifier=identifier, title=title,
                                     abstract=abstract,
                                     supported_formats=supported_formats,
@@ -159,8 +164,8 @@ class ComplexInput(basic.ComplexInput):
         if self.abstract:
             doc.append(OWS.Abstract(self.abstract))
 
-        if self.metadata:
-            doc.append(OWS.Metadata(*self.metadata))
+        for m in self.metadata:
+            doc.append(OWS.Metadata(dict(m)))
 
         doc.append(
             E.ComplexData(
@@ -244,10 +249,12 @@ class LiteralInput(basic.LiteralInput):
     :param int max_occurs: maximum occurence
     :param pywps.validator.mode.MODE mode: validation mode (none to strict)
     :param pywps.inout.literaltypes.AnyValue allowed_values: or :py:class:`pywps.inout.literaltypes.AllowedValue` object
+    :param metadata: List of metadata advertised by this process. They
+                     should be :class:`pywps.app.Common.Metadata` objects.
     """
 
     def __init__(self, identifier, title, data_type='integer', abstract='',
-                 metadata=None, uoms=None, default=None,
+                 metadata=[], uoms=None, default=None,
                  min_occurs=1, max_occurs=1,
                  mode=MODE.SIMPLE, allowed_values=AnyValue):
         """Constructor
@@ -277,8 +284,8 @@ class LiteralInput(basic.LiteralInput):
         if self.abstract:
             doc.append(OWS.Abstract(self.abstract))
 
-        if self.metadata:
-            doc.append(OWS.Metadata(*self.metadata))
+        for m in self.metadata:
+            doc.append(OWS.Metadata(dict(m)))
 
         literal_data_doc = E.LiteralData()
 
@@ -308,7 +315,7 @@ class LiteralInput(basic.LiteralInput):
             literal_data_doc.append(self._describe_xml_allowedvalues())
 
         if self.default:
-            doc.append(E.DefaultValue(self.default))
+            literal_data_doc.append(E.DefaultValue(self.default))
 
         return doc
 
diff --git a/pywps/inout/literaltypes.py b/pywps/inout/literaltypes.py
index b27a213..5e8c9e3 100644
--- a/pywps/inout/literaltypes.py
+++ b/pywps/inout/literaltypes.py
@@ -1,16 +1,28 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """Literaltypes are used for LiteralInputs, to make sure, input data are OK
 """
 
 from pywps._compat import urlparse
 import time
+from dateutil.parser import parse as date_parser
+import datetime
 from pywps.exceptions import InvalidParameterValue
 from pywps.validator.allowed_value import RANGECLOSURETYPE
 from pywps.validator.allowed_value import ALLOWEDVALUETYPE
 from pywps._compat import PY2
-from pywps import OWS, WPS, OGCTYPE, NAMESPACES
+from pywps import OWS, NAMESPACES
+
+import logging
+LOGGER = logging.getLogger('PYWPS')
 
 LITERAL_DATA_TYPES = ('float', 'boolean', 'integer', 'string',
-                      'positiveInteger', 'anyURI', 'time', 'scale', 'angle',
+                      'positiveInteger', 'anyURI', 'time', 'date', 'dateTime',
+                      'scale', 'angle',
                       'nonNegativeInteger')
 
 # currently we are supporting just ^^^ data types, feel free to add support for
@@ -32,6 +44,7 @@ class AnyValue(object):
     def json(self):
         return {'type': 'anyvalue'}
 
+
 class NoValue(object):
     """No value allowed
     NOTE: not really implemented
@@ -41,6 +54,7 @@ class NoValue(object):
     def json(self):
         return {'type': 'novalue'}
 
+
 class ValuesReference(object):
     """Any value for literal input
     NOTE: not really implemented
@@ -50,6 +64,7 @@ class ValuesReference(object):
     def json(self):
         return {'type': 'valuesreference'}
 
+
 class AllowedValue(AnyValue):
     """Allowed value parameters
     the values are evaluated in literal validator functions
@@ -83,7 +98,7 @@ class AllowedValue(AnyValue):
             doc = OWS.Value(str(self.value))
         else:
             doc = OWS.Range()
-            doc.set('{%s}rangeClosure' % NAMESPACES['ows'],  self.range_closure)
+            doc.set('{%s}rangeClosure' % NAMESPACES['ows'], self.range_closure)
             doc.append(OWS.MinimumValue(str(self.minval)))
             doc.append(OWS.MaximumValue(str(self.maxval)))
             if self.spacing:
@@ -105,6 +120,7 @@ class AllowedValue(AnyValue):
             'range_closure': self.range_closure
         }
 
+
 def get_converter(convertor):
     """function for decoration of convert
     """
@@ -126,6 +142,10 @@ def get_converter(convertor):
                 convert = convert_anyURI
             elif data_type == 'time':
                 convert = convert_time
+            elif data_type == 'date':
+                convert = convert_date
+            elif data_type == 'dateTime':
+                convert = convert_datetime
             elif data_type == 'scale':
                 convert = convert_scale
             elif data_type == 'angle':
@@ -143,7 +163,6 @@ def get_converter(convertor):
                 "Could not convert value '{}' to format '{}'".format(
                     data, data_type))
 
-
     return decorator_selector
 
 
@@ -184,6 +203,7 @@ def convert_boolean(inpt):
             val = True
     return val
 
+
 def convert_float(inpt):
     """Return float value from inpt
 
@@ -193,6 +213,7 @@ def convert_float(inpt):
 
     return float(inpt)
 
+
 def convert_integer(inpt):
     """Return integer value from input inpt
 
@@ -202,6 +223,7 @@ def convert_integer(inpt):
 
     return int(float(inpt))
 
+
 def convert_string(inpt):
     """Return string value from input lit_input
 
@@ -214,6 +236,7 @@ def convert_string(inpt):
     else:
         return str(inpt)
 
+
 def convert_positiveInteger(inpt):
     """Return value of input"""
 
@@ -224,10 +247,11 @@ def convert_positiveInteger(inpt):
     else:
         return inpt
 
+
 def convert_anyURI(inpt):
     """Return value of input
-    
-    :rtype: url components 
+
+    :rtype: url components
     """
     inpt = convert_string(inpt)
     components = urlparse.urlparse(inpt)
@@ -238,23 +262,65 @@ def convert_anyURI(inpt):
         raise InvalidParameterValue(
             'The value "{}" does not seem to be of type anyURI'.format(inpt))
 
+
 def convert_time(inpt):
     """Return value of input
-    time formating assumed according to ISO standard
+    time formating assumed according to ISO standard:
+
+    https://www.w3.org/TR/xmlschema-2/#time
 
-    http://www.w3.org/TR/NOTE-datetime
+    Examples: 12:00:00
 
-    :rtype: time object
+    :rtype: datetime.time object
     """
-    time_format = '%Y-%m-%dT%H:%M:%S%z'
-    inpt = time.strptime(convert_string(inpt), time_format)
+    if not isinstance(inpt, datetime.time):
+        inpt = convert_datetime(inpt).time()
     return inpt
 
+
+def convert_date(inpt):
+    """Return value of input
+    date formating assumed according to ISO standard:
+
+    https://www.w3.org/TR/xmlschema-2/#date
+
+    Examples: 2016-09-20
+
+    :rtype: datetime.date object
+    """
+    if not isinstance(inpt, datetime.date):
+        inpt = convert_datetime(inpt).date()
+    return inpt
+
+
+def convert_datetime(inpt):
+    """Return value of input
+    dateTime formating assumed according to ISO standard:
+
+    * http://www.w3.org/TR/NOTE-datetime
+    * https://www.w3.org/TR/xmlschema-2/#dateTime
+
+    Examples: 2016-09-20T12:00:00, 2012-12-31T06:30:00Z,
+              2017-01-01T18:00:00+01:00
+
+    :rtype: datetime.datetime object
+    """
+    # TODO: %z directive works only with python 3
+    # time_format = '%Y-%m-%dT%H:%M:%S%z'
+    # time_format = '%Y-%m-%dT%H:%M:%S%Z'
+    # inpt = time.strptime(convert_string(inpt), time_format)
+    if not isinstance(inpt, datetime.datetime):
+        inpt = convert_string(inpt)
+        inpt = date_parser(inpt)
+    return inpt
+
+
 def convert_scale(inpt):
     """Return value of input"""
 
     return convert_float(inpt)
 
+
 def convert_angle(inpt):
     """Return value of input
 
@@ -262,7 +328,7 @@ def convert_angle(inpt):
     """
 
     inpt = convert_float(inpt)
-    return inpt%360
+    return inpt % 360
 
 
 def make_allowedvalues(allowed_values):
@@ -278,8 +344,7 @@ def make_allowedvalues(allowed_values):
         if isinstance(value, AllowedValue):
             new_allowedvalues.append(value)
 
-        elif type(value) == tuple or\
-           type(value) == list:
+        elif type(value) == tuple or type(value) == list:
             minval = maxval = spacing = None
             if len(value) == 2:
                 minval = value[0]
@@ -308,7 +373,7 @@ def is_anyvalue(value):
 
     if value == AnyValue:
         is_av = True
-    elif value == None:
+    elif value is None:
         is_av = True
     elif isinstance(value, AnyValue):
         is_av = True
diff --git a/pywps/inout/outputs.py b/pywps/inout/outputs.py
index 08a9dc4..c6a5e90 100644
--- a/pywps/inout/outputs.py
+++ b/pywps/inout/outputs.py
@@ -1,3 +1,10 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 from pywps._compat import text_type
 from pywps import E, WPS, OWS, OGCTYPE, NAMESPACES
 from pywps.inout import basic
@@ -5,6 +12,7 @@ from pywps.inout.storage import FileStorage
 from pywps.inout.formats import Format
 from pywps.validator.mode import MODE
 import lxml.etree as etree
+import six
 
 
 class BoundingBoxOutput(basic.BBoxInput):
@@ -17,14 +25,14 @@ class BoundingBoxOutput(basic.BBoxInput):
     :param int min_occurs: minimum occurence
     :param int max_occurs: maximum occurence
     :param pywps.validator.mode.MODE mode: validation mode (none to strict)
+    :param metadata: List of metadata advertised by this process. They
+                     should be :class:`pywps.app.Common.Metadata` objects.
     """
 
     def __init__(self, identifier, title, crss, abstract='',
-                 dimensions=2, metadata=None, min_occurs='1',
+                 dimensions=2, metadata=[], min_occurs='1',
                  max_occurs='1', as_reference=False,
                  mode=MODE.NONE):
-        if metadata is None:
-            metadata = []
         basic.BBoxInput.__init__(self, identifier, title=title,
                                  abstract=abstract, crss=crss,
                                  dimensions=dimensions, mode=mode)
@@ -43,8 +51,8 @@ class BoundingBoxOutput(basic.BBoxInput):
         if self.abstract:
             doc.append(OWS.Abstract(self.abstract))
 
-        if self.metadata:
-            doc.append(OWS.Metadata(*self.metadata))
+        for m in self.metadata:
+            doc.append(OWS.Metadata(dict(m)))
 
         bbox_data_doc = E.BoundingBoxOutput()
         doc.append(bbox_data_doc)
@@ -91,10 +99,13 @@ class ComplexOutput(basic.ComplexOutput):
         formats. The first format in the list will be used as the default.
     :param str abstract: Description of the output
     :param pywps.validator.mode.MODE mode: validation mode (none to strict)
+    :param metadata: List of metadata advertised by this process. They
+                     should be :class:`pywps.app.Common.Metadata` objects.
     """
 
-    def __init__(self, identifier, title,  supported_formats=None,
-                 abstract='', metadata=None, mode=MODE.NONE):
+    def __init__(self, identifier, title, supported_formats=None,
+                 abstract='', metadata=None,
+                 as_reference=False, mode=MODE.NONE):
         if metadata is None:
             metadata = []
 
@@ -103,7 +114,7 @@ class ComplexOutput(basic.ComplexOutput):
                                      supported_formats=supported_formats,
                                      mode=mode)
         self.metadata = metadata
-        self.as_reference = False
+        self.as_reference = as_reference
 
         self.storage = None
 
@@ -122,7 +133,7 @@ class ComplexOutput(basic.ComplexOutput):
             doc.append(OWS.Abstract(self.abstract))
 
         for m in self.metadata:
-            doc.append(OWS.Metadata(*self.metadata))
+            doc.append(OWS.Metadata(dict(m)))
 
         doc.append(
             E.ComplexOutput(
@@ -133,6 +144,17 @@ class ComplexOutput(basic.ComplexOutput):
 
         return doc
 
+    def execute_xml_lineage(self):
+        doc = WPS.Output(
+            OWS.Identifier(self.identifier),
+            OWS.Title(self.title)
+        )
+
+        if self.abstract:
+            doc.append(OWS.Abstract(self.abstract))
+
+        return doc
+
     def execute_xml(self):
         """Render Execute response XML node
 
@@ -181,7 +203,6 @@ class ComplexOutput(basic.ComplexOutput):
         """
         doc = WPS.Data()
 
-
         if self.data is None:
             complex_doc = WPS.ComplexData()
         else:
@@ -190,7 +211,11 @@ class ComplexOutput(basic.ComplexOutput):
                 data_doc = etree.parse(self.file)
                 complex_doc.append(data_doc.getroot())
             except:
-                complex_doc.text = etree.CDATA(self.base64)
+
+                if isinstance(self.data, six.string_types):
+                    complex_doc.text = self.data
+                else:
+                    complex_doc.text = etree.CDATA(self.base64)
 
         if self.data_format:
             if self.data_format.mime_type:
@@ -211,16 +236,16 @@ class LiteralOutput(basic.LiteralOutput):
     :param str abstract: Input abstract
     :param str uoms: units
     :param pywps.validator.mode.MODE mode: validation mode (none to strict)
+    :param metadata: List of metadata advertised by this process. They
+                     should be :class:`pywps.app.Common.Metadata` objects.
     """
 
     def __init__(self, identifier, title, data_type='string', abstract='',
-            metadata=[], uoms=[], mode=MODE.SIMPLE):
-        if metadata is None:
-            metadata = []
+                 metadata=[], uoms=[], mode=MODE.SIMPLE):
         if uoms is None:
             uoms = []
         basic.LiteralOutput.__init__(self, identifier, title=title,
-                data_type=data_type, uoms=uoms, mode=mode)
+                                     data_type=data_type, uoms=uoms, mode=mode)
         self.abstract = abstract
         self.metadata = metadata
 
@@ -234,7 +259,7 @@ class LiteralOutput(basic.LiteralOutput):
             doc.append(OWS.Abstract(self.abstract))
 
         for m in self.metadata:
-            doc.append(OWS.Metadata(m))
+            doc.append(OWS.Metadata(dict(m)))
 
         literal_data_doc = E.LiteralOutput()
 
@@ -269,7 +294,6 @@ class LiteralOutput(basic.LiteralOutput):
 
         return doc
 
-
     def execute_xml(self):
         doc = WPS.Output(
             OWS.Identifier(self.identifier),
diff --git a/pywps/inout/storage.py b/pywps/inout/storage.py
index 3e3cad6..5b176ba 100644
--- a/pywps/inout/storage.py
+++ b/pywps/inout/storage.py
@@ -1,15 +1,25 @@
-from abc import ABCMeta, abstractmethod, abstractproperty
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 import logging
 import os
+from abc import ABCMeta, abstractmethod
 from pywps._compat import urljoin
-from pywps.exceptions import NotEnoughStorage, NoApplicableCode
+from pywps.exceptions import NotEnoughStorage
 from pywps import configuration as config
 
 LOGGER = logging.getLogger('PYWPS')
 
+
 class STORE_TYPE:
     PATH = 0
 # TODO: cover with tests
+
+
 class StorageAbstract(object):
     """Data storage abstract class
     """
@@ -27,6 +37,7 @@ class StorageAbstract(object):
         """
         pass
 
+
 class DummyStorage(StorageAbstract):
     """Dummy empty storage implementation, does nothing
 
@@ -76,7 +87,9 @@ class FileStorage(StorageAbstract):
         self.output_url = config.get_config_value('server', 'outputurl')
 
     def store(self, output):
-        import shutil, tempfile, math
+        import math
+        import shutil
+        import tempfile
 
         file_name = output.file
 
@@ -98,7 +111,7 @@ class FileStorage(StorageAbstract):
         output_name = tempfile.mkstemp(suffix=suffix, prefix=file_name,
                                        dir=self.target)[1]
 
-        full_output_name  = os.path.join(self.target, output_name)
+        full_output_name = os.path.join(self.target, output_name)
         LOGGER.info('Storing file output to %s', full_output_name)
         shutil.copy2(output.file, full_output_name)
 
diff --git a/pywps/resources/__init__.py b/pywps/resources/__init__.py
index e69de29..6b66613 100644
--- a/pywps/resources/__init__.py
+++ b/pywps/resources/__init__.py
@@ -0,0 +1,5 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
diff --git a/pywps/resources/schemas/__init__.py b/pywps/resources/schemas/__init__.py
index e69de29..6b66613 100644
--- a/pywps/resources/schemas/__init__.py
+++ b/pywps/resources/schemas/__init__.py
@@ -0,0 +1,5 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
diff --git a/tests/common.py b/pywps/tests.py
similarity index 83%
rename from tests/common.py
rename to pywps/tests.py
index c2b1291..a3741e0 100644
--- a/tests/common.py
+++ b/pywps/tests.py
@@ -1,3 +1,9 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import lxml.etree
 from werkzeug.test import Client
 from werkzeug.wrappers import BaseResponse
@@ -7,6 +13,7 @@ import logging
 
 logging.disable(logging.CRITICAL)
 
+
 class WpsClient(Client):
 
     def post_xml(self, *args, **kwargs):
@@ -40,8 +47,9 @@ def assert_response_accepted(resp):
     success = resp.xpath_text('/wps:ExecuteResponse'
                               '/wps:Status'
                               '/wps:ProcessAccepted')
-    assert success != None
-    # To Do: assert status URL is present
+    assert success is not None
+    # TODO: assert status URL is present
+
 
 def assert_process_started(resp):
     assert resp.status_code == 200
diff --git a/pywps/validator/__init__.py b/pywps/validator/__init__.py
index b54d2ed..73a85ad 100644
--- a/pywps/validator/__init__.py
+++ b/pywps/validator/__init__.py
@@ -1,11 +1,15 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """Validatating functions for various inputs
 """
+
+
 import logging
-from collections import namedtuple
 from pywps.validator.complexvalidator import validategml, validateshapefile, validategeojson, validategeotiff
-from pywps.validator.literalvalidator import validate_anyvalue, validate_allowed_values
-import logging
-from pywps.validator.mode import MODE
 from pywps.validator.base import emptyvalidator
 
 LOGGER = logging.getLogger('PYWPS')
diff --git a/pywps/validator/allowed_value.py b/pywps/validator/allowed_value.py
index 384b787..31a52d4 100644
--- a/pywps/validator/allowed_value.py
+++ b/pywps/validator/allowed_value.py
@@ -1,3 +1,10 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 from collections import namedtuple
 
 _ALLOWEDVALUETYPE = namedtuple('ALLOWEDVALUETYPE', 'VALUE, RANGE')
diff --git a/pywps/validator/base.py b/pywps/validator/base.py
index 0ca7d1b..e8ac91a 100644
--- a/pywps/validator/base.py
+++ b/pywps/validator/base.py
@@ -1,5 +1,13 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 from pywps.validator.mode import MODE
 
+
 def emptyvalidator(data_input, mode):
     """Empty validator will return always false for security reason
     """
@@ -8,5 +16,3 @@ def emptyvalidator(data_input, mode):
         return True
     else:
         return False
-
-
diff --git a/pywps/validator/complexvalidator.py b/pywps/validator/complexvalidator.py
index baa6369..f8aa98f 100644
--- a/pywps/validator/complexvalidator.py
+++ b/pywps/validator/complexvalidator.py
@@ -1,29 +1,12 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """Validator classes are used for ComplexInputs, to validate the content
 """
-# Author:    Jachym Cepicky
-#            
-# License:
-#
-# Web Processing Service implementation
-# Copyright (C) 2014-2015 PyWPS Development Team, represented by Jachym Cepicky
-#
-# 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
 
@@ -34,6 +17,7 @@ import os
 
 LOGGER = logging.getLogger('PYWPS')
 
+
 def validategml(data_input, mode):
     """GML validation function
 
@@ -59,7 +43,6 @@ def validategml(data_input, mode):
 
     if mode >= MODE.NONE:
         passed = True
-    import sys
 
     if mode >= MODE.SIMPLE:
 
@@ -92,17 +75,19 @@ def validategml(data_input, mode):
             gmlschema = etree.XMLSchema(gmlschema_doc)
             passed = gmlschema.validate(etree.parse(data_input.stream))
         except Exception as e:
+            LOGGER.warning(e)
             passed = False
 
     return passed
 
+
 def validategeojson(data_input, mode):
     """GeoJSON validation example
 
     >>> import StringIO
     >>> class FakeInput(object):
     ...     json = open('point.geojson','w')
-    ...     json.write('''{"type":"Feature", "properties":{}, "geometry":{"type":"Point", "coordinates":[8.5781228542328, 22.87500500679]}, "crs":{"type":"name", "properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}''')
+    ...     json.write('''{"type":"Feature", "properties":{}, "geometry":{"type":"Point", "coordinates":[8.5781228542328, 22.87500500679]}, "crs":{"type":"name", "properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}''')  # noqa
     ...     json.close()
     ...     file = 'point.geojson'
     >>> class fake_data_format(object):
@@ -175,6 +160,7 @@ def validategeojson(data_input, mode):
 
     return passed
 
+
 def validateshapefile(data_input, mode):
     """ESRI Shapefile validation example
 
@@ -214,6 +200,7 @@ def validateshapefile(data_input, mode):
 
     return passed
 
+
 def validategeotiff(data_input, mode):
     """GeoTIFF validation example
     """
@@ -241,6 +228,7 @@ def validategeotiff(data_input, mode):
 
     return passed
 
+
 def _get_schemas_home():
     """Get path to schemas directory
     """
@@ -257,7 +245,6 @@ def _get_schemas_home():
 if __name__ == "__main__":
     import doctest
 
-    import os
     from pywps.wpsserver import temp_dir
 
     with temp_dir() as tmp:
diff --git a/pywps/validator/literalvalidator.py b/pywps/validator/literalvalidator.py
index dedeafa..025fbdd 100644
--- a/pywps/validator/literalvalidator.py
+++ b/pywps/validator/literalvalidator.py
@@ -1,30 +1,11 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """ Validator classes used for LiteralInputs
 """
-# Author:    Jachym Cepicky
-#            
-# License:
-#
-# Web Processing Service implementation
-# Copyright (C) 2014-2015 PyWPS Development Team, represented by Jachym Cepicky
-#
-# 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 pywps.validator.mode import MODE
@@ -33,6 +14,7 @@ from pywps.validator.allowed_value import ALLOWEDVALUETYPE, RANGECLOSURETYPE
 
 LOGGER = logging.getLogger('PYWPS')
 
+
 def validate_anyvalue(data_input, mode):
     """Just placeholder, anyvalue is always valid
     """
@@ -92,7 +74,7 @@ def _validate_range(interval, data):
         if interval.spacing:
             spacing = abs(interval.spacing)
             diff = data - interval.minval
-            passed = diff%spacing == 0
+            passed = diff % spacing == 0
         else:
             passed = True
 
diff --git a/pywps/validator/mode.py b/pywps/validator/mode.py
index d7bbc7e..fe10636 100644
--- a/pywps/validator/mode.py
+++ b/pywps/validator/mode.py
@@ -1,6 +1,13 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """Validation modes
 """
 
+
 class MODE():
     """Validation mode enumeration
     """
diff --git a/pywps/wpsserver.py b/pywps/wpsserver.py
index b83fa1f..91eb924 100755
--- a/pywps/wpsserver.py
+++ b/pywps/wpsserver.py
@@ -1,29 +1,13 @@
 """
 Abstract Server class
 """
-###############################################################################
-#
-# Copyright (C) 2014-2016 PyWPS Development Team, represented by Jachym Cepicky
-#
-# 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.
-#
-###############################################################################
+
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 
 from abc import abstractmethod, ABCMeta
 from contextlib import contextmanager
diff --git a/requirements.txt b/requirements.txt
index 10c2c0b..cfcbdf9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,3 +2,5 @@ owslib
 jsonschema
 lxml
 werkzeug
+SQLAlchemy
+python-dateutil
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..1d0e206
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,4 @@
+[flake8]
+ignore=F401,E402
+max-line-length=120
+exclude=tests
diff --git a/setup.py b/setup.py
index af6db6d..9fb18ee 100644
--- a/setup.py
+++ b/setup.py
@@ -1,26 +1,8 @@
-###############################################################################
-#
-# Copyright (C) 2014-2016 PyWPS Development Team, represented by Jachym Cepicky
-#
-# 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.
-#
-###############################################################################
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
 
 import sys
 
diff --git a/tests/__init__.py b/tests/__init__.py
index f80c8fa..4520d2d 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,3 +1,9 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import sys
 import unittest
 
diff --git a/tests/process.py b/tests/process.py
index d994a0b..dfafe28 100644
--- a/tests/process.py
+++ b/tests/process.py
@@ -1,3 +1,9 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """Test process
 """
 
@@ -31,7 +37,8 @@ class ProcessTestCase(unittest.TestCase):
                               BoundingBoxInput("bbox", title="BBox", crss=[]),
                               ComplexInput("vector", title="Vector")
                           ],
-                          outputs=[]
+                          outputs=[],
+                          metadata=[Metadata('process metadata 1', 'http://example.org/1'), Metadata('process metadata 2', 'http://example.org/2')]) 
         )
         inputs = {
             input.identifier: input.title
diff --git a/tests/processes/__init__.py b/tests/processes/__init__.py
index 7247484..4d47b4c 100644
--- a/tests/processes/__init__.py
+++ b/tests/processes/__init__.py
@@ -1,3 +1,10 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
 from pywps import Process
 from pywps.inout import LiteralInput
 
diff --git a/tests/requests/__init__.py b/tests/requests/__init__.py
index e69de29..6b66613 100644
--- a/tests/requests/__init__.py
+++ b/tests/requests/__init__.py
@@ -0,0 +1,5 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
diff --git a/tests/test_assync.py b/tests/test_assync.py
index 607a9fa..edec261 100644
--- a/tests/test_assync.py
+++ b/tests/test_assync.py
@@ -1,8 +1,14 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import unittest
 import time
 from pywps import Service, Process, LiteralInput, LiteralOutput
 from pywps import WPS, OWS
-from tests.common import client_for, assert_response_accepted
+from pywps.tests import client_for, assert_response_accepted
 
 
 def create_sleep():
@@ -53,6 +59,6 @@ class ExecuteTest(unittest.TestCase):
         resp = client.post_xml(doc=request_doc)
         assert_response_accepted(resp)
 
-        # To Do:
+        # TODO:
         # . extract the status URL from the response
         # . send a status request
diff --git a/tests/test_capabilities.py b/tests/test_capabilities.py
index 6c9670b..9b6c7aa 100644
--- a/tests/test_capabilities.py
+++ b/tests/test_capabilities.py
@@ -1,8 +1,16 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import unittest
+import lxml
 import lxml.etree
 from pywps.app import Process, Service
+from pywps.app.Common import Metadata
 from pywps import WPS, OWS
-from tests.common import assert_pywps_version, client_for
+from pywps.tests import assert_pywps_version, client_for
 
 class BadRequestTest(unittest.TestCase):
 
@@ -38,7 +46,7 @@ class CapabilitiesTest(unittest.TestCase):
     def setUp(self):
         def pr1(): pass
         def pr2(): pass
-        self.client = client_for(Service(processes=[Process(pr1, 'pr1', 'Process 1'), Process(pr2, 'pr2', 'Process 2')]))
+        self.client = client_for(Service(processes=[Process(pr1, 'pr1', 'Process 1', metadata=[Metadata('pr1 metadata')]), Process(pr2, 'pr2', 'Process 2', metadata=[Metadata('pr2 metadata')])]))
 
     def check_capabilities_response(self, resp):
         assert resp.status_code == 200
@@ -53,6 +61,12 @@ class CapabilitiesTest(unittest.TestCase):
                                 '/ows:Identifier')
         assert sorted(names.split()) == ['pr1', 'pr2']
 
+        metadatas = resp.xpath('/wps:Capabilities'
+                               '/wps:ProcessOfferings'
+                               '/wps:Process'
+                               '/ows:Metadata')
+        assert len(metadatas) == 2
+
     def test_get_request(self):
         resp = self.client.get('?Request=GetCapabilities&service=WpS')
         self.check_capabilities_response(resp)
diff --git a/tests/test_dblog.py b/tests/test_dblog.py
index 396fe1d..43e199f 100644
--- a/tests/test_dblog.py
+++ b/tests/test_dblog.py
@@ -1,9 +1,17 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """Unit tests for dblog
 """
+
 import unittest
 
 from pywps import configuration
-from pywps.dblog import get_connection, check_db_table, check_db_columns
+from pywps.dblog import get_session
+from pywps.dblog import ProcessInstance
 
 
 class DBLogTest(unittest.TestCase):
@@ -11,33 +19,26 @@ class DBLogTest(unittest.TestCase):
 
     def setUp(self):
 
-        self.database = configuration.get_config_value('server', 'logdatabase')
-        if not self.database:
-            self.database = ':memory:'
+        self.database = configuration.get_config_value('logging', 'database')
 
     def test_0_dblog(self):
         """Test pywps.formats.Format class
         """
-        connection = get_connection()
-        self.assertTrue(connection)
-        self.assertTrue(check_db_table(connection))
-        #self.assertTrue(check_db_columns(self.database))
+        session = get_session()
+        self.assertTrue(session)
 
     def test_db_content(self):
-        connection = get_connection()
-        cur = connection.cursor()
-        cur.execute("Select * from pywps_requests WHERE time_end IS NULL")
-        null_time_end = cur.fetchall()
-        self.assertEqual(len(null_time_end), 0,
+        session = get_session()
+        null_time_end = session.query(ProcessInstance).filter(ProcessInstance.time_end == None)
+        self.assertEqual(null_time_end.count(), 0,
                          'There are no unfinished processes loged')
-        cur.execute("Select * from pywps_requests WHERE status IS NULL")
-        null_status = cur.fetchall()
-        self.assertEqual(len(null_status), 0,
+
+        null_status = session.query(ProcessInstance).filter(ProcessInstance.status == None)
+        self.assertEqual(null_status.count(), 0,
                          'There are no processes without status loged')
 
-        cur.execute("Select * from pywps_requests WHERE percent_done IS NULL")
-        null_percent = cur.fetchall()
-        self.assertEqual(len(null_percent), 0,
+        null_percent = session.query(ProcessInstance).filter(ProcessInstance.percent_done == None)
+        self.assertEqual(null_percent.count(), 0,
                          'There are no processes without percent loged')
 
 def load_tests(loader=None, tests=None, pattern=None):
diff --git a/tests/test_describe.py b/tests/test_describe.py
index 1171196..f0bb4ee 100644
--- a/tests/test_describe.py
+++ b/tests/test_describe.py
@@ -1,3 +1,9 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import unittest
 from collections import namedtuple
 from pywps import Process, Service, LiteralInput, ComplexInput, BoundingBoxInput
@@ -5,13 +11,14 @@ from pywps import LiteralOutput, ComplexOutput, BoundingBoxOutput
 from pywps import E, WPS, OWS, OGCTYPE, Format, NAMESPACES, OGCUNIT
 from pywps.inout.literaltypes import LITERAL_DATA_TYPES
 from pywps.app.basic import xpath_ns
+from pywps.app.Common import Metadata
 from pywps.inout.formats import Format
 from pywps.inout.literaltypes import AllowedValue
 from pywps.validator.allowed_value import ALLOWEDVALUETYPE
 
-from tests.common import assert_pywps_version, client_for
+from pywps.tests import assert_pywps_version, client_for
 
-ProcessDescription = namedtuple('ProcessDescription', ['identifier', 'inputs'])
+ProcessDescription = namedtuple('ProcessDescription', ['identifier', 'inputs', 'metadata'])
 
 
 def get_data_type(el):
@@ -27,6 +34,9 @@ def get_describe_result(resp):
     for desc_el in resp.xpath('/wps:ProcessDescriptions/ProcessDescription'):
         [identifier_el] = xpath_ns(desc_el, './ows:Identifier')
         inputs = []
+        metadata = []
+        for metadata_el in xpath_ns(desc_el, './ows:Metadata'):
+            metadata.append(metadata_el.attrib['{http://www.w3.org/1999/xlink}title'])
         for input_el in xpath_ns(desc_el, './DataInputs/Input'):
             [input_identifier_el] = xpath_ns(input_el, './ows:Identifier')
             input_identifier = input_identifier_el.text
@@ -47,7 +57,7 @@ def get_describe_result(resp):
                 inputs.append((input_identifier, 'complex', formats))
             else:
                 raise RuntimeError("Can't parse input description")
-        result.append(ProcessDescription(identifier_el.text, inputs))
+        result.append(ProcessDescription(identifier_el.text, inputs, metadata))
     return result
 
 
@@ -125,9 +135,12 @@ class DescribeProcessInputTest(unittest.TestCase):
                 hello,
                 'hello',
                 'Process Hello',
-                inputs=[LiteralInput('the_name', 'Input name')])
+                inputs=[LiteralInput('the_name', 'Input name')],
+                metadata=[Metadata('process metadata 1', 'http://example.org/1'), Metadata('process metadata 2', 'http://example.org/2')]
+        )
         result = self.describe_process(hello_process)
         assert result.inputs == [('the_name', 'literal', 'integer')]
+        assert result.metadata == ['process metadata 1', 'process metadata 2']
 
     def test_one_literal_integer_input(self):
         def hello(request): pass
diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py
index bdf186b..13e1735 100644
--- a/tests/test_exceptions.py
+++ b/tests/test_exceptions.py
@@ -1,7 +1,13 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import unittest
 from pywps import Process, Service, WPS, OWS
 from pywps.app.basic import xpath_ns
-from tests.common import assert_pywps_version, client_for
+from pywps.tests import assert_pywps_version, client_for
 import lxml.etree
 
 
diff --git a/tests/test_execute.py b/tests/test_execute.py
index 993b36b..4553381 100644
--- a/tests/test_execute.py
+++ b/tests/test_execute.py
@@ -1,3 +1,9 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import unittest
 import lxml.etree
 import json
@@ -10,7 +16,7 @@ from pywps import get_inputs_from_xml, get_output_from_xml
 from pywps import E, WPS, OWS
 from pywps.app.basic import xpath_ns
 from pywps._compat import text_type
-from tests.common import client_for, assert_response_success
+from pywps.tests import client_for, assert_response_success
 
 from pywps._compat import PY2
 from pywps._compat import StringIO
diff --git a/tests/test_formats.py b/tests/test_formats.py
index a438f42..752e0e8 100644
--- a/tests/test_formats.py
+++ b/tests/test_formats.py
@@ -1,5 +1,11 @@
 """Unit tests for Formats
 """
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import unittest
 
 from pywps.inout.formats import Format, get_format, FORMATS
diff --git a/tests/test_inout.py b/tests/test_inout.py
index 00a21fc..9229d01 100644
--- a/tests/test_inout.py
+++ b/tests/test_inout.py
@@ -1,5 +1,11 @@
 """Unit tests for IOs
 """
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import os
 import tempfile
 import unittest
diff --git a/tests/test_literaltypes.py b/tests/test_literaltypes.py
index 2cc4ad8..91f0b1b 100644
--- a/tests/test_literaltypes.py
+++ b/tests/test_literaltypes.py
@@ -1,6 +1,13 @@
 """Unit tests for IOs
 """
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import unittest
+import datetime
 from pywps.inout.literaltypes import *
 
 class ConvertorTest(unittest.TestCase):
@@ -37,6 +44,36 @@ class ConvertorTest(unittest.TestCase):
         self.assertFalse(convert_boolean(0))
         self.assertTrue(convert_boolean(-1))
 
+    def test_time(self):
+        """Test time convertor"""
+        self.assertEqual(convert_time("12:00:00"),
+                         datetime.time(12, 0, 0))
+        self.assertTrue(isinstance(
+            convert_time(datetime.time(14)),
+            datetime.time))
+
+    def test_date(self):
+        """Test date convertor"""
+        self.assertEqual(convert_date("2011-07-21"),
+                         datetime.date(2011, 7, 21))
+        self.assertTrue(isinstance(
+            convert_date(datetime.date(2012, 12, 31)),
+            datetime.date))
+
+    def test_datetime(self):
+        """Test datetime convertor"""
+        self.assertEqual(convert_datetime("2016-09-22T12:00:00"),
+                         datetime.datetime(2016, 9, 22, 12))
+        self.assertTrue(isinstance(
+            convert_datetime("2016-09-22T12:00:00Z"),
+            datetime.datetime))
+        self.assertTrue(isinstance(
+            convert_datetime("2016-09-22T12:00:00+01:00"),
+            datetime.datetime))
+        self.assertTrue(isinstance(
+            convert_datetime(datetime.datetime(2016, 9, 22, 6)),
+            datetime.datetime))
+
 
 def load_tests(loader=None, tests=None, pattern=None):
     if not loader:
diff --git a/tests/test_ows.py b/tests/test_ows.py
index a20ac68..ef22ed2 100644
--- a/tests/test_ows.py
+++ b/tests/test_ows.py
@@ -1,8 +1,12 @@
-'''
-Created on 10 Mar 2015
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+__author__ = "Luis de Sousa"
+__date__ = "10-03-2015"
 
- at author: desousa
-'''
 import os
 import tempfile
 import unittest
@@ -13,7 +17,7 @@ from pywps.dependencies import ogr
 from pywps.exceptions import NoApplicableCode
 from pywps import WPS, OWS
 from pywps.wpsserver import temp_dir
-from tests.common import client_for, assert_response_success
+from pywps.tests import client_for, assert_response_success
 
 wfsResource = 'http://demo.mapserver.org/cgi-bin/wfs?service=WFS&version=1.1.0&request=GetFeature&typename=continents&maxfeatures=10'
 wcsResource = 'http://demo.mapserver.org/cgi-bin/wcs?service=WCS&version=1.0.0&request=GetCoverage&coverage=ndvi&crs=EPSG:4326&bbox=-92,42,-85,45&format=image/tiff&width=400&height=300'
diff --git a/tests/test_wpsrequest.py b/tests/test_wpsrequest.py
index 1d3ed17..879a5e9 100644
--- a/tests/test_wpsrequest.py
+++ b/tests/test_wpsrequest.py
@@ -1,3 +1,9 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 import unittest
 import lxml.etree
 from pywps.app import WPSRequest
diff --git a/tests/validator/__init__.py b/tests/validator/__init__.py
index e69de29..152f00a 100644
--- a/tests/validator/__init__.py
+++ b/tests/validator/__init__.py
@@ -0,0 +1,7 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
+
diff --git a/tests/validator/test_complexvalidators.py b/tests/validator/test_complexvalidators.py
index 1e5eade..900d2ae 100644
--- a/tests/validator/test_complexvalidators.py
+++ b/tests/validator/test_complexvalidators.py
@@ -1,5 +1,12 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """Unit tests for complex validator
 """
+
 import unittest
 import sys
 from pywps.validator.complexvalidator import *
diff --git a/tests/validator/test_literalvalidators.py b/tests/validator/test_literalvalidators.py
index c26f470..6752134 100644
--- a/tests/validator/test_literalvalidators.py
+++ b/tests/validator/test_literalvalidators.py
@@ -1,5 +1,12 @@
+##################################################################
+# Copyright 2016 OSGeo Foundation,                               #
+# represented by PyWPS Project Steering Committee,               #
+# licensed under MIT, Please consult LICENSE.txt for details     #
+##################################################################
+
 """Unit tests for literal validator
 """
+
 import unittest
 from pywps.validator.literalvalidator import *
 from pywps.inout.literaltypes import AllowedValue
diff --git a/tox.ini b/tox.ini
index 84355b9..1055bcc 100644
--- a/tox.ini
+++ b/tox.ini
@@ -8,15 +8,16 @@ deps = flufl.enum
 
 pip_pre=True
 deps=
+    lxml
     flask
     owslib
     simplejson
     jsonschema
-    lxml
     geojson
     shapely
     unipath
     werkzeug
+    SQLAlchemy
 
 commands=
 	# check first which version is installed "gdal-config --version"

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



More information about the Pkg-grass-devel mailing list