[qgis] 01/06: Imported Upstream version 2.14.12+dfsg

Bas Couwenberg sebastic at debian.org
Fri Feb 24 15:35:44 UTC 2017


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

sebastic pushed a commit to branch master
in repository qgis.

commit 3b34fc40bc20bef35417c6c0dd5dff76300d754e
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Fri Feb 24 13:31:56 2017 +0100

    Imported Upstream version 2.14.12+dfsg
---
 CMakeLists.txt                                     |   2 +-
 ChangeLog                                          | 213 +++++++
 debian/changelog                                   |  10 +-
 python/analysis/analysis.sip                       |   1 -
 python/analysis/network/networkanalysis.sip        |   1 -
 python/core/conversions.sip                        |   6 +-
 python/core/core.sip                               |   1 -
 python/core/qgscoordinatetransform.sip             |   3 +-
 python/core/qgsfeature.sip                         |   2 +-
 python/core/qgspallabeling.sip                     |   2 +-
 python/core/qgsvectorlayerfeatureiterator.sip      |   3 +-
 python/core/raster/qgsrasterprojector.sip          |   2 +-
 python/gui/editorwidgets/qgsdatetimeedit.sip       |   3 +-
 python/gui/editorwidgets/qgsdoublespinbox.sip      |   1 +
 python/gui/editorwidgets/qgsspinbox.sip            |   1 +
 python/gui/gui.sip                                 |   1 -
 python/gui/qgslonglongvalidator.sip                |   4 +-
 python/plugins/processing/algs/gdal/polygonize.py  |   5 +-
 .../processing/algs/grass/GrassAlgorithm.py        |   2 +-
 python/plugins/processing/algs/help/qgis.yaml      |   2 +-
 .../algs/lidar/fusion/FusionAlgorithm.py           |   2 +-
 python/plugins/processing/algs/qgis/Merge.py       |   5 +-
 python/plugins/processing/core/GeoAlgorithm.py     |   7 +-
 python/plugins/processing/core/ProcessingConfig.py |   7 +-
 python/plugins/processing/gui/BatchPanel.py        |   2 +-
 python/plugins/processing/gui/ConfigDialog.py      |   5 +-
 .../plugins/processing/modeler/ModelerAlgorithm.py |   9 +
 .../plugins/processing/script/ScriptAlgorithm.py   |   6 +-
 python/server/qgswmsconfigparser.sip               |   2 +-
 python/server/qgswmsprojectparser.sip              |   2 +-
 python/server/server.sip                           |   1 -
 scripts/release.pl                                 |  13 +-
 src/app/qgsfieldsproperties.cpp                    |   4 +-
 src/core/geometry/qgscircularstringv2.cpp          |  82 +--
 src/core/qgsapplication.cpp                        |  18 +-
 src/core/qgsogcutils.cpp                           |  11 +
 src/core/symbology-ng/qgssymbollayerv2utils.cpp    |  22 +-
 src/gui/qgsmapcanvas.cpp                           |   1 +
 src/server/qgsserver.cpp                           |  10 +-
 src/server/qgswmsconfigparser.cpp                  |   1 +
 tests/src/python/CMakeLists.txt                    |   1 +
 tests/src/python/test_qgsserver.py                 | 317 ++++++++++
 tests/src/python/test_qgssymbollayerv2_readsld.py  | 117 ++++
 .../WMS_GetMap_Background.png                      | Bin 0 -> 29454 bytes
 .../WMS_GetMap_Background_Hex.png                  | Bin 0 -> 29454 bytes
 .../WMS_GetMap_Basic/WMS_GetMap_Basic.png          | Bin 0 -> 31254 bytes
 .../WMS_GetMap_Filter/WMS_GetMap_Filter.png        | Bin 0 -> 32826 bytes
 .../WMS_GetMap_LayerOrder.png                      | Bin 0 -> 42641 bytes
 .../WMS_GetMap_Opacities/WMS_GetMap_Opacities.png  | Bin 0 -> 59841 bytes
 .../qgis_server/WMS_GetMap_SRS/WMS_GetMap_SRS.png  | Bin 0 -> 47895 bytes
 .../WMS_GetMap_Selection/WMS_GetMap_Selection.png  | Bin 0 -> 53116 bytes
 .../WMS_GetMap_StyleCustom.png                     | Bin 0 -> 41270 bytes
 .../WMS_GetMap_StyleCustom_mask.png                | Bin 0 -> 34176 bytes
 .../WMS_GetMap_StyleDefault.png                    | Bin 0 -> 32958 bytes
 .../WMS_GetMap_StyleDefault_mask.png               | Bin 0 -> 6982 bytes
 .../WMS_GetMap_Transparent.png                     | Bin 0 -> 33000 bytes
 .../WMS_GetMap_Transparent_mask.png                | Bin 0 -> 864 bytes
 .../WMS_GetPrint_Basic/WMS_GetPrint_Basic.png      | Bin 0 -> 270757 bytes
 .../WMS_GetPrint_Basic/WMS_GetPrint_Basic_mask.png | Bin 0 -> 105668 bytes
 .../WMS_GetPrint_Grid/WMS_GetPrint_Grid.png        | Bin 0 -> 306229 bytes
 .../WMS_GetPrint_Grid/WMS_GetPrint_Grid_mask.png   | Bin 0 -> 105668 bytes
 .../WMS_GetPrint_Rotation.png                      | Bin 0 -> 338694 bytes
 .../WMS_GetPrint_Rotation_mask.png                 | Bin 0 -> 105668 bytes
 .../WMS_GetPrint_SRS/WMS_GetPrint_SRS.png          | Bin 0 -> 235542 bytes
 .../WMS_GetPrint_SRS/WMS_GetPrint_SRS_mask.png     | Bin 0 -> 105668 bytes
 .../WMS_GetPrint_Scale/WMS_GetPrint_Scale.png      | Bin 0 -> 206573 bytes
 .../WMS_GetPrint_Scale/WMS_GetPrint_Scale_mask.png | Bin 0 -> 105668 bytes
 .../WMS_GetPrint_Selection.png                     | Bin 0 -> 270757 bytes
 .../WMS_GetPrint_Selection_mask.png                | Bin 0 -> 105668 bytes
 tests/testdata/geom_data.csv                       |  24 +-
 .../testdata/qgis_server_accesscontrol/project.qgs | 685 ++++++++++++++++++++-
 .../symbol_layer/external_sld/simple_streams.sld   |  30 +
 .../testSimpleMarkerRotation-directValue.sld       |  30 +
 .../testSimpleMarkerRotation-ogcLiteral.sld        |  31 +
 74 files changed, 1595 insertions(+), 115 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f36694c..50eca7e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 SET(CPACK_PACKAGE_VERSION_MAJOR "2")
 SET(CPACK_PACKAGE_VERSION_MINOR "14")
-SET(CPACK_PACKAGE_VERSION_PATCH "11")
+SET(CPACK_PACKAGE_VERSION_PATCH "12")
 SET(COMPLETE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
 SET(RELEASE_NAME "Essen")
 IF (POLICY CMP0048) # in CMake 3.0.0+
diff --git a/ChangeLog b/ChangeLog
index e9c872b..b85a7f6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,216 @@
+Juergen E. Fischer <jef at norbit.de>	2017-02-20
+
+    release.pl: bypass pre-commit hooks
+
+Marco Hugentobler <marco.hugentobler at sourcepole.ch>	2017-02-23
+
+    Adapt another centroid to match the improved segmentation
+
+Marco Hugentobler <marco.hugentobler at sourcepole.ch>	2017-02-22
+
+    Adapt circularstring centroids for python geometry test
+
+Marco Hugentobler <marco.hugentobler at sourcepole.ch>	2017-02-22
+
+    Backport fix for segmentation to 2.14
+
+Merge: 190c31d3c4 852b9af4ed
+Alessandro Pasotti <elpaso at itopen.it>	2017-02-16
+
+    Merge pull request #4152 from boundlessgeo/release-2_14-SldRotationFix
+
+    fixed forgot merge conflict message
+
+Luigi Pirelli <luipir at gmail.com>	2017-02-16
+
+    fixed forgot merge conflict message
+
+Merge: 70f51aeeda e05a8cafda
+Matthias Kuhn <matthias at opengis.ch>	2017-02-16
+
+    Merge pull request #4051 from boundlessgeo/release-2_14-SldRotationFix
+
+    Tests and fix to read sld:Rotation when does not have ogc sub tags
+
+Juergen E. Fischer <jef at norbit.de>	2017-02-11
+
+    adapt bindings to sip 4.19 (fixes #16071)
+
+    (cherry picked from commit 718581ffb12b723f9a3c0ae01b7ec2d8aed9d4bb)
+
+Juergen E. Fischer <jef at norbit.de>	2017-02-12
+
+    [processing] added missing import (fixes #16181)
+    (backported from 84bef5f; followup b003cbe0)
+
+Luigi Pirelli <luipir at gmail.com>	2017-02-08
+
+    moved node value parsing to ogc filter parsing
+
+Tudor Bărăscu <tudor.barascu at qtibia.ro>	2017-02-02
+
+    refresh canvas when panning map to selected rows
+
+Tudor Bărăscu <tudor.barascu at qtibia.ro>	2017-02-01
+
+    backport sorted field list issues
+
+    If the field list is sorted by name, the touched functions
+    should take into consideration the sorted list IDs instead of the
+    unsorted one.
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-01-27
+
+    [processing] fix parameter value retrieval
+
+Merge: 637b585270 a7133f5323
+rldhont <rldhont at gmail.com>	2017-01-27
+
+    Merge pull request #4035 from rldhont/server-backport-release-2_14-tests
+
+    [Server] Backport tests for 2.14
+
+rldhont <rldhont at gmail.com>	2017-01-19
+
+    [Server] Backport tests
+
+rldhont <rldhont at gmail.com>	2017-01-20
+
+    [BUFIX][Server] Regression in GetPrint GRID parameters
+
+rldhont <rldhont at gmail.com>	2017-01-26
+
+    [BUGFIX][Processing] Script: get output file extension
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-01-26
+
+    fix import
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-01-25
+
+    [processing] make additional Fusion parameters optional
+
+    (cherry picked from commit 49e7b94a633254c99309b439db20f06d196d2fac)
+
+luipir <luipir at gmail.com>	2017-01-25
+
+    typo
+
+Anita Graser <anitagraser at gmx.at>	2016-12-20
+
+    updated help for qgis:mergevectorlayers (#3883)
+
+    "two" => "multiple"
+    (cherry picked from commit 5e061b1c632b6701df09d293b53af028d1685847)
+
+nirvn <nirvn.asia at gmail.com>	2016-12-20
+
+    [processing] support non-ogr layers in merge vector layers alg
+
+    (cherry picked from commit e338a90c80dd8b58ed41cb932c8a166b3172db2a)
+
+nirvn <nirvn.asia at gmail.com>	2017-01-03
+
+    [processing] fix app freeze when closing options dialog (fixes #15550)
+
+    (cherry picked from commit 3dcf4874859f777050f06c9fde54233e5df73b2c)
+
+Mathieu Pellerin <nirvn.asia at gmail.com>	2017-01-04
+
+    [processing] fix modeler output values in case algorithm(s)
+
+    execution modifies those (fixes #16021)
+    (cherry picked from commit 9908d9cf8117741f4614f21595018e97cf829333)
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-01-13
+
+    [processing] allow other output formats than shapefile in GDAL
+    polygonize
+
+    (cherry picked from commit 8f291a92df1667e718d49a4108e6f44721357f40)
+
+Luigi Pirelli <luipir at gmail.com>	2017-01-17
+
+    Tests and fix to read sld:Rotation when does not have ogc sub tags
+
+Merge: dd54688d76 e6ec34a487
+rldhont <rldhont at gmail.com>	2017-01-23
+
+    Merge pull request #4039 from rldhont/sld-backport-release-2_14-parsing
+
+    SLD parsing: handling ogc:Literal within CssParameter - backport 2.14
+
+Merge: 836f2159b5 730c164860
+Borys Jurgiel <info at borysjurgiel.pl>	2017-01-23
+
+    Merge branch 'release-2_14' of github.com:qgis/QGIS into release-2_14
+
+    Conflicts:
+            python/plugins/processing/core/GeoAlgorithm.py
+
+Borys Jurgiel <info at borysjurgiel.pl>	2017-01-23
+
+    [Processing] Follow up 9224f585d95a
+
+Borys Jurgiel <info at borysjurgiel.pl>	2017-01-23
+
+    [Processing] Yet another fix for error message encoding errors (for 2.14) (#4042)
+
+    * [Processing] Yet another fix for error message encoding errors. Fixes #16102
+
+    * [Processing] Follow up 1ede526c8eb8a8e2950e
+
+Borys Jurgiel <info at borysjurgiel.pl>	2017-01-23
+
+    [Processing] Follow up 1ede526c8eb8a8e2950e
+
+Borys Jurgiel <info at borysjurgiel.pl>	2017-01-23
+
+    [Processing] Yet another fix for error message encoding errors. Fixes #16102
+
+Jorge Gustavo Rocha <jgr at geomaster.pt>	2017-01-18
+
+    DDL update: saving layer styles on databases
+    Fix #11421
+
+Jorge Gustavo Rocha <jgr at geomaster.pt>	2017-01-17
+
+    SLD parsing: handling ogc:Literal within CssParameter
+
+Jorge Gustavo Rocha <jgr at geomaster.pt>	2017-01-15
+
+    SLD parsing: handling ogc:Literal within CssParameter
+
+Jorge Gustavo Rocha <jgr at geomaster.pt>	2017-01-15
+
+    SLD parsing: handling ogc:Literal within CssParameter
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-01-18
+
+    prevent duplication of SVG path (fix #16056)
+
+    (partially cherry-picked from c60c4f7f0ca09dc6bbc8e3f721339a238154ff57)
+
+Juergen E. Fischer <jef at norbit.de>	2017-01-16
+
+    fix 4ae6b56
+
+Chris Mayo <aklhfex at gmail.com>	2017-01-14
+
+    Fix application icon disappearance after removal of easter egg
+
+    Commit 1eb3bfc1 changed return value to be a filename not the full path
+
+    (cherry-picked from 68387ce)
+
+Juergen E. Fischer <jef at norbit.de>	2017-01-13
+
+    fix 6e1ec44b
+
+Juergen E. Fischer <jef at norbit.de>	2017-01-13
+
+    Release of 2.14.11
+
 Juergen E. Fischer <jef at norbit.de>	2017-01-13
 
     german translation update
diff --git a/debian/changelog b/debian/changelog
index 44bcd98..8c2e073 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,14 @@
-qgis (2.14.11) UNRELEASED; urgency=medium
+qgis (2.14.12) UNRELEASED; urgency=medium
+
+  * Release of 2.14.12
+
+ -- Jürgen E. Fischer <jef at norbit.de>  Fri, 24 Feb 2017 13:00:10 +0100
+
+qgis (2.14.11) unstable; urgency=medium
 
   * Release of 2.14.11
 
- -- Jürgen E. Fischer <jef at norbit.de>  Fri, 13 Jan 2017 13:00:08 +0100
+ -- Jürgen E. Fischer <jef at norbit.de>  Fri, 24 Feb 2017 13:00:10 +0100
 
 qgis (2.14.10) unstable; urgency=medium
 
diff --git a/python/analysis/analysis.sip b/python/analysis/analysis.sip
index ceb5056..bd90e10 100644
--- a/python/analysis/analysis.sip
+++ b/python/analysis/analysis.sip
@@ -1,5 +1,4 @@
 %Module(name=qgis._analysis,
-        version=0,
         keyword_arguments="Optional")
 
 %Import QtCore/QtCoremod.sip
diff --git a/python/analysis/network/networkanalysis.sip b/python/analysis/network/networkanalysis.sip
index fb446d1..d2c192b 100644
--- a/python/analysis/network/networkanalysis.sip
+++ b/python/analysis/network/networkanalysis.sip
@@ -1,5 +1,4 @@
 %Module(name=qgis._networkanalysis,
-        version=0,
         keyword_arguments="Optional")
 
 %Import QtCore/QtCoremod.sip
diff --git a/python/core/conversions.sip b/python/core/conversions.sip
index d64171f..e6bcbab 100644
--- a/python/core/conversions.sip
+++ b/python/core/conversions.sip
@@ -745,7 +745,7 @@ template<TYPE>
 
 // QMap<qint64, TYPE> is implemented as a Python dictionary.
 template<TYPE>
-%MappedType QMap<qint64, TYPE> /DocType="dict-of-qint64-TYPE"/
+%MappedType QMap<qint64, TYPE>
 {
 %TypeHeaderCode
 #include <qmap.h>
@@ -1806,7 +1806,7 @@ template <TYPE>
 };
 
 // QList<QgsField> is implemented as a Python list of QgsField.
-%MappedType QList<QgsField> /DocType="list-of-qgsfield"/
+%MappedType QList<QgsField>
 {
 %TypeHeaderCode
 #include <qgsfield.h>
@@ -1911,7 +1911,7 @@ template <TYPE>
 
 %If (QVECTORINT_CONVERSION)
 // QVector<int> is implemented as a Python list of integers.
-%MappedType QVector<int> /DocType="list-of-int"/
+%MappedType QVector<int>
 {
 %TypeHeaderCode
 #include <qvector.h>
diff --git a/python/core/core.sip b/python/core/core.sip
index f76137e..63d1750 100644
--- a/python/core/core.sip
+++ b/python/core/core.sip
@@ -1,5 +1,4 @@
 %Module(name=qgis._core,
-        version=0,
         keyword_arguments="Optional")
 
 %Feature QT5_SUPPORT
diff --git a/python/core/qgscoordinatetransform.sip b/python/core/qgscoordinatetransform.sip
index c14ba53..f9b7854 100644
--- a/python/core/qgscoordinatetransform.sip
+++ b/python/core/qgscoordinatetransform.sip
@@ -15,6 +15,7 @@
 class QgsCoordinateTransform : QObject
 {
 %TypeHeaderCode
+extern PyObject *sipExportedExceptions__core[2];  // workaround: sipExportedExceptions__core is only defined in the first sip part
 #include <qgscoordinatetransform.h>
 %End
 
@@ -215,5 +216,5 @@ class QgsCoordinateTransform : QObject
 
   signals:
     /** Signal when an invalid pj_transform() has occurred */
-    void  invalidTransformInput() const;
+    void invalidTransformInput() const;
 };
diff --git a/python/core/qgsfeature.sip b/python/core/qgsfeature.sip
index 95af0af..854a3d0 100644
--- a/python/core/qgsfeature.sip
+++ b/python/core/qgsfeature.sip
@@ -4,7 +4,7 @@ typedef QMap<int, QVariant> QgsAttributeMap;
 typedef QVector<QVariant> QgsAttributes;
 
 // QgsAttributes is implemented as a Python list of Python objects.
-%MappedType QgsAttributes /DocType="list-of-attributes"/
+%MappedType QgsAttributes
 {
 %TypeHeaderCode
 #include <qgsfeature.h>
diff --git a/python/core/qgspallabeling.sip b/python/core/qgspallabeling.sip
index 0b3f813..5e66967 100644
--- a/python/core/qgspallabeling.sip
+++ b/python/core/qgspallabeling.sip
@@ -1,5 +1,5 @@
 // QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*> is implemented as a Python dictionary.
-%MappedType QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*> /DocType="dict-of-QgsPalLayerSettings.DataDefinedProperties-QgsDataDefined*"/
+%MappedType QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*>
 {
 %TypeHeaderCode
 #include <qmap.h>
diff --git a/python/core/qgsvectorlayerfeatureiterator.sip b/python/core/qgsvectorlayerfeatureiterator.sip
index 0685e20..ad3431c 100644
--- a/python/core/qgsvectorlayerfeatureiterator.sip
+++ b/python/core/qgsvectorlayerfeatureiterator.sip
@@ -70,5 +70,6 @@ class QgsVectorLayerFeatureIterator : QgsAbstractFeatureIterator
     //void updateFeatureGeometry( QgsFeature& f );
 
   private:
-    QgsVectorLayerFeatureIterator();
+    QgsVectorLayerFeatureIterator( const QgsVectorLayerFeatureIterator &rhs );
+
 };
diff --git a/python/core/raster/qgsrasterprojector.sip b/python/core/raster/qgsrasterprojector.sip
index 3ef4599..d09386b 100644
--- a/python/core/raster/qgsrasterprojector.sip
+++ b/python/core/raster/qgsrasterprojector.sip
@@ -54,7 +54,7 @@ class QgsRasterProjector : QgsRasterInterface
 
     int bandCount() const;
 
-    int dataType( int bandNo ) const;
+    QGis::DataType dataType( int bandNo ) const;
 
     /** \brief set source and destination CRS */
     void setCRS( const QgsCoordinateReferenceSystem & theSrcCRS, const QgsCoordinateReferenceSystem & theDestCRS,
diff --git a/python/gui/editorwidgets/qgsdatetimeedit.sip b/python/gui/editorwidgets/qgsdatetimeedit.sip
index 90449b9..e6596fe 100644
--- a/python/gui/editorwidgets/qgsdatetimeedit.sip
+++ b/python/gui/editorwidgets/qgsdatetimeedit.sip
@@ -33,6 +33,7 @@ class QgsDateTimeEdit : QDateTimeEdit
 
   protected:
     virtual void resizeEvent( QResizeEvent* event );
-
     void mousePressEvent( QMouseEvent*event );
+    virtual void fixup(QString & input) const;
+    virtual QValidator::State validate(QString &text, int &pos) const;
 };
diff --git a/python/gui/editorwidgets/qgsdoublespinbox.sip b/python/gui/editorwidgets/qgsdoublespinbox.sip
index 6fac256..ed3ed02 100644
--- a/python/gui/editorwidgets/qgsdoublespinbox.sip
+++ b/python/gui/editorwidgets/qgsdoublespinbox.sip
@@ -58,4 +58,5 @@ class QgsDoubleSpinBox : QDoubleSpinBox
     virtual void resizeEvent( QResizeEvent* event );
     virtual void changeEvent( QEvent* event );
     virtual void paintEvent( QPaintEvent* event );
+    virtual void fixup(QString & input) const;
 };
diff --git a/python/gui/editorwidgets/qgsspinbox.sip b/python/gui/editorwidgets/qgsspinbox.sip
index 09e8b65..61847d6 100644
--- a/python/gui/editorwidgets/qgsspinbox.sip
+++ b/python/gui/editorwidgets/qgsspinbox.sip
@@ -58,4 +58,5 @@ class QgsSpinBox : QSpinBox
     virtual void resizeEvent( QResizeEvent* event );
     virtual void changeEvent( QEvent* event );
     virtual void paintEvent( QPaintEvent* event );
+    virtual void fixup(QString &input) const;
 };
diff --git a/python/gui/gui.sip b/python/gui/gui.sip
index 09065c0..adda0f3 100644
--- a/python/gui/gui.sip
+++ b/python/gui/gui.sip
@@ -1,5 +1,4 @@
 %Module(name=qgis._gui,
-        version=0,
         keyword_arguments="Optional")
 
 %Feature HAVE_QSCI_SIP
diff --git a/python/gui/qgslonglongvalidator.sip b/python/gui/qgslonglongvalidator.sip
index 9def830..7500357 100644
--- a/python/gui/qgslonglongvalidator.sip
+++ b/python/gui/qgslonglongvalidator.sip
@@ -8,7 +8,7 @@ class QgsLongLongValidator : QValidator
     QgsLongLongValidator( qint64 bottom, qint64 top, QObject *parent );
     ~QgsLongLongValidator();
 
-    QValidator::State validate( QString &input, int& ) const;
+    virtual QValidator::State validate( QString &input, int& ) const;
 
     void setBottom( qint64 bottom );
     void setTop( qint64 top );
@@ -17,4 +17,6 @@ class QgsLongLongValidator : QValidator
 
     qint64 bottom() const;
     qint64 top() const;
+
+    virtual void fixup(QString &input) const;
 };
diff --git a/python/plugins/processing/algs/gdal/polygonize.py b/python/plugins/processing/algs/gdal/polygonize.py
index 6517c39..9e4b966 100644
--- a/python/plugins/processing/algs/gdal/polygonize.py
+++ b/python/plugins/processing/algs/gdal/polygonize.py
@@ -53,11 +53,12 @@ class polygonize(GdalAlgorithm):
         self.addOutput(OutputVector(polygonize.OUTPUT, self.tr('Vectorized')))
 
     def getConsoleCommands(self):
+        output = self.getOutputValue(polygonize.OUTPUT)
+
         arguments = []
         arguments.append(self.getParameterValue(polygonize.INPUT))
         arguments.append('-f')
-        arguments.append('ESRI Shapefile')
-        output = self.getOutputValue(polygonize.OUTPUT)
+        arguments.append(GdalUtils.getVectorDriverFromFileName(output))
         arguments.append(output)
         arguments.append(QtCore.QFileInfo(output).baseName())
         arguments.append(self.getParameterValue(polygonize.FIELD))
diff --git a/python/plugins/processing/algs/grass/GrassAlgorithm.py b/python/plugins/processing/algs/grass/GrassAlgorithm.py
index b74c2dd..8af36d1 100644
--- a/python/plugins/processing/algs/grass/GrassAlgorithm.py
+++ b/python/plugins/processing/algs/grass/GrassAlgorithm.py
@@ -31,7 +31,7 @@ import uuid
 import importlib
 import re
 
-from PyQt4.QtCore import QCoreApplication
+from PyQt4.QtCore import QCoreApplication, QUrl
 from PyQt4.QtGui import QIcon
 
 from qgis.core import QgsRasterLayer
diff --git a/python/plugins/processing/algs/help/qgis.yaml b/python/plugins/processing/algs/help/qgis.yaml
index 2779b26..c871f30 100644
--- a/python/plugins/processing/algs/help/qgis.yaml
+++ b/python/plugins/processing/algs/help/qgis.yaml
@@ -226,7 +226,7 @@ qgis:meancoordinates: >
   If an attribute is selected in the  <Unique ID  field> parameters, features will be grouped according to values in this field. Instead of a single point with the center of mass of the whole layer, the  output layer will contain a center of mass for the features in each category.
 
 qgis:mergevectorlayers: >
-  This algorithm combines two vector layer of the same geometry type into a single one.
+  This algorithm combines multiple vector layers of the same geometry type into a single one.
 
   If attributes tables are different, the attribute table of the resulting layer will contain the attributes from both input layers
 
diff --git a/python/plugins/processing/algs/lidar/fusion/FusionAlgorithm.py b/python/plugins/processing/algs/lidar/fusion/FusionAlgorithm.py
index ceb81f2..779e704 100644
--- a/python/plugins/processing/algs/lidar/fusion/FusionAlgorithm.py
+++ b/python/plugins/processing/algs/lidar/fusion/FusionAlgorithm.py
@@ -48,7 +48,7 @@ class FusionAlgorithm(GeoAlgorithm):
 
     def addAdvancedModifiers(self):
         param = ParameterString(
-            self.ADVANCED_MODIFIERS, self.tr('Additional modifiers'), '')
+            self.ADVANCED_MODIFIERS, self.tr('Additional modifiers'), '', optional=True)
         param.isAdvanced = True
         self.addParameter(param)
 
diff --git a/python/plugins/processing/algs/qgis/Merge.py b/python/plugins/processing/algs/qgis/Merge.py
index 5df01b6..5c75705 100644
--- a/python/plugins/processing/algs/qgis/Merge.py
+++ b/python/plugins/processing/algs/qgis/Merge.py
@@ -52,13 +52,12 @@ class Merge(GeoAlgorithm):
 
     def processAlgorithm(self, progress):
         inLayers = self.getParameterValue(self.LAYERS)
-        paths = inLayers.split(';')
 
         layers = []
         fields = QgsFields()
         totalFeatureCount = 0
-        for x in xrange(0, len(paths)):
-            layer = QgsVectorLayer(paths[x], unicode(x), 'ogr')
+        for layerSource in inLayers.split(';'):
+            layer = dataobjects.getObjectFromUri(layerSource)
 
             if (len(layers) > 0):
                 if (layer.wkbType() != layers[0].wkbType()):
diff --git a/python/plugins/processing/core/GeoAlgorithm.py b/python/plugins/processing/core/GeoAlgorithm.py
index 3e2a70a..1dc1903 100644
--- a/python/plugins/processing/core/GeoAlgorithm.py
+++ b/python/plugins/processing/core/GeoAlgorithm.py
@@ -213,8 +213,13 @@ class GeoAlgorithm:
             lines = [self.tr('Uncaught error while executing algorithm')]
             lines.append(traceback.format_exc())
             ProcessingLog.addToLog(ProcessingLog.LOG_ERROR, lines)
+            try:
+                message = unicode(e)
+            except UnicodeDecodeError:
+                # Try with the 'replace' mode (requires e.message instead of e!)
+                message = unicode(e.message, 'utf-8', 'replace')
             raise GeoAlgorithmExecutionException(
-                unicode(e.message, errors='replace') + self.tr(u'\nSee log for more details'))
+                message + self.tr(' \nSee log for more details'))
 
     def _checkParameterValuesBeforeExecuting(self):
         for param in self.parameters:
diff --git a/python/plugins/processing/core/ProcessingConfig.py b/python/plugins/processing/core/ProcessingConfig.py
index 2d4d9f8..ca601ff 100644
--- a/python/plugins/processing/core/ProcessingConfig.py
+++ b/python/plugins/processing/core/ProcessingConfig.py
@@ -268,16 +268,15 @@ class Setting:
         self.validator(value)
         self.value = value
 
-    def read(self):
-        qsettings = QSettings()
+    def read(self, qsettings=QSettings()):
         value = qsettings.value(self.qname, None)
         if value is not None:
             if isinstance(self.value, bool):
                 value = unicode(value).lower() == unicode(True).lower()
             self.value = value
 
-    def save(self):
-        QSettings().setValue(self.qname, self.value)
+    def save(self, qsettings=QSettings()):
+        qsettings.setValue(self.qname, self.value)
 
     def __str__(self):
         return self.name + '=' + unicode(self.value)
diff --git a/python/plugins/processing/gui/BatchPanel.py b/python/plugins/processing/gui/BatchPanel.py
index b3bafbf..177693b 100644
--- a/python/plugins/processing/gui/BatchPanel.py
+++ b/python/plugins/processing/gui/BatchPanel.py
@@ -262,7 +262,7 @@ class BatchPanel(BASE, WIDGET):
                         self.parent.lblProgress.setText(
                             self.tr('<b>Missing parameter value: %s (row %d)</b>') % (param.description, row + 1))
                         return
-                    algParams[param.name] = unicode(param.value())
+                    algParams[param.name] = unicode(param.value)
                 col += 1
             for out in alg.outputs:
                 if out.hidden:
diff --git a/python/plugins/processing/gui/ConfigDialog.py b/python/plugins/processing/gui/ConfigDialog.py
index 1171403..54cf4f3 100644
--- a/python/plugins/processing/gui/ConfigDialog.py
+++ b/python/plugins/processing/gui/ConfigDialog.py
@@ -29,7 +29,7 @@ __revision__ = '$Format:%H$'
 import os
 
 from PyQt4 import uic
-from PyQt4.QtCore import Qt, QEvent, QPyNullVariant
+from PyQt4.QtCore import Qt, QEvent, QPyNullVariant, QSettings
 from PyQt4.QtGui import (QFileDialog, QDialog, QIcon, QStyle,
                          QStandardItemModel, QStandardItem, QMessageBox, QStyledItemDelegate,
                          QLineEdit, QWidget, QToolButton, QHBoxLayout,
@@ -139,6 +139,7 @@ class ConfigDialog(BASE, WIDGET):
         self.adjustColumns()
 
     def accept(self):
+        qsettings = QSettings()
         for setting in self.items.keys():
             if isinstance(setting.value, bool):
                 setting.setValue(self.items[setting].checkState() == Qt.Checked)
@@ -149,7 +150,7 @@ class ConfigDialog(BASE, WIDGET):
                     QMessageBox.warning(self, self.tr('Wrong value'),
                                         self.tr('Wrong value for parameter "%s":\n\n%s' % (setting.description, unicode(e))))
                     return
-            setting.save()
+            setting.save(qsettings)
         Processing.updateAlgsList()
 
         QDialog.accept(self)
diff --git a/python/plugins/processing/modeler/ModelerAlgorithm.py b/python/plugins/processing/modeler/ModelerAlgorithm.py
index 91b0f7d..e2dac09 100644
--- a/python/plugins/processing/modeler/ModelerAlgorithm.py
+++ b/python/plugins/processing/modeler/ModelerAlgorithm.py
@@ -491,6 +491,15 @@ class ModelerAlgorithm(GeoAlgorithm):
                             t0 = time.time()
                             alg.algorithm.execute(progress, self)
                             dt = time.time() - t0
+
+                            # copy algorithm output value(s) back to model in case the algorithm modified those
+                            for out in alg.algorithm.outputs:
+                                if not out.hidden:
+                                    if out.name in alg.outputs:
+                                        modelOut = self.getOutputFromName(self.getSafeNameForOutput(alg.name, out.name))
+                                        if modelOut:
+                                            modelOut.value = out.value
+
                             executed.append(alg.name)
                             progress.setDebugInfo(
                                 self.tr('OK. Execution took %0.3f ms (%i outputs).', 'ModelerAlgorithm') % (dt, len(alg.algorithm.outputs)))
diff --git a/python/plugins/processing/script/ScriptAlgorithm.py b/python/plugins/processing/script/ScriptAlgorithm.py
index 00922ef..9e4d571 100644
--- a/python/plugins/processing/script/ScriptAlgorithm.py
+++ b/python/plugins/processing/script/ScriptAlgorithm.py
@@ -278,9 +278,9 @@ class ScriptAlgorithm(GeoAlgorithm):
             out = OutputHTML()
         elif token.lower().strip().startswith('file'):
             out = OutputFile()
-            subtokens = token.split(' ')
-            if len(subtokens) > 2:
-                out.ext = subtokens[2]
+            ext = token.strip()[len('file') + 1:]
+            if ext:
+                out.ext = ext
         elif token.lower().strip().startswith('directory'):
             out = OutputDirectory()
         elif token.lower().strip().startswith('number'):
diff --git a/python/server/qgswmsconfigparser.sip b/python/server/qgswmsconfigparser.sip
index 31be06a..384512d 100644
--- a/python/server/qgswmsconfigparser.sip
+++ b/python/server/qgswmsconfigparser.sip
@@ -109,7 +109,7 @@ class QgsWMSConfigParser
     virtual void setScaleDenominator( double denom ) = 0;
     virtual void addExternalGMLData( const QString& layerName, QDomDocument* gmlDoc ) = 0;
 
-    virtual QList< QPair< QString, QgsLayerCoordinateTransform > > layerCoordinateTransforms() const = 0;
+    // virtual QList< QPair< QString, QgsLayerCoordinateTransform > > layerCoordinateTransforms() const = 0;
 
     virtual int nLayers() const = 0;
 
diff --git a/python/server/qgswmsprojectparser.sip b/python/server/qgswmsprojectparser.sip
index 4d22fc3..a310df4 100644
--- a/python/server/qgswmsprojectparser.sip
+++ b/python/server/qgswmsprojectparser.sip
@@ -63,7 +63,7 @@ class QgsWMSProjectParser : public QgsWMSConfigParser
     void setScaleDenominator( double )  /*override*/;
     void addExternalGMLData( const QString&, QDomDocument* )  /*override*/ ;
 
-    QList< QPair< QString, QgsLayerCoordinateTransform > > layerCoordinateTransforms() const  /*override*/ ;
+    // QList< QPair< QString, QgsLayerCoordinateTransform > > layerCoordinateTransforms() const  /*override*/ ;
 
     /** Fills a layer and a style list. The two list have the same number of entries and the style and the layer at a position belong together (similar to the HTTP parameters 'Layers' and 'Styles'. Returns 0 in case of success*/
     int layersAndStyles( QStringList& layers, QStringList& styles ) const  /*override*/ ;
diff --git a/python/server/server.sip b/python/server/server.sip
index 537cd0b..355d3fa 100644
--- a/python/server/server.sip
+++ b/python/server/server.sip
@@ -1,5 +1,4 @@
 %Module(name=qgis._server,
-        version=0,
         keyword_arguments="Optional")
 
 
diff --git a/scripts/release.pl b/scripts/release.pl
index 4fdd30c..87ded32 100755
--- a/scripts/release.pl
+++ b/scripts/release.pl
@@ -146,7 +146,7 @@ unless( $dopoint ) {
 	print "Pulling transifex translations...\n";
 	run( "scripts/pull_ts.sh", "pull_ts.sh failed" );
 	run( "git add i18n/*.ts", "adding translations failed" );
-	run( "git commit -a -m \"translation update for $release from transifex\"", "could not commit translation updates" );
+	run( "git commit -n -a -m \"translation update for $release from transifex\"", "could not commit translation updates" );
 }
 
 print "Updating changelog...\n";
@@ -155,7 +155,7 @@ run( "scripts/create_changelog.sh", "create_changelog.sh failed" );
 unless( $dopoint ) {
 	run( "scripts/update-news.pl $newmajor $newminor '$release'", "could not update news" ) if $major>2 || ($major==2 && $minor>14);
 
-	run( "git commit -a -m \"changelog and news update for $release\"", "could not commit changelog and news update" );
+	run( "git commit -n -a -m \"changelog and news update for $release\"", "could not commit changelog and news update" );
 
 	print "Creating and checking out branch...\n";
 	run( "git checkout -b $relbranch", "git checkout release branch failed" );
@@ -178,11 +178,11 @@ unless( $dopoint ) {
 		print "WARNING: NO images/splash/splash-release.xcf.bz2\n";
 	}
 
-	run( "git commit -a -m 'Release of $release ($newreleasename)'", "release commit failed" );
+	run( "git commit -n -a -m 'Release of $release ($newreleasename)'", "release commit failed" );
 	run( "git tag $reltag -m 'Version $release'", "release tag failed" );
 	run( "git tag $ltrtag -m 'Long term release $release'", "ltr tag failed" ) if $doltr;
 } else {
-	run( "git commit -a -m 'Release of $version'", "release commit failed" );
+	run( "git commit -n -a -m 'Release of $version'", "release commit failed" );
 	run( "git tag $reltag -m 'Version $version'", "tag failed" );
 }
 
@@ -195,18 +195,19 @@ unless( $dopoint ) {
 
 	print "Updating master...\n";
 	run( "git checkout master", "checkout master failed" );
+
 	updateCMakeLists($newmajor,$newminor,0,"Master");
 	run( "cp /tmp/changelog debian", "restore changelog failed" );
 	run( "dch -r ''", "dch failed" );
 	run( "dch --newversion $newmajor.$newminor.0 'New development version $newmajor.$newminor after branch of $release'", "dch failed" );
-	run( "git commit -a -m 'Bump version to $newmajor.$newminor'", "bump version failed" );
+	run( "git commit -n -a -m 'Bump version to $newmajor.$newminor'", "bump version failed" );
 }
 
 my $topush = ($dopoint ? "" : "master ") . "$relbranch";
 
 print "Push dry-run...\n";
 run( "git push -n --follow-tags origin $topush", "push dry run failed" );
-print "Now manually push and upload the tarballs :\n\tgit push --follow-tags origin $topush\n\trsync qgis-$version.tar.bz2* qgis.org:/var/www/downloads/\n\n";
+print "Now manually push and upload the tarballs :\n\tgit push --follow-tags origin $topush\n\trsync qgis-$version.tar.bz2* ssh.qgis.org:/var/www/downloads/\n\n";
 
 
 =head1 NAME
diff --git a/src/app/qgsfieldsproperties.cpp b/src/app/qgsfieldsproperties.cpp
index c47ef2e..8e35344 100644
--- a/src/app/qgsfieldsproperties.cpp
+++ b/src/app/qgsfieldsproperties.cpp
@@ -903,8 +903,8 @@ void QgsFieldsProperties::apply()
     int idx = mFieldsList->item( i, attrIdCol )->text().toInt();
     FieldConfig cfg = configForRow( i );
 
-    mLayer->editFormConfig()->setReadOnly( i, !cfg.mEditable );
-    mLayer->editFormConfig()->setLabelOnTop( i, cfg.mLabelOnTop );
+    mLayer->editFormConfig()->setReadOnly( idx, !cfg.mEditable );
+    mLayer->editFormConfig()->setLabelOnTop( idx, cfg.mLabelOnTop );
 
     mLayer->editFormConfig()->setWidgetType( idx, cfg.mEditorWidgetV2Type );
     mLayer->editFormConfig()->setWidgetConfig( idx, cfg.mEditorWidgetV2Config );
diff --git a/src/core/geometry/qgscircularstringv2.cpp b/src/core/geometry/qgscircularstringv2.cpp
index c88c4f7..654d0e9 100644
--- a/src/core/geometry/qgscircularstringv2.cpp
+++ b/src/core/geometry/qgscircularstringv2.cpp
@@ -475,14 +475,25 @@ void QgsCircularStringV2::setPoints( const QgsPointSequenceV2 &points )
 
 void QgsCircularStringV2::segmentize( const QgsPointV2& p1, const QgsPointV2& p2, const QgsPointV2& p3, QgsPointSequenceV2 &points ) const
 {
+  bool clockwise = false;
+  int segSide = segmentSide( p1, p3, p2 );
+  if ( segSide == -1 )
+  {
+    clockwise = true;
+  }
+
+  QgsPointV2 circlePoint1 = clockwise ? p3 : p1;
+  QgsPointV2 circlePoint2 = p2;
+  QgsPointV2 circlePoint3 = clockwise ? p1 : p3 ;
+
   //adapted code from postgis
   double radius = 0;
   double centerX = 0;
   double centerY = 0;
-  QgsGeometryUtils::circleCenterRadius( p1, p2, p3, radius, centerX, centerY );
-  int segSide = segmentSide( p1, p3, p2 );
+  QgsGeometryUtils::circleCenterRadius( circlePoint1, circlePoint2, circlePoint3, radius, centerX, centerY );
 
-  if ( p1 != p3 && ( radius < 0 || qgsDoubleNear( segSide, 0.0 ) ) ) //points are colinear
+
+  if ( circlePoint1 != circlePoint3 && ( radius < 0 || qgsDoubleNear( segSide, 0.0 ) ) ) //points are colinear
   {
     points.append( p1 );
     points.append( p2 );
@@ -490,36 +501,18 @@ void QgsCircularStringV2::segmentize( const QgsPointV2& p1, const QgsPointV2& p2
     return;
   }
 
-  bool clockwise = false;
-  if ( segSide == -1 )
-  {
-    clockwise = true;
-  }
-
   double increment = fabs( M_PI_2 / 90 ); //one segment per degree
 
   //angles of pt1, pt2, pt3
-  double a1 = atan2( p1.y() - centerY, p1.x() - centerX );
-  double a2 = atan2( p2.y() - centerY, p2.x() - centerX );
-  double a3 = atan2( p3.y() - centerY, p3.x() - centerX );
+  double a1 = atan2( circlePoint1.y() - centerY, circlePoint1.x() - centerX );
+  double a2 = atan2( circlePoint2.y() - centerY, circlePoint2.x() - centerX );
+  double a3 = atan2( circlePoint3.y() - centerY, circlePoint3.x() - centerX );
 
-  if ( clockwise )
-  {
-    increment *= -1;
-    /* Adjust a3 down so we can decrement from a1 to a3 cleanly */
-    if ( a3 >= a1 )
-      a3 -= 2.0 * M_PI;
-    if ( a2 > a1 )
-      a2 -= 2.0 * M_PI;
-  }
-  else
-  {
-    /* Adjust a3 up so we can increment from a1 to a3 cleanly */
-    if ( a3 <= a1 )
-      a3 += 2.0 * M_PI;
-    if ( a2 < a1 )
-      a2 += 2.0 * M_PI;
-  }
+  /* Adjust a3 up so we can increment from a1 to a3 cleanly */
+  if ( a3 <= a1 )
+    a3 += 2.0 * M_PI;
+  if ( a2 < a1 )
+    a2 += 2.0 * M_PI;
 
   bool hasZ = is3D();
   bool hasM = isMeasure();
@@ -528,8 +521,9 @@ void QgsCircularStringV2::segmentize( const QgsPointV2& p1, const QgsPointV2& p2
   double z = 0;
   double m = 0;
 
-  points.append( p1 );
-  if ( p2 != p3 && p1 != p2 ) //draw straight line segment if two points have the same position
+  QList<QgsPointV2> stringPoints;
+  stringPoints.insert( clockwise ? 0 : stringPoints.size(), circlePoint1 );
+  if ( circlePoint2 != circlePoint3 && circlePoint1 != circlePoint2 ) //draw straight line segment if two points have the same position
   {
     QgsWKBTypes::Type pointWkbType = QgsWKBTypes::Point;
     if ( hasZ )
@@ -537,30 +531,44 @@ void QgsCircularStringV2::segmentize( const QgsPointV2& p1, const QgsPointV2& p2
     if ( hasM )
       pointWkbType = QgsWKBTypes::addM( pointWkbType );
 
-    for ( double angle = a1 + increment; clockwise ? angle > a3 : angle < a3; angle += increment )
+    //make sure the curve point p2 is part of the segmentized vertices. But only if p1 != p3
+    bool addP2 = true;
+    if ( qgsDoubleNear( circlePoint1.x(), circlePoint3.x() ) && qgsDoubleNear( circlePoint1.y(), circlePoint3.y() ) )
     {
+      addP2 = false;
+    }
+
+    for ( double angle = a1 + increment; angle < a3; angle += increment )
+    {
+      if (( addP2 && angle > a2 ) )
+      {
+        stringPoints.insert( clockwise ? 0 : stringPoints.size(), circlePoint2 );
+        addP2 = false;
+      }
+
       x = centerX + radius * cos( angle );
       y = centerY + radius * sin( angle );
 
       if ( !hasZ && !hasM )
       {
-        points.append( QgsPointV2( x, y ) );
+        stringPoints.insert( clockwise ? 0 : stringPoints.size(), QgsPointV2( x, y ) );
         continue;
       }
 
       if ( hasZ )
       {
-        z = interpolateArc( angle, a1, a2, a3, p1.z(), p2.z(), p3.z() );
+        z = interpolateArc( angle, a1, a2, a3, circlePoint1.z(), circlePoint2.z(), circlePoint3.z() );
       }
       if ( hasM )
       {
-        m = interpolateArc( angle, a1, a2, a3, p1.m(), p2.m(), p3.m() );
+        m = interpolateArc( angle, a1, a2, a3, circlePoint1.m(), circlePoint2.m(), circlePoint3.m() );
       }
 
-      points.append( QgsPointV2( pointWkbType, x, y, z, m ) );
+      stringPoints.insert( clockwise ? 0 : stringPoints.size(), QgsPointV2( pointWkbType, x, y, z, m ) );
     }
   }
-  points.append( p3 );
+  stringPoints.insert( clockwise ? 0 : stringPoints.size(), circlePoint3 );
+  points.append( stringPoints );
 }
 
 int QgsCircularStringV2::segmentSide( const QgsPointV2& pt1, const QgsPointV2& pt3, const QgsPointV2& pt2 ) const
diff --git a/src/core/qgsapplication.cpp b/src/core/qgsapplication.cpp
index 00ea9d6..745025b 100644
--- a/src/core/qgsapplication.cpp
+++ b/src/core/qgsapplication.cpp
@@ -396,7 +396,7 @@ QString QgsApplication::activeThemePath()
 
 QString QgsApplication::appIconPath()
 {
-  return QString( "qgis-icon-60x60.png" );
+  return iconsPath() + "qgis-icon-60x60.png";
 }
 
 QString QgsApplication::iconPath( const QString& iconFile )
@@ -702,8 +702,20 @@ QStringList QgsApplication::svgPaths()
     myPathList = myPaths.split( '|' );
   }
 
-  myPathList << ABISYM( mDefaultSvgPaths );
-  return myPathList;
+  // maintain user set order while stripping duplicates
+  QStringList paths;
+  Q_FOREACH ( const QString& path, myPathList )
+  {
+    if ( !paths.contains( path ) )
+      paths.append( path );
+  }
+  Q_FOREACH ( const QString& path, ABISYM( mDefaultSvgPaths ) )
+  {
+    if ( !paths.contains( path ) )
+      paths.append( path );
+  }
+
+  return paths;
 }
 
 /*!
diff --git a/src/core/qgsogcutils.cpp b/src/core/qgsogcutils.cpp
index 46e254b..fe2018c 100644
--- a/src/core/qgsogcutils.cpp
+++ b/src/core/qgsogcutils.cpp
@@ -19,6 +19,7 @@
 #include "qgsgeometry.h"
 #include "qgswkbptr.h"
 #include "qgscoordinatereferencesystem.h"
+#include "qgslogger.h"
 
 #include <QColor>
 #include <QStringList>
@@ -1584,6 +1585,16 @@ QgsExpression* QgsOgcUtils::expressionFromOgcFilter( const QDomElement& element
   if ( element.isNull() || !element.hasChildNodes() )
     return nullptr;
 
+  // check if it is a single string value => no DomElement
+  if ( element.firstChild().nodeType() == QDomNode::TextNode )
+  {
+    QgsExpression *expr = new QgsExpression( element.firstChild().nodeValue() );
+    expr->d->mParserErrorString = QString();
+    return expr;
+  }
+
+  // now parse OGC operators. OGC operator does not have a only text value
+  // but only sub element operators
   QgsExpression *expr = new QgsExpression();
 
   QDomElement childElem = element.firstChildElement();
diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp
index f5da116..088a34f 100644
--- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp
+++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp
@@ -2576,6 +2576,7 @@ bool QgsSymbolLayerV2Utils::createFunctionElement( QDomDocument &doc, QDomElemen
 
 bool QgsSymbolLayerV2Utils::functionFromSldElement( QDomElement &element, QString &function )
 {
+  // check if ogc:Filter or containe ogc:Filters
   QDomElement elem = element;
   if ( element.tagName() != "Filter" )
   {
@@ -2591,7 +2592,7 @@ bool QgsSymbolLayerV2Utils::functionFromSldElement( QDomElement &element, QStrin
     return false;
   }
 
-
+  // parse ogc:Filter
   QgsExpression *expr = QgsOgcUtils::expressionFromOgcFilter( elem );
   if ( !expr )
     return false;
@@ -2655,6 +2656,7 @@ QDomElement QgsSymbolLayerV2Utils::createSvgParameterElement( QDomDocument &doc,
 QgsStringMap QgsSymbolLayerV2Utils::getSvgParameterList( QDomElement &element )
 {
   QgsStringMap params;
+  QString value;
 
   QDomElement paramElem = element.firstChildElement();
   while ( !paramElem.isNull() )
@@ -2662,7 +2664,23 @@ QgsStringMap QgsSymbolLayerV2Utils::getSvgParameterList( QDomElement &element )
     if ( paramElem.localName() == "SvgParameter" || paramElem.localName() == "CssParameter" )
     {
       QString name = paramElem.attribute( "name" );
-      QString value = paramElem.firstChild().nodeValue();
+      if ( paramElem.firstChild().nodeType() == QDomNode::TextNode )
+      {
+        value = paramElem.firstChild().nodeValue();
+      }
+      else
+      {
+        if ( paramElem.firstChild().nodeType() == QDomNode::ElementNode &&
+             paramElem.firstChild().localName() == "Literal" )
+        {
+          QgsDebugMsg( paramElem.firstChild().localName() );
+          value = paramElem.firstChild().firstChild().nodeValue();
+        }
+        else
+        {
+          QgsDebugMsg( QString( "unexpected child of %1" ).arg( paramElem.localName() ) );
+        }
+      }
 
       if ( !name.isEmpty() && !value.isEmpty() )
         params[ name ] = value;
diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp
index 7308b05..277c51c 100644
--- a/src/gui/qgsmapcanvas.cpp
+++ b/src/gui/qgsmapcanvas.cpp
@@ -1142,6 +1142,7 @@ void QgsMapCanvas::panToSelected( QgsVectorLayer* layer )
   if ( !rect.isNull() )
   {
     setCenter( rect.center() );
+    refresh();
   }
   else
   {
diff --git a/src/server/qgsserver.cpp b/src/server/qgsserver.cpp
index 08fc56d..e26d34c 100644
--- a/src/server/qgsserver.cpp
+++ b/src/server/qgsserver.cpp
@@ -198,18 +198,18 @@ void QgsServer::printRequestParameters( const QMap< QString, QString>& parameter
  */
 void QgsServer::printRequestInfos()
 {
-  QgsMessageLog::logMessage( QStringLiteral( "******************** New request ***************" ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
+  QgsMessageLog::logMessage( "******************** New request ***************", "Server", QgsMessageLog::INFO );
   if ( getenv( "REMOTE_ADDR" ) )
   {
-    QgsMessageLog::logMessage( "REMOTE_ADDR: " + QString( getenv( "REMOTE_ADDR" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
+    QgsMessageLog::logMessage( "REMOTE_ADDR: " + QString( getenv( "REMOTE_ADDR" ) ), "Server", QgsMessageLog::INFO );
   }
   if ( getenv( "REMOTE_HOST" ) )
   {
-    QgsMessageLog::logMessage( "REMOTE_HOST: " + QString( getenv( "REMOTE_HOST" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
+    QgsMessageLog::logMessage( "REMOTE_HOST: " + QString( getenv( "REMOTE_HOST" ) ), "Server", QgsMessageLog::INFO );
   }
   if ( getenv( "REMOTE_USER" ) )
   {
-    QgsMessageLog::logMessage( "REMOTE_USER: " + QString( getenv( "REMOTE_USER" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
+    QgsMessageLog::logMessage( "REMOTE_USER: " + QString( getenv( "REMOTE_USER" ) ), "Server", QgsMessageLog::INFO );
   }
   if ( getenv( "REMOTE_IDENT" ) )
   {
@@ -241,7 +241,7 @@ void QgsServer::printRequestInfos()
   }
   if ( getenv( "HTTP_AUTHORIZATION" ) )
   {
-    QgsMessageLog::logMessage( "HTTP_AUTHORIZATION: " + QString( getenv( "HTTP_AUTHORIZATION" ) ), QStringLiteral( "Server" ), QgsMessageLog::INFO );
+    QgsMessageLog::logMessage( "HTTP_AUTHORIZATION: " + QString( getenv( "HTTP_AUTHORIZATION" ) ), "Server", QgsMessageLog::INFO );
   }
 }
 
diff --git a/src/server/qgswmsconfigparser.cpp b/src/server/qgswmsconfigparser.cpp
index 6a7d890..bcd05a9 100644
--- a/src/server/qgswmsconfigparser.cpp
+++ b/src/server/qgswmsconfigparser.cpp
@@ -180,6 +180,7 @@ QgsComposition* QgsWMSConfigParser::createPrintComposition( const QString& compo
     //grid space x / y
     currentMap->grid()->setIntervalX( parameterMap.value( mapId + ":GRID_INTERVAL_X" ).toDouble() );
     currentMap->grid()->setIntervalY( parameterMap.value( mapId + ":GRID_INTERVAL_Y" ).toDouble() );
+    currentMap->grid()->setEnabled( currentMap->grid()->intervalX() != 0.0 && currentMap->grid()->intervalY() != 0.0 );
   }
   //update legend
   // if it has an auto-update model
diff --git a/tests/src/python/CMakeLists.txt b/tests/src/python/CMakeLists.txt
index eb66174..f45d01d 100644
--- a/tests/src/python/CMakeLists.txt
+++ b/tests/src/python/CMakeLists.txt
@@ -67,6 +67,7 @@ ADD_PYTHON_TEST(PyQgsSpatialIndex test_qgsspatialindex.py)
 ADD_PYTHON_TEST(PyQgsSpatialiteProvider test_provider_spatialite.py)
 ADD_PYTHON_TEST(PyQgsSymbolLayerV2 test_qgssymbollayerv2.py)
 ADD_PYTHON_TEST(PyQgsSymbolLayerV2CreateSld test_qgssymbollayerv2_createsld.py)
+ADD_PYTHON_TEST(PyQgsSymbolLayerReadSld test_qgssymbollayerv2_readsld.py)
 ADD_PYTHON_TEST(PyQgsSymbolExpressionVariables test_qgssymbolexpressionvariables.py)
 ADD_PYTHON_TEST(PyQgsSyntacticSugar test_syntactic_sugar.py)
 ADD_PYTHON_TEST(PyQgsSymbolV2 test_qgssymbolv2.py)
diff --git a/tests/src/python/test_qgsserver.py b/tests/src/python/test_qgsserver.py
index f5e58a9..f96cdb7 100644
--- a/tests/src/python/test_qgsserver.py
+++ b/tests/src/python/test_qgsserver.py
@@ -362,6 +362,323 @@ class TestQgsServer(unittest.TestCase):
         for id, req in tests:
             self.wfs_getfeature_post_compare(id, req)
 
+    def test_wms_getmap_basic(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_Basic")
+
+    def test_wms_getmap_transparent(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857",
+            "TRANSPARENT": "TRUE"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_Transparent")
+
+    def test_wms_getmap_background(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857",
+            "BGCOLOR": "green"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_Background")
+
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857",
+            "BGCOLOR": "0x008000"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_Background_Hex")
+
+    def test_wms_getmap_order(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Hello,Country",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_LayerOrder")
+
+    def test_wms_getmap_srs(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country,Hello",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-151.7,-38.9,51.0,78.0",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:4326"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_SRS")
+
+    def test_wms_getmap_style(self):
+      # default style
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country_Labels",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_StyleDefault")
+
+      # custom style
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country_Labels",
+            "STYLES": "custom",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_StyleCustom")
+
+    def test_wms_getmap_filter(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country,Hello",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857",
+            "FILTER": "Country:\"name\" = 'eurasia'"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_Filter")
+
+    def test_wms_getmap_selection(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country,Hello",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "SRS": "EPSG:3857",
+            "SELECTION": "Country: 4"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_Selection")
+
+    def test_wms_getmap_opacities(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetMap",
+            "LAYERS": "Country,Hello",
+            "STYLES": "",
+            "FORMAT": "image/png",
+            "BBOX": "-16817707,-4710778,5696513,14587125",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857",
+            "OPACITIES": "125, 50"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetMap_Opacities")
+
+    def test_wms_getprint_basic(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetPrint",
+            "TEMPLATE": "layoutA4",
+            "FORMAT": "png",
+            "map0:EXTENT": "-33626185.498,-13032965.185,33978427.737,16020257.031",
+            "map0:LAYERS": "Hello,Country",  # inverted
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetPrint_Basic")
+
+    def test_wms_getprint_srs(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetPrint",
+            "TEMPLATE": "layoutA4",
+            "FORMAT": "png",
+            "map0:EXTENT": "-309.015,-133.011,312.179,133.949",
+            "map0:LAYERS": "Hello,Country",  # inverted
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:4326"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetPrint_SRS")
+
+    def test_wms_getprint_scale(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetPrint",
+            "TEMPLATE": "layoutA4",
+            "FORMAT": "png",
+            "map0:EXTENT": "-33626185.498,-13032965.185,33978427.737,16020257.031",
+            "map0:LAYERS": "Hello,Country",  # inverted
+            "map0:SCALE": "36293562",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetPrint_Scale")
+
+    def test_wms_getprint_grid(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetPrint",
+            "TEMPLATE": "layoutA4",
+            "FORMAT": "png",
+            "map0:EXTENT": "-33626185.498,-13032965.185,33978427.737,16020257.031",
+            "map0:LAYERS": "Hello,Country",  # inverted
+            "map0:GRID_INTERVAL_X": "1000000",
+            "map0:GRID_INTERVAL_Y": "2000000",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetPrint_Grid")
+
+    def test_wms_getprint_rotation(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetPrint",
+            "TEMPLATE": "layoutA4",
+            "FORMAT": "png",
+            "map0:EXTENT": "-33626185.498,-13032965.185,33978427.737,16020257.031",
+            "map0:LAYERS": "Hello,Country",  # inverted
+            "map0:ROTATION": "45",
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetPrint_Rotation")
+
+    def test_wms_getprint_selection(self):
+        qs = "&".join(["%s=%s" % i for i in list({
+            "MAP": urllib.quote(self.projectPath),
+            "SERVICE": "WMS",
+            "VERSION": "1.1.1",
+            "REQUEST": "GetPrint",
+            "TEMPLATE": "layoutA4",
+            "FORMAT": "png",
+            "map0:EXTENT": "-33626185.498,-13032965.185,33978427.737,16020257.031",
+            "map0:LAYERS": "Hello,Country",  # inverted
+            "HEIGHT": "500",
+            "WIDTH": "500",
+            "CRS": "EPSG:3857",
+            "SELECTION": "Country: 4"
+        }.items())])
+
+        r, h = self._result(self.server.handleRequest(qs))
+        self._img_diff_error(r, h, "WMS_GetPrint_Selection")
+
     def test_getLegendGraphics(self):
         """Test that does not return an exception but an image"""
         parms = {
diff --git a/tests/src/python/test_qgssymbollayerv2_readsld.py b/tests/src/python/test_qgssymbollayerv2_readsld.py
new file mode 100644
index 0000000..201ceef
--- /dev/null
+++ b/tests/src/python/test_qgssymbollayerv2_readsld.py
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+
+"""
+***************************************************************************
+    test_qgssymbollayerv2_readsld.py
+    ---------------------
+    Date                 : January 2017
+    Copyright            : (C) 2017, Jorge Gustavo Rocha
+    Email                : jgr at di dot uminho dot pt
+***************************************************************************
+*                                                                         *
+*   This program is free software; you can redistribute it and/or modify  *
+*   it under the terms of the GNU General Public License as published by  *
+*   the Free Software Foundation; either version 2 of the License, or     *
+*   (at your option) any later version.                                   *
+*                                                                         *
+***************************************************************************
+"""
+
+__author__ = 'Jorge Gustavo Rocha'
+__date__ = 'January 2017'
+__copyright__ = '(C) 2017, Jorge Gustavo Rocha'
+# This will get replaced with a git SHA1 when you do a git archive
+__revision__ = '$Format:%H$'
+
+import qgis  # NOQA
+
+import os
+from qgis.testing import start_app, unittest
+from qgis.core import (QgsVectorLayer,
+                       QgsFeature,
+                       QgsGeometry,
+                       QgsPoint
+                       )
+from qgis.testing import unittest
+from qgis.testing.mocked import get_iface
+from utilities import unitTestDataPath
+
+start_app()
+
+TEST_DATA_DIR = unitTestDataPath()
+
+
+def createLayerWithOneLine():
+    # create a temporary layer
+    # linelayer = iface.addVectorLayer("LineString?crs=epsg:4326&field=gid:int&field=name:string", "simple_line", "memory")
+    linelayer = QgsVectorLayer("LineString?crs=epsg:4326&field=gid:int&field=name:string", "simple_line", "memory")
+    one = QgsFeature(linelayer.dataProvider().fields(), 0)
+    one.setAttributes([1, 'one'])
+    one.setGeometry(QgsGeometry.fromPolyline([QgsPoint(-7, 38), QgsPoint(-8, 42)]))
+    linelayer.dataProvider().addFeatures([one])
+    return linelayer
+
+
+class TestQgsSymbolLayerReadSld(unittest.TestCase):
+
+    """
+    This class checks if SLD styles are properly applied
+    """
+
+    def setUp(self):
+        self.iface = get_iface()
+
+    # test <CSSParameter>VALUE<CSSParameter/>
+    # test <CSSParameter><ogc:Literal>VALUE<ogc:Literal/><CSSParameter/>
+    def test_Literal_within_CSSParameter(self):
+        layer = createLayerWithOneLine()
+        mFilePath = os.path.join(TEST_DATA_DIR, 'symbol_layer/external_sld/simple_streams.sld')
+        layer.loadSldStyle(mFilePath)
+        props = layer.rendererV2().symbol().symbolLayers()[0].properties()
+
+        def testLineColor():
+            # stroke CSSParameter within ogc:Literal
+            # expected color is #003EBA, RGB 0,62,186
+            self.assertEqual(layer.rendererV2().symbol().symbolLayers()[0].color().name(), '#003eba')
+
+        def testLineWidth():
+            # stroke-width CSSParameter within ogc:Literal
+            self.assertEqual(props['line_width'], '2')
+
+        def testLineOpacity():
+            # stroke-opacity CSSParameter NOT within ogc:Literal
+            # stroke-opacity=0.1
+            self.assertEqual(props['line_color'], '0,62,186,25')
+
+        testLineColor()
+        testLineWidth()
+        testLineOpacity()
+
+    def testSimpleMarkerRotation(self):
+        """
+        Test if pointMarker property sld:Rotation value can be read if format is:
+        <sld:Rotation>50.0</sld:Rotation>
+        or
+        <se:Rotation><ogc:Literal>50</ogc:Literal></se:Rotation>
+        """
+        # technically it's not necessary to use a real shape, but a empty memory
+        # layer. In case these tests will upgrate to a rendering where to
+        # compare also rendering not only properties
+        #myShpFile = os.path.join(unitTestDataPath(), 'points.shp')
+        #layer = QgsVectorLayer(myShpFile, 'points', 'ogr')
+        layer = QgsVectorLayer("Point", "addfeat", "memory")
+        assert(layer.isValid())
+        # test if able to read <sld:Rotation>50.0</sld:Rotation>
+        mFilePath = os.path.join(unitTestDataPath(), 'symbol_layer/external_sld/testSimpleMarkerRotation-directValue.sld')
+        layer.loadSldStyle(mFilePath)
+        props = layer.rendererV2().symbol().symbolLayers()[0].properties()
+        self.assertEqual(props['angle'], '50')
+        # test if able to read <se:Rotation><ogc:Literal>50</ogc:Literal></se:Rotation>
+        mFilePath = os.path.join(unitTestDataPath(), 'symbol_layer/external_sld/testSimpleMarkerRotation-ogcLiteral.sld')
+        layer.loadSldStyle(mFilePath)
+        props = layer.rendererV2().symbol().symbolLayers()[0].properties()
+        self.assertEqual(props['angle'], '50')
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_Background/WMS_GetMap_Background.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_Background/WMS_GetMap_Background.png
new file mode 100644
index 0000000..3692284
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_Background/WMS_GetMap_Background.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_Background_Hex/WMS_GetMap_Background_Hex.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_Background_Hex/WMS_GetMap_Background_Hex.png
new file mode 100644
index 0000000..3692284
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_Background_Hex/WMS_GetMap_Background_Hex.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_Basic/WMS_GetMap_Basic.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_Basic/WMS_GetMap_Basic.png
new file mode 100644
index 0000000..085c529
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_Basic/WMS_GetMap_Basic.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_Filter/WMS_GetMap_Filter.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_Filter/WMS_GetMap_Filter.png
new file mode 100644
index 0000000..58bcd9e
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_Filter/WMS_GetMap_Filter.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_LayerOrder/WMS_GetMap_LayerOrder.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_LayerOrder/WMS_GetMap_LayerOrder.png
new file mode 100644
index 0000000..b6c9277
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_LayerOrder/WMS_GetMap_LayerOrder.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_Opacities/WMS_GetMap_Opacities.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_Opacities/WMS_GetMap_Opacities.png
new file mode 100644
index 0000000..b02aee9
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_Opacities/WMS_GetMap_Opacities.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_SRS/WMS_GetMap_SRS.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_SRS/WMS_GetMap_SRS.png
new file mode 100644
index 0000000..1dd0cb9
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_SRS/WMS_GetMap_SRS.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_Selection/WMS_GetMap_Selection.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_Selection/WMS_GetMap_Selection.png
new file mode 100644
index 0000000..54fe431
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_Selection/WMS_GetMap_Selection.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleCustom/WMS_GetMap_StyleCustom.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleCustom/WMS_GetMap_StyleCustom.png
new file mode 100644
index 0000000..00e00a5
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleCustom/WMS_GetMap_StyleCustom.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleCustom/WMS_GetMap_StyleCustom_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleCustom/WMS_GetMap_StyleCustom_mask.png
new file mode 100644
index 0000000..5a61972
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleCustom/WMS_GetMap_StyleCustom_mask.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleDefault/WMS_GetMap_StyleDefault.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleDefault/WMS_GetMap_StyleDefault.png
new file mode 100644
index 0000000..2dd85da
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleDefault/WMS_GetMap_StyleDefault.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleDefault/WMS_GetMap_StyleDefault_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleDefault/WMS_GetMap_StyleDefault_mask.png
new file mode 100644
index 0000000..ff4ebc2
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_StyleDefault/WMS_GetMap_StyleDefault_mask.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_Transparent/WMS_GetMap_Transparent.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_Transparent/WMS_GetMap_Transparent.png
new file mode 100644
index 0000000..6526eb5
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_Transparent/WMS_GetMap_Transparent.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetMap_Transparent/WMS_GetMap_Transparent_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetMap_Transparent/WMS_GetMap_Transparent_mask.png
new file mode 100644
index 0000000..bfc13a0
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetMap_Transparent/WMS_GetMap_Transparent_mask.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Basic/WMS_GetPrint_Basic.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Basic/WMS_GetPrint_Basic.png
new file mode 100644
index 0000000..fa16ea4
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Basic/WMS_GetPrint_Basic.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Basic/WMS_GetPrint_Basic_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Basic/WMS_GetPrint_Basic_mask.png
new file mode 100644
index 0000000..4d13a81
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Basic/WMS_GetPrint_Basic_mask.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Grid/WMS_GetPrint_Grid.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Grid/WMS_GetPrint_Grid.png
new file mode 100644
index 0000000..5e67c3e
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Grid/WMS_GetPrint_Grid.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Grid/WMS_GetPrint_Grid_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Grid/WMS_GetPrint_Grid_mask.png
new file mode 100644
index 0000000..4d13a81
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Grid/WMS_GetPrint_Grid_mask.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Rotation/WMS_GetPrint_Rotation.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Rotation/WMS_GetPrint_Rotation.png
new file mode 100644
index 0000000..45be394
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Rotation/WMS_GetPrint_Rotation.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Rotation/WMS_GetPrint_Rotation_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Rotation/WMS_GetPrint_Rotation_mask.png
new file mode 100644
index 0000000..4d13a81
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Rotation/WMS_GetPrint_Rotation_mask.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_SRS/WMS_GetPrint_SRS.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_SRS/WMS_GetPrint_SRS.png
new file mode 100644
index 0000000..0c10133
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_SRS/WMS_GetPrint_SRS.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_SRS/WMS_GetPrint_SRS_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_SRS/WMS_GetPrint_SRS_mask.png
new file mode 100644
index 0000000..4d13a81
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_SRS/WMS_GetPrint_SRS_mask.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Scale/WMS_GetPrint_Scale.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Scale/WMS_GetPrint_Scale.png
new file mode 100644
index 0000000..f2736c0
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Scale/WMS_GetPrint_Scale.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Scale/WMS_GetPrint_Scale_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Scale/WMS_GetPrint_Scale_mask.png
new file mode 100644
index 0000000..4d13a81
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Scale/WMS_GetPrint_Scale_mask.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Selection/WMS_GetPrint_Selection.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Selection/WMS_GetPrint_Selection.png
new file mode 100644
index 0000000..fa16ea4
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Selection/WMS_GetPrint_Selection.png differ
diff --git a/tests/testdata/control_images/qgis_server/WMS_GetPrint_Selection/WMS_GetPrint_Selection_mask.png b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Selection/WMS_GetPrint_Selection_mask.png
new file mode 100644
index 0000000..4d13a81
Binary files /dev/null and b/tests/testdata/control_images/qgis_server/WMS_GetPrint_Selection/WMS_GetPrint_Selection_mask.png differ
diff --git a/tests/testdata/geom_data.csv b/tests/testdata/geom_data.csv
index 2e24f87..d009d4f 100644
--- a/tests/testdata/geom_data.csv
+++ b/tests/testdata/geom_data.csv
@@ -1,22 +1,22 @@
 wkt,valid_wkt,num_points,length,area,perimeter,num_geometries,num_rings,is_closed,centroid,x_min,y_min,x_max,y_max,notes
-"CIRCULARSTRING(268 415,227 505,227 406)","CIRCULARSTRING(268 415,227 505,227 406)",3,274.8154245399,0,0,1,0,0,Point (235.96400242068907005 463.05287766717373188),186.9951218925,406,288.2487805466,506.126829327,
-"CIRCULARSTRINGZ(268 415 1,227 505 2,227 406 3)","CIRCULARSTRINGZ(268 415 1,227 505 2,227 406 3)",3,274.8154245399,0,0,1,0,0,Point (235.96400242068907005 463.05287766717373188),186.9951218925,406,288.2487805466,506.126829327,
-"CIRCULARSTRINGM(268 415 4,227 505 5,227 406 6)","CIRCULARSTRINGM(268 415 4,227 505 5,227 406 6)",3,274.8154245399,0,0,1,0,0,Point (235.96400242068907005 463.05287766717373188),186.9951218925,406,288.2487805466,506.126829327,
-"CIRCULARSTRINGZM(268 415 1 6,227 505 2 8,227 406 3 9)","CIRCULARSTRINGZM(268 415 1 6,227 505 2 8,227 406 3 9)",3,274.8154245399,0,0,1,0,0,Point (235.96400242068907005 463.05287766717373188),186.9951218925,406,288.2487805466,506.126829327,
-"CIRCULARSTRING(268 415 1,227 505 2,227 406 3)","CIRCULARSTRINGZ(268 415 1,227 505 2,227 406 3)",3,274.8154245399,0,0,1,0,0,Point (235.96400242068907005 463.05287766717373188),186.9951218925,406,288.2487805466,506.126829327,"z coordinate, but geometry not explicitly marked as such. Should be upgraded to have Z dimension"
-"CIRCULARSTRING(268 415 1 6,227 505 2 8,227 406 3 9)","CIRCULARSTRINGZM(268 415 1 6,227 505 2 8,227 406 3 9)",3,274.8154245399,0,0,1,0,0,Point (235.96400242068907005 463.05287766717373188),186.9951218925,406,288.2487805466,506.126829327,"4d coordinates, but geometry not explicitly marked as such. Should be upgraded to have ZM dimension"
+"CIRCULARSTRING(268 415,227 505,227 406)","CIRCULARSTRING(268 415,227 505,227 406)",3,274.8154245399,0,0,1,0,0,Point (235.96400173900246955 463.05288079882393504),186.9951218925,406,288.2487805466,506.126829327,
+"CIRCULARSTRINGZ(268 415 1,227 505 2,227 406 3)","CIRCULARSTRINGZ(268 415 1,227 505 2,227 406 3)",3,274.8154245399,0,0,1,0,0,Point (235.96400173900246955 463.05288079882393504),186.9951218925,406,288.2487805466,506.126829327,
+"CIRCULARSTRINGM(268 415 4,227 505 5,227 406 6)","CIRCULARSTRINGM(268 415 4,227 505 5,227 406 6)",3,274.8154245399,0,0,1,0,0,Point (235.96400173900246955 463.05288079882393504),186.9951218925,406,288.2487805466,506.126829327,
+"CIRCULARSTRINGZM(268 415 1 6,227 505 2 8,227 406 3 9)","CIRCULARSTRINGZM(268 415 1 6,227 505 2 8,227 406 3 9)",3,274.8154245399,0,0,1,0,0,Point (235.96400173900246955 463.05288079882393504),186.9951218925,406,288.2487805466,506.126829327,
+"CIRCULARSTRING(268 415 1,227 505 2,227 406 3)","CIRCULARSTRINGZ(268 415 1,227 505 2,227 406 3)",3,274.8154245399,0,0,1,0,0,Point (235.96400173900246955 463.05288079882393504),186.9951218925,406,288.2487805466,506.126829327,"z coordinate, but geometry not explicitly marked as such. Should be upgraded to have Z dimension"
+"CIRCULARSTRING(268 415 1 6,227 505 2 8,227 406 3 9)","CIRCULARSTRINGZM(268 415 1 6,227 505 2 8,227 406 3 9)",3,274.8154245399,0,0,1,0,0,Point (235.96400173900246955 463.05288079882393504),186.9951218925,406,288.2487805466,506.126829327,"4d coordinates, but geometry not explicitly marked as such. Should be upgraded to have ZM dimension"
 "COMPOUNDCURVE((5 3, 5 13), CIRCULARSTRING(5 13, 7 15, 9 13), (9 13, 9 3), CIRCULARSTRING(9 3, 7 1, 5 3))","COMPOUNDCURVE((5 3, 5 13), CIRCULARSTRING(5 13, 7 15, 9 13), (9 13, 9 3), CIRCULARSTRING(9 3, 7 1, 5 3))",7,32.5663706144,0,0,1,0,1,POINT(7 8),5,1,9,15,Unsure about accuracy of numpoints – PostGIS reports 10 for same geometry
 "COMPOUNDCURVEZ((5 3 1, 5 13 2), CIRCULARSTRINGZ(5 13 2, 7 15 3, 9 13 4), (9 13 4, 9 3 5), CIRCULARSTRINGZ(9 3 5, 7 1 6, 5 3 1))","COMPOUNDCURVEZ((5 3 1, 5 13 2), CIRCULARSTRINGZ(5 13 2, 7 15 3, 9 13 4), (9 13 4, 9 3 5), CIRCULARSTRINGZ(9 3 5, 7 1 6, 5 3 1))",7,32.5663706144,0,0,1,0,1,POINT(7 8),5,1,9,15,Unsure about accuracy of numpoints – PostGIS reports 10 for same geometry
 "COMPOUNDCURVEM((5 3 1, 5 13 2), CIRCULARSTRINGM(5 13 2, 7 15 3, 9 13 4), (9 13 4, 9 3 5), CIRCULARSTRINGM(9 3 5, 7 1 6, 5 3 1))","COMPOUNDCURVEM((5 3 1, 5 13 2), CIRCULARSTRINGM(5 13 2, 7 15 3, 9 13 4), (9 13 4, 9 3 5), CIRCULARSTRINGM(9 3 5, 7 1 6, 5 3 1))",7,32.5663706144,0,0,1,0,1,POINT(7 8),5,1,9,15,Unsure about accuracy of numpoints – PostGIS reports 10 for same geometry
 "COMPOUNDCURVEZM((5 3 1 11, 5 13 2 12), CIRCULARSTRINGZM(5 13 2 12, 7 15 3 13, 9 13 4 14), (9 13 4 14, 9 3 5 15), CIRCULARSTRINGZM(9 3 5 15, 7 1 6 16, 5 3 1 11))","COMPOUNDCURVEZM((5 3 1 11, 5 13 2 12), CIRCULARSTRINGZM(5 13 2 12, 7 15 3 13, 9 13 4 14), (9 13 4 14, 9 3 5 15), CIRCULARSTRINGZM(9 3 5 15, 7 1 6 16, 5 3 1 11))",7,32.5663706144,0,0,1,0,1,POINT(7 8),5,1,9,15,Unsure about accuracy of numpoints – PostGIS reports 10 for same geometry
 "COMPOUNDCURVE((5 3 1, 5 13 2), CIRCULARSTRING(5 13 2, 7 15 3, 9 13 4), (9 13 4, 9 3 5), CIRCULARSTRING(9 3 5, 7 1 6, 5 3 1))","COMPOUNDCURVEZ((5 3 1, 5 13 2), CIRCULARSTRINGZ(5 13 2, 7 15 3, 9 13 4), (9 13 4, 9 3 5), CIRCULARSTRINGZ(9 3 5, 7 1 6, 5 3 1))",7,32.5663706144,0,0,1,0,1,POINT(7 8),5,1,9,15,"z coordinate, but geometry not explicitly marked as such. Should be upgraded to have Z dimension"
 "COMPOUNDCURVE((5 3 1 11, 5 13 2 12), CIRCULARSTRING(5 13 2 12, 7 15 3 13, 9 13 4 14), (9 13 4 14, 9 3 5 15), CIRCULARSTRING(9 3 5 15, 7 1 6 16, 5 3 1 11))","COMPOUNDCURVEZM((5 3 1 11, 5 13 2 12), CIRCULARSTRINGZM(5 13 2 12, 7 15 3 13, 9 13 4 14), (9 13 4 14, 9 3 5 15), CIRCULARSTRINGZM(9 3 5 15, 7 1 6 16, 5 3 1 11))",7,32.5663706144,0,0,1,0,1,POINT(7 8),5,1,9,15,"4d coordinates, but geometry not explicitly marked as such. Should be upgraded to have ZM dimension"
-"CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))","CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851485241232677 3.56861296120545823),1,0.75,7.125,7,
-"CURVEPOLYGONZ(CIRCULARSTRINGZ(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))","CURVEPOLYGONZ(CIRCULARSTRINGZ(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851485241232677 3.56861296120545823),1,0.75,7.125,7,
-"CURVEPOLYGONM(CIRCULARSTRINGM(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))","CURVEPOLYGONM(CIRCULARSTRINGM(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851485241232677 3.56861296120545823),1,0.75,7.125,7,
-"CURVEPOLYGONZM(CIRCULARSTRINGZM(1 3 1 11, 3 5 2 12, 4 7 3 13, 7 3 4 14, 1 3 1 11))","CURVEPOLYGONZM(CIRCULARSTRINGZM(1 3 1 11, 3 5 2 12, 4 7 3 13, 7 3 4 14, 1 3 1 11))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851485241232677 3.56861296120545823),1,0.75,7.125,7,
-"CURVEPOLYGON(CIRCULARSTRING(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))","CURVEPOLYGONZ(CIRCULARSTRINGZ(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851485241232677 3.56861296120545823),1,0.75,7.125,7,"z coordinate, but geometry not explicitly marked as such. Should be upgraded to have Z dimension"
-"CURVEPOLYGON(CIRCULARSTRING(1 3 1 11, 3 5 2 12, 4 7 3 13, 7 3 4 14, 1 3 1 11))","CURVEPOLYGONZM(CIRCULARSTRINGZM(1 3 1 11, 3 5 2 12, 4 7 3 13, 7 3 4 14, 1 3 1 11))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851485241232677 3.56861296120545823),1,0.75,7.125,7,"4d coordinates, but geometry not explicitly marked as such. Should be upgraded to have ZM dimension"
+"CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))","CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851648449795963 3.56861199335415558),1,0.75,7.125,7,
+"CURVEPOLYGONZ(CIRCULARSTRINGZ(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))","CURVEPOLYGONZ(CIRCULARSTRINGZ(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851648449795963 3.56861199335415558),1,0.75,7.125,7,
+"CURVEPOLYGONM(CIRCULARSTRINGM(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))","CURVEPOLYGONM(CIRCULARSTRINGM(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851648449795963 3.56861199335415558),1,0.75,7.125,7,
+"CURVEPOLYGONZM(CIRCULARSTRINGZM(1 3 1 11, 3 5 2 12, 4 7 3 13, 7 3 4 14, 1 3 1 11))","CURVEPOLYGONZM(CIRCULARSTRINGZM(1 3 1 11, 3 5 2 12, 4 7 3 13, 7 3 4 14, 1 3 1 11))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851648449795963 3.56861199335415558),1,0.75,7.125,7,
+"CURVEPOLYGON(CIRCULARSTRING(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))","CURVEPOLYGONZ(CIRCULARSTRINGZ(1 3 1, 3 5 2, 4 7 3, 7 3 4, 1 3 1))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851648449795963 3.56861199335415558),1,0.75,7.125,7,"z coordinate, but geometry not explicitly marked as such. Should be upgraded to have Z dimension"
+"CURVEPOLYGON(CIRCULARSTRING(1 3 1 11, 3 5 2 12, 4 7 3 13, 7 3 4 14, 1 3 1 11))","CURVEPOLYGONZM(CIRCULARSTRINGZM(1 3 1 11, 3 5 2 12, 4 7 3 13, 7 3 4 14, 1 3 1 11))",5,0,24.9520887446,18.926681924,1,0,0,Point (4.40851648449795963 3.56861199335415558),1,0.75,7.125,7,"4d coordinates, but geometry not explicitly marked as such. Should be upgraded to have ZM dimension"
 GeometryCollection (GeometryCollection (Point (1 1))),GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(1 1))),1,0,0,0,1,0,0,POINT(1 1),1,1,1,1,
 "GeometryCollection (LineString (0 0, 1 1, 2 2, 3 3 , 4 4))","GEOMETRYCOLLECTION(LINESTRING(0 0,1 1,2 2,3 3,4 4))",5,5.6568542495,0,0,1,0,0,POINT(2 2),0,0,4,4,
 "GeometryCollection (LineStringZ (0 0 0, 1 1 0, 2 2 0, 3 3 0, 4 4 0),PointZ (1 2 3))","GEOMETRYCOLLECTION Z (LINESTRING Z (0 0 0,1 1 0,2 2 0,3 3 0,4 4 0),POINT Z (1 2 3))",6,5.6568542495,0,0,2,0,0,POINT(2 2),0,0,4,4,
diff --git a/tests/testdata/qgis_server_accesscontrol/project.qgs b/tests/testdata/qgis_server_accesscontrol/project.qgs
index 7e1d322..4f1292e 100644
--- a/tests/testdata/qgis_server_accesscontrol/project.qgs
+++ b/tests/testdata/qgis_server_accesscontrol/project.qgs
@@ -24,6 +24,9 @@
     <layer-tree-layer expanded="1" checked="Qt::Checked" id="country20131022151106556" name="Country">
       <customproperties/>
     </layer-tree-layer>
+    <layer-tree-layer name="Country_Labels" id="Country_copy20161127151800736" checked="Qt::Unchecked" expanded="1">
+      <customproperties/>
+    </layer-tree-layer>
   </layer-tree-group>
   <relations/>
   <mapcanvas>
@@ -53,6 +56,7 @@
       <layer_coordinate_transform destAuthId="EPSG:3857" srcAuthId="EPSG:3857" srcDatumTransform="-1" destDatumTransform="-1" layerid="Hello_SubsetString_copy20160222085231770"/>
       <layer_coordinate_transform destAuthId="EPSG:3857" srcAuthId="EPSG:3857" srcDatumTransform="-1" destDatumTransform="-1" layerid="Hello_copy20150804164427541"/>
       <layer_coordinate_transform destAuthId="EPSG:3857" srcAuthId="EPSG:3857" srcDatumTransform="-1" destDatumTransform="-1" layerid="country20131022151106556"/>
+      <layer_coordinate_transform destAuthId="EPSG:3857" srcAuthId="EPSG:3857" srcDatumTransform="-1" destDatumTransform="-1" layerid="Country_copy20161127151800736"/>
       <layer_coordinate_transform destAuthId="EPSG:3857" srcAuthId="EPSG:4326" srcDatumTransform="-1" destDatumTransform="-1" layerid="dem20150730091219559"/>
       <layer_coordinate_transform destAuthId="EPSG:3857" srcAuthId="EPSG:3857" srcDatumTransform="-1" destDatumTransform="-1" layerid="hello20131022151106574"/>
       <layer_coordinate_transform destAuthId="EPSG:3857" srcAuthId="EPSG:3857" srcDatumTransform="-1" destDatumTransform="-1" layerid="points20150803121107046"/>
@@ -70,6 +74,7 @@
       <item>Hello_copy20150804164427541</item>
       <item>Hello_SubsetString_copy20160222085231770</item>
       <item>Hello_Project_SubsetString_copy20160223113949592</item>
+      <item>Country_copy20161127151800736</item>
     </custom-order>
   </layer-tree-canvas>
   <legend updateDrawingOrder="true">
@@ -108,6 +113,11 @@
         <legendlayerfile isInOverview="0" layerid="country20131022151106556" visible="1"/>
       </filegroup>
     </legendlayer>
+    <legendlayer name="Country_Labels" showFeatureCount="0" checked="Qt::Unchecked" open="true" drawingOrder="-1">
+      <filegroup open="true" hidden="false">
+        <legendlayerfile isInOverview="0" layerid="Country_copy20161127151800736" visible="0"/>
+      </filegroup>
+    </legendlayer>
   </legend>
   <Composer title="layoutA4" visible="0">
     <Composition resizeToContentsMarginLeft="0" snapping="0" showPages="1" guidesVisible="1" resizeToContentsMarginTop="0" alignmentSnap="1" printResolution="300" paperWidth="297" gridVisible="0" snapGridOffsetX="0" smartGuides="1" snapGridOffsetY="0" resizeToContentsMarginRight="0" snapTolerancePixels="10" printAsRaster="0" generateWorldFile="0" paperHeight="210" numPages="1" snapGridResolution="0" resizeToContentsMarginBottom="0">
@@ -215,6 +225,665 @@
     </Composition>
   </Composer>
   <projectlayers>
+    <maplayer simplifyLocal="1" maximumScale="1e+08" simplifyDrawingTol="1" minimumScale="0" simplifyDrawingHints="1" geometry="Polygon" simplifyAlgorithm="0" simplifyMaxScale="1" type="vector" readOnly="0" hasScaleBasedVisibilityFlag="0">
+      <extent>
+        <xmin>-19619892.68012013286352158</xmin>
+        <ymin>-10327100.34232237376272678</ymin>
+        <xmax>19972134.91854240000247955</xmax>
+        <ymax>18415866.31293442100286484</ymax>
+      </extent>
+      <id>Country_copy20161127151800736</id>
+      <datasource>dbname='./helloworld.db' table="country" (geom) sql=</datasource>
+      <keywordList>
+        <value></value>
+      </keywordList>
+      <layername>Country_Labels</layername>
+      <srs>
+        <spatialrefsys>
+          <proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs</proj4>
+          <srsid>3857</srsid>
+          <srid>3857</srid>
+          <authid>EPSG:3857</authid>
+          <description>WGS 84 / Pseudo Mercator</description>
+          <projectionacronym>merc</projectionacronym>
+          <ellipsoidacronym>WGS84</ellipsoidacronym>
+          <geographicflag>false</geographicflag>
+        </spatialrefsys>
+      </srs>
+      <provider encoding="UTF-8">spatialite</provider>
+      <vectorjoins/>
+      <layerDependencies/>
+      <defaults>
+        <default expression="" field="pk"/>
+        <default expression="" field="name"/>
+      </defaults>
+      <constraints>
+        <constraint notnull_strength="1" unique_strength="1" exp_strength="0" field="pk" constraints="3"/>
+        <constraint notnull_strength="0" unique_strength="0" exp_strength="0" field="name" constraints="0"/>
+      </constraints>
+      <constraintExpressions>
+        <constraint exp="" desc="" field="pk"/>
+        <constraint exp="" desc="" field="name"/>
+      </constraintExpressions>
+      <dataDependencies/>
+      <expressionfields/>
+      <map-layer-style-manager current="">
+        <map-layer-style name=""/>
+        <map-layer-style name="custom">
+          <qgis simplifyLocal="1" simplifyDrawingTol="1" maximumScale="1e+08" simplifyDrawingHints="1" minimumScale="0" simplifyAlgorithm="0" simplifyMaxScale="1" readOnly="0" hasScaleBasedVisibilityFlag="0" version="2.99.0-Master">
+            <edittypes>
+              <edittype name="pk" widgetv2type="TextEdit">
+                <widgetv2config labelOnTop="0" UseHtml="0" IsMultiline="0" fieldEditable="1"/>
+              </edittype>
+              <edittype name="name" widgetv2type="TextEdit">
+                <widgetv2config labelOnTop="0" UseHtml="0" IsMultiline="0" fieldEditable="1"/>
+              </edittype>
+            </edittypes>
+            <renderer-v2 forceraster="0" symbollevels="0" type="singleSymbol" enableorderby="0">
+              <symbols>
+                <symbol alpha="1" name="0" clip_to_extent="1" type="fill">
+                  <layer enabled="1" locked="0" pass="0" class="SimpleFill">
+                    <prop v="0,0,0,0,0,0" k="border_width_map_unit_scale"/>
+                    <prop v="145,149,158,255" k="color"/>
+                    <prop v="bevel" k="joinstyle"/>
+                    <prop v="0.80000000000000004,0.80000000000000004" k="offset"/>
+                    <prop v="0,0,0,0,0,0" k="offset_map_unit_scale"/>
+                    <prop v="MM" k="offset_unit"/>
+                    <prop v="157,157,157,255" k="outline_color"/>
+                    <prop v="solid" k="outline_style"/>
+                    <prop v="0.26" k="outline_width"/>
+                    <prop v="MM" k="outline_width_unit"/>
+                    <prop v="solid" k="style"/>
+                  </layer>
+                  <layer enabled="1" locked="0" pass="0" class="SimpleFill">
+                    <prop v="0,0,0,0,0,0" k="border_width_map_unit_scale"/>
+                    <prop v="0,0,255,255" k="color"/>
+                    <prop v="bevel" k="joinstyle"/>
+                    <prop v="0,0" k="offset"/>
+                    <prop v="0,0,0,0,0,0" k="offset_map_unit_scale"/>
+                    <prop v="MM" k="offset_unit"/>
+                    <prop v="0,0,0,255" k="outline_color"/>
+                    <prop v="solid" k="outline_style"/>
+                    <prop v="0.26" k="outline_width"/>
+                    <prop v="MM" k="outline_width_unit"/>
+                    <prop v="solid" k="style"/>
+                  </layer>
+                </symbol>
+              </symbols>
+              <rotation/>
+              <sizescale/>
+            </renderer-v2>
+            <labeling type="simple"/>
+            <customproperties>
+              <property value="0" key="embeddedWidgets/count"/>
+              <property value="pal" key="labeling"/>
+              <property value="false" key="labeling/addDirectionSymbol"/>
+              <property value="0" key="labeling/angleOffset"/>
+              <property value="0" key="labeling/blendMode"/>
+              <property value="0" key="labeling/bufferBlendMode"/>
+              <property value="255" key="labeling/bufferColorA"/>
+              <property value="255" key="labeling/bufferColorB"/>
+              <property value="255" key="labeling/bufferColorG"/>
+              <property value="255" key="labeling/bufferColorR"/>
+              <property value="false" key="labeling/bufferDraw"/>
+              <property value="64" key="labeling/bufferJoinStyle"/>
+              <property value="false" key="labeling/bufferNoFill"/>
+              <property value="1" key="labeling/bufferOpacity"/>
+              <property value="1" key="labeling/bufferSize"/>
+              <property value="false" key="labeling/bufferSizeInMapUnits"/>
+              <property value="0" key="labeling/bufferSizeMapUnitMaxScale"/>
+              <property value="0" key="labeling/bufferSizeMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/bufferSizeMapUnitScale"/>
+              <property value="MM" key="labeling/bufferSizeUnits"/>
+              <property value="0" key="labeling/bufferTransp"/>
+              <property value="false" key="labeling/centroidInside"/>
+              <property value="false" key="labeling/centroidWhole"/>
+              <property value="3" key="labeling/decimals"/>
+              <property value="false" key="labeling/displayAll"/>
+              <property value="0" key="labeling/dist"/>
+              <property value="false" key="labeling/distInMapUnits"/>
+              <property value="0" key="labeling/distMapUnitMaxScale"/>
+              <property value="0" key="labeling/distMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/distMapUnitScale"/>
+              <property value="true" key="labeling/drawLabels"/>
+              <property value="true" key="labeling/enabled"/>
+              <property value="name" key="labeling/fieldName"/>
+              <property value="false" key="labeling/fitInPolygonOnly"/>
+              <property value="false" key="labeling/fontBold"/>
+              <property value="0" key="labeling/fontCapitals"/>
+              <property value="Sans Serif" key="labeling/fontFamily"/>
+              <property value="true" key="labeling/fontItalic"/>
+              <property value="0" key="labeling/fontLetterSpacing"/>
+              <property value="false" key="labeling/fontLimitPixelSize"/>
+              <property value="10000" key="labeling/fontMaxPixelSize"/>
+              <property value="3" key="labeling/fontMinPixelSize"/>
+              <property value="40" key="labeling/fontSize"/>
+              <property value="false" key="labeling/fontSizeInMapUnits"/>
+              <property value="0" key="labeling/fontSizeMapUnitMaxScale"/>
+              <property value="0" key="labeling/fontSizeMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/fontSizeMapUnitScale"/>
+              <property value="Point" key="labeling/fontSizeUnit"/>
+              <property value="false" key="labeling/fontStrikeout"/>
+              <property value="true" key="labeling/fontUnderline"/>
+              <property value="50" key="labeling/fontWeight"/>
+              <property value="0" key="labeling/fontWordSpacing"/>
+              <property value="false" key="labeling/formatNumbers"/>
+              <property value="false" key="labeling/isExpression"/>
+              <property value="true" key="labeling/labelOffsetInMapUnits"/>
+              <property value="0" key="labeling/labelOffsetMapUnitMaxScale"/>
+              <property value="0" key="labeling/labelOffsetMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/labelOffsetMapUnitScale"/>
+              <property value="false" key="labeling/labelPerPart"/>
+              <property value="<" key="labeling/leftDirectionSymbol"/>
+              <property value="false" key="labeling/limitNumLabels"/>
+              <property value="20" key="labeling/maxCurvedCharAngleIn"/>
+              <property value="-20" key="labeling/maxCurvedCharAngleOut"/>
+              <property value="2000" key="labeling/maxNumLabels"/>
+              <property value="false" key="labeling/mergeLines"/>
+              <property value="0" key="labeling/minFeatureSize"/>
+              <property value="0" key="labeling/multilineAlign"/>
+              <property value="1" key="labeling/multilineHeight"/>
+              <property value="Italic" key="labeling/namedStyle"/>
+              <property value="true" key="labeling/obstacle"/>
+              <property value="1" key="labeling/obstacleFactor"/>
+              <property value="0" key="labeling/obstacleType"/>
+              <property value="0" key="labeling/offsetType"/>
+              <property value="0" key="labeling/placeDirectionSymbol"/>
+              <property value="0" key="labeling/placement"/>
+              <property value="0" key="labeling/placementFlags"/>
+              <property value="false" key="labeling/plussign"/>
+              <property value="TR,TL,BR,BL,R,L,TSR,BSR" key="labeling/predefinedPositionOrder"/>
+              <property value="true" key="labeling/preserveRotation"/>
+              <property value="#ffffff" key="labeling/previewBkgrdColor"/>
+              <property value="5" key="labeling/priority"/>
+              <property value="4" key="labeling/quadOffset"/>
+              <property value="0" key="labeling/repeatDistance"/>
+              <property value="0" key="labeling/repeatDistanceMapUnitMaxScale"/>
+              <property value="0" key="labeling/repeatDistanceMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/repeatDistanceMapUnitScale"/>
+              <property value="1" key="labeling/repeatDistanceUnit"/>
+              <property value="false" key="labeling/reverseDirectionSymbol"/>
+              <property value=">" key="labeling/rightDirectionSymbol"/>
+              <property value="10000000" key="labeling/scaleMax"/>
+              <property value="1" key="labeling/scaleMin"/>
+              <property value="false" key="labeling/scaleVisibility"/>
+              <property value="6" key="labeling/shadowBlendMode"/>
+              <property value="0" key="labeling/shadowColorB"/>
+              <property value="0" key="labeling/shadowColorG"/>
+              <property value="0" key="labeling/shadowColorR"/>
+              <property value="false" key="labeling/shadowDraw"/>
+              <property value="135" key="labeling/shadowOffsetAngle"/>
+              <property value="1" key="labeling/shadowOffsetDist"/>
+              <property value="true" key="labeling/shadowOffsetGlobal"/>
+              <property value="0" key="labeling/shadowOffsetMapUnitMaxScale"/>
+              <property value="0" key="labeling/shadowOffsetMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/shadowOffsetMapUnitScale"/>
+              <property value="MapUnit" key="labeling/shadowOffsetUnit"/>
+              <property value="1" key="labeling/shadowOffsetUnits"/>
+              <property value="0.69999999999999996" key="labeling/shadowOpacity"/>
+              <property value="1.5" key="labeling/shadowRadius"/>
+              <property value="false" key="labeling/shadowRadiusAlphaOnly"/>
+              <property value="0" key="labeling/shadowRadiusMapUnitMaxScale"/>
+              <property value="0" key="labeling/shadowRadiusMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/shadowRadiusMapUnitScale"/>
+              <property value="MapUnit" key="labeling/shadowRadiusUnit"/>
+              <property value="1" key="labeling/shadowRadiusUnits"/>
+              <property value="100" key="labeling/shadowScale"/>
+              <property value="30" key="labeling/shadowTransparency"/>
+              <property value="0" key="labeling/shadowUnder"/>
+              <property value="0" key="labeling/shapeBlendMode"/>
+              <property value="255" key="labeling/shapeBorderColorA"/>
+              <property value="128" key="labeling/shapeBorderColorB"/>
+              <property value="128" key="labeling/shapeBorderColorG"/>
+              <property value="128" key="labeling/shapeBorderColorR"/>
+              <property value="0" key="labeling/shapeBorderWidth"/>
+              <property value="0" key="labeling/shapeBorderWidthMapUnitMaxScale"/>
+              <property value="0" key="labeling/shapeBorderWidthMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/shapeBorderWidthMapUnitScale"/>
+              <property value="MapUnit" key="labeling/shapeBorderWidthUnit"/>
+              <property value="1" key="labeling/shapeBorderWidthUnits"/>
+              <property value="false" key="labeling/shapeDraw"/>
+              <property value="255" key="labeling/shapeFillColorA"/>
+              <property value="255" key="labeling/shapeFillColorB"/>
+              <property value="255" key="labeling/shapeFillColorG"/>
+              <property value="255" key="labeling/shapeFillColorR"/>
+              <property value="64" key="labeling/shapeJoinStyle"/>
+              <property value="0" key="labeling/shapeOffsetMapUnitMaxScale"/>
+              <property value="0" key="labeling/shapeOffsetMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/shapeOffsetMapUnitScale"/>
+              <property value="MapUnit" key="labeling/shapeOffsetUnit"/>
+              <property value="1" key="labeling/shapeOffsetUnits"/>
+              <property value="0" key="labeling/shapeOffsetX"/>
+              <property value="0" key="labeling/shapeOffsetY"/>
+              <property value="1" key="labeling/shapeOpacity"/>
+              <property value="0" key="labeling/shapeRadiiMapUnitMaxScale"/>
+              <property value="0" key="labeling/shapeRadiiMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/shapeRadiiMapUnitScale"/>
+              <property value="MapUnit" key="labeling/shapeRadiiUnit"/>
+              <property value="1" key="labeling/shapeRadiiUnits"/>
+              <property value="0" key="labeling/shapeRadiiX"/>
+              <property value="0" key="labeling/shapeRadiiY"/>
+              <property value="0" key="labeling/shapeRotation"/>
+              <property value="0" key="labeling/shapeRotationType"/>
+              <property value="" key="labeling/shapeSVGFile"/>
+              <property value="0" key="labeling/shapeSizeMapUnitMaxScale"/>
+              <property value="0" key="labeling/shapeSizeMapUnitMinScale"/>
+              <property value="0,0,0,0,0,0" key="labeling/shapeSizeMapUnitScale"/>
+              <property value="0" key="labeling/shapeSizeType"/>
+              <property value="MapUnit" key="labeling/shapeSizeUnit"/>
+              <property value="1" key="labeling/shapeSizeUnits"/>
+              <property value="0" key="labeling/shapeSizeX"/>
+              <property value="0" key="labeling/shapeSizeY"/>
+              <property value="0" key="labeling/shapeTransparency"/>
+              <property value="0" key="labeling/shapeType"/>
+              <property value="<substitutions/>" key="labeling/substitutions"/>
+              <property value="255" key="labeling/textColorA"/>
+              <property value="1" key="labeling/textColorB"/>
+              <property value="1" key="labeling/textColorG"/>
+              <property value="255" key="labeling/textColorR"/>
+              <property value="1" key="labeling/textOpacity"/>
+              <property value="0" key="labeling/textTransp"/>
+              <property value="0" key="labeling/upsidedownLabels"/>
+              <property value="false" key="labeling/useSubstitutions"/>
+              <property value="" key="labeling/wrapChar"/>
+              <property value="0" key="labeling/xOffset"/>
+              <property value="0" key="labeling/yOffset"/>
+              <property value="0" key="labeling/zIndex"/>
+              <property key="variableNames"/>
+              <property key="variableValues"/>
+            </customproperties>
+            <blendMode>0</blendMode>
+            <featureBlendMode>0</featureBlendMode>
+            <layerTransparency>0</layerTransparency>
+            <SingleCategoryDiagramRenderer sizeLegend="0" attributeLegend="1" diagramType="Pie">
+              <DiagramCategory enabled="0" maxScaleDenominator="1e+08" minimumSize="0" penWidth="0" lineSizeType="MM" scaleDependency="Area" diagramOrientation="Up" barWidth="5" angleOffset="1440" penAlpha="255" sizeType="MM" sizeScale="0,0,0,0,0,0" scaleBasedVisibility="0" transparency="0" penColor="#000000" backgroundColor="#ffffff" height="15" lineSizeScale="0,0,0,0,0,0" width="15" labelPlacementMethod="XHeight" minScaleDenominator="0" backgroundAlpha="255">
+                <fontProperties description="DejaVu Sans,11,-1,5,50,0,0,0,0,0" style=""/>
+                <attribute label="" color="#000000" field=""/>
+              </DiagramCategory>
+              <symbol alpha="1" name="sizeSymbol" clip_to_extent="1" type="marker">
+                <layer enabled="1" locked="0" pass="0" class="SimpleMarker">
+                  <prop v="0" k="angle"/>
+                  <prop v="255,0,0,255" k="color"/>
+                  <prop v="1" k="horizontal_anchor_point"/>
+                  <prop v="bevel" k="joinstyle"/>
+                  <prop v="circle" k="name"/>
+                  <prop v="0,0" k="offset"/>
+                  <prop v="0,0,0,0,0,0" k="offset_map_unit_scale"/>
+                  <prop v="MM" k="offset_unit"/>
+                  <prop v="0,0,0,255" k="outline_color"/>
+                  <prop v="solid" k="outline_style"/>
+                  <prop v="0" k="outline_width"/>
+                  <prop v="0,0,0,0,0,0" k="outline_width_map_unit_scale"/>
+                  <prop v="MM" k="outline_width_unit"/>
+                  <prop v="diameter" k="scale_method"/>
+                  <prop v="2" k="size"/>
+                  <prop v="0,0,0,0,0,0" k="size_map_unit_scale"/>
+                  <prop v="MM" k="size_unit"/>
+                  <prop v="1" k="vertical_anchor_point"/>
+                </layer>
+              </symbol>
+            </SingleCategoryDiagramRenderer>
+            <DiagramLayerSettings priority="0" obstacle="0" yPosColumn="-1" showColumn="0" zIndex="0" placement="0" xPosColumn="-1" dist="0" linePlacementFlags="10" showAll="1"/>
+            <annotationform>.</annotationform>
+            <aliases>
+              <alias name="" index="0" field="pk"/>
+              <alias name="" index="1" field="name"/>
+            </aliases>
+            <excludeAttributesWMS/>
+            <excludeAttributesWFS/>
+            <attributeactions>
+              <defaultAction value="{00000000-0000-0000-0000-000000000000}" key="Canvas"/>
+            </attributeactions>
+            <attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
+              <columns>
+                <column name="pk" width="-1" hidden="0" type="field"/>
+                <column name="name" width="-1" hidden="0" type="field"/>
+                <column width="-1" hidden="1" type="actions"/>
+              </columns>
+            </attributetableconfig>
+            <editform>.</editform>
+            <editforminit/>
+            <editforminitcodesource>0</editforminitcodesource>
+            <editforminitfilepath/>
+            <editforminitcode><![CDATA[# -*- coding: utf-8 -*-
+"""
+QGIS forms can have a Python function that is called when the form is
+opened.
+
+Use this function to add extra logic to your forms.
+
+Enter the name of the function in the "Python Init function"
+field.
+An example follows:
+"""
+from qgis.PyQt.QtWidgets import QWidget
+
+def my_form_open(dialog, layer, feature):
+    geom = feature.geometry()
+    control = dialog.findChild(QWidget, "MyLineEdit")
+]]></editforminitcode>
+            <featformsuppress>0</featformsuppress>
+            <editorlayout>generatedlayout</editorlayout>
+            <attributeEditorForm>
+              <attributeEditorContainer groupBox="0" name="ttt" visibilityExpressionEnabled="0" showLabel="1" visibilityExpression="" columnCount="0"/>
+            </attributeEditorForm>
+            <widgets/>
+            <conditionalstyles>
+              <rowstyles/>
+              <fieldstyles/>
+            </conditionalstyles>
+            <expressionfields/>
+            <previewExpression>name</previewExpression>
+            <mapTip/>
+            <layerGeometryType>2</layerGeometryType>
+          </qgis>
+        </map-layer-style>
+      </map-layer-style-manager>
+      <edittypes>
+        <edittype name="pk" widgetv2type="TextEdit">
+          <widgetv2config labelOnTop="0" UseHtml="0" IsMultiline="0" fieldEditable="1"/>
+        </edittype>
+        <edittype name="name" widgetv2type="TextEdit">
+          <widgetv2config labelOnTop="0" UseHtml="0" IsMultiline="0" fieldEditable="1"/>
+        </edittype>
+      </edittypes>
+      <renderer-v2 forceraster="0" symbollevels="0" type="singleSymbol" enableorderby="0">
+        <symbols>
+          <symbol name="0" alpha="1" clip_to_extent="1" type="fill">
+            <layer enabled="1" locked="0" pass="0" class="SimpleFill">
+              <prop v="0,0,0,0,0,0" k="border_width_map_unit_scale"/>
+              <prop v="145,149,158,255" k="color"/>
+              <prop v="bevel" k="joinstyle"/>
+              <prop v="0.80000000000000004,0.80000000000000004" k="offset"/>
+              <prop v="0,0,0,0,0,0" k="offset_map_unit_scale"/>
+              <prop v="MM" k="offset_unit"/>
+              <prop v="157,157,157,255" k="outline_color"/>
+              <prop v="solid" k="outline_style"/>
+              <prop v="0.26" k="outline_width"/>
+              <prop v="MM" k="outline_width_unit"/>
+              <prop v="solid" k="style"/>
+            </layer>
+            <layer enabled="1" locked="0" pass="0" class="SimpleFill">
+              <prop v="0,0,0,0,0,0" k="border_width_map_unit_scale"/>
+              <prop v="0,0,255,255" k="color"/>
+              <prop v="bevel" k="joinstyle"/>
+              <prop v="0,0" k="offset"/>
+              <prop v="0,0,0,0,0,0" k="offset_map_unit_scale"/>
+              <prop v="MM" k="offset_unit"/>
+              <prop v="0,0,0,255" k="outline_color"/>
+              <prop v="solid" k="outline_style"/>
+              <prop v="0.26" k="outline_width"/>
+              <prop v="MM" k="outline_width_unit"/>
+              <prop v="solid" k="style"/>
+            </layer>
+          </symbol>
+        </symbols>
+        <rotation/>
+        <sizescale/>
+      </renderer-v2>
+      <labeling type="simple"/>
+      <customproperties>
+        <property value="0" key="embeddedWidgets/count"/>
+        <property value="pal" key="labeling"/>
+        <property value="false" key="labeling/addDirectionSymbol"/>
+        <property value="0" key="labeling/angleOffset"/>
+        <property value="0" key="labeling/blendMode"/>
+        <property value="0" key="labeling/bufferBlendMode"/>
+        <property value="255" key="labeling/bufferColorA"/>
+        <property value="255" key="labeling/bufferColorB"/>
+        <property value="255" key="labeling/bufferColorG"/>
+        <property value="255" key="labeling/bufferColorR"/>
+        <property value="false" key="labeling/bufferDraw"/>
+        <property value="64" key="labeling/bufferJoinStyle"/>
+        <property value="false" key="labeling/bufferNoFill"/>
+        <property value="1" key="labeling/bufferOpacity"/>
+        <property value="1" key="labeling/bufferSize"/>
+        <property value="false" key="labeling/bufferSizeInMapUnits"/>
+        <property value="0" key="labeling/bufferSizeMapUnitMaxScale"/>
+        <property value="0" key="labeling/bufferSizeMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/bufferSizeMapUnitScale"/>
+        <property value="MM" key="labeling/bufferSizeUnits"/>
+        <property value="0" key="labeling/bufferTransp"/>
+        <property value="false" key="labeling/centroidInside"/>
+        <property value="false" key="labeling/centroidWhole"/>
+        <property value="3" key="labeling/decimals"/>
+        <property value="false" key="labeling/displayAll"/>
+        <property value="0" key="labeling/dist"/>
+        <property value="false" key="labeling/distInMapUnits"/>
+        <property value="0" key="labeling/distMapUnitMaxScale"/>
+        <property value="0" key="labeling/distMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/distMapUnitScale"/>
+        <property value="true" key="labeling/drawLabels"/>
+        <property value="true" key="labeling/enabled"/>
+        <property value="name" key="labeling/fieldName"/>
+        <property value="false" key="labeling/fitInPolygonOnly"/>
+        <property value="false" key="labeling/fontBold"/>
+        <property value="0" key="labeling/fontCapitals"/>
+        <property value="Sans Serif" key="labeling/fontFamily"/>
+        <property value="false" key="labeling/fontItalic"/>
+        <property value="0" key="labeling/fontLetterSpacing"/>
+        <property value="false" key="labeling/fontLimitPixelSize"/>
+        <property value="10000" key="labeling/fontMaxPixelSize"/>
+        <property value="3" key="labeling/fontMinPixelSize"/>
+        <property value="9" key="labeling/fontSize"/>
+        <property value="false" key="labeling/fontSizeInMapUnits"/>
+        <property value="0" key="labeling/fontSizeMapUnitMaxScale"/>
+        <property value="0" key="labeling/fontSizeMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/fontSizeMapUnitScale"/>
+        <property value="Point" key="labeling/fontSizeUnit"/>
+        <property value="false" key="labeling/fontStrikeout"/>
+        <property value="false" key="labeling/fontUnderline"/>
+        <property value="50" key="labeling/fontWeight"/>
+        <property value="0" key="labeling/fontWordSpacing"/>
+        <property value="false" key="labeling/formatNumbers"/>
+        <property value="false" key="labeling/isExpression"/>
+        <property value="true" key="labeling/labelOffsetInMapUnits"/>
+        <property value="0" key="labeling/labelOffsetMapUnitMaxScale"/>
+        <property value="0" key="labeling/labelOffsetMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/labelOffsetMapUnitScale"/>
+        <property value="false" key="labeling/labelPerPart"/>
+        <property value="<" key="labeling/leftDirectionSymbol"/>
+        <property value="false" key="labeling/limitNumLabels"/>
+        <property value="20" key="labeling/maxCurvedCharAngleIn"/>
+        <property value="-20" key="labeling/maxCurvedCharAngleOut"/>
+        <property value="2000" key="labeling/maxNumLabels"/>
+        <property value="false" key="labeling/mergeLines"/>
+        <property value="0" key="labeling/minFeatureSize"/>
+        <property value="0" key="labeling/multilineAlign"/>
+        <property value="1" key="labeling/multilineHeight"/>
+        <property value="Normal" key="labeling/namedStyle"/>
+        <property value="true" key="labeling/obstacle"/>
+        <property value="1" key="labeling/obstacleFactor"/>
+        <property value="0" key="labeling/obstacleType"/>
+        <property value="0" key="labeling/offsetType"/>
+        <property value="0" key="labeling/placeDirectionSymbol"/>
+        <property value="0" key="labeling/placement"/>
+        <property value="0" key="labeling/placementFlags"/>
+        <property value="false" key="labeling/plussign"/>
+        <property value="TR,TL,BR,BL,R,L,TSR,BSR" key="labeling/predefinedPositionOrder"/>
+        <property value="true" key="labeling/preserveRotation"/>
+        <property value="#ffffff" key="labeling/previewBkgrdColor"/>
+        <property value="5" key="labeling/priority"/>
+        <property value="4" key="labeling/quadOffset"/>
+        <property value="0" key="labeling/repeatDistance"/>
+        <property value="0" key="labeling/repeatDistanceMapUnitMaxScale"/>
+        <property value="0" key="labeling/repeatDistanceMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/repeatDistanceMapUnitScale"/>
+        <property value="1" key="labeling/repeatDistanceUnit"/>
+        <property value="false" key="labeling/reverseDirectionSymbol"/>
+        <property value=">" key="labeling/rightDirectionSymbol"/>
+        <property value="10000000" key="labeling/scaleMax"/>
+        <property value="1" key="labeling/scaleMin"/>
+        <property value="false" key="labeling/scaleVisibility"/>
+        <property value="6" key="labeling/shadowBlendMode"/>
+        <property value="0" key="labeling/shadowColorB"/>
+        <property value="0" key="labeling/shadowColorG"/>
+        <property value="0" key="labeling/shadowColorR"/>
+        <property value="false" key="labeling/shadowDraw"/>
+        <property value="135" key="labeling/shadowOffsetAngle"/>
+        <property value="1" key="labeling/shadowOffsetDist"/>
+        <property value="true" key="labeling/shadowOffsetGlobal"/>
+        <property value="0" key="labeling/shadowOffsetMapUnitMaxScale"/>
+        <property value="0" key="labeling/shadowOffsetMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/shadowOffsetMapUnitScale"/>
+        <property value="MapUnit" key="labeling/shadowOffsetUnit"/>
+        <property value="1" key="labeling/shadowOffsetUnits"/>
+        <property value="0.69999999999999996" key="labeling/shadowOpacity"/>
+        <property value="1.5" key="labeling/shadowRadius"/>
+        <property value="false" key="labeling/shadowRadiusAlphaOnly"/>
+        <property value="0" key="labeling/shadowRadiusMapUnitMaxScale"/>
+        <property value="0" key="labeling/shadowRadiusMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/shadowRadiusMapUnitScale"/>
+        <property value="MapUnit" key="labeling/shadowRadiusUnit"/>
+        <property value="1" key="labeling/shadowRadiusUnits"/>
+        <property value="100" key="labeling/shadowScale"/>
+        <property value="30" key="labeling/shadowTransparency"/>
+        <property value="0" key="labeling/shadowUnder"/>
+        <property value="0" key="labeling/shapeBlendMode"/>
+        <property value="255" key="labeling/shapeBorderColorA"/>
+        <property value="128" key="labeling/shapeBorderColorB"/>
+        <property value="128" key="labeling/shapeBorderColorG"/>
+        <property value="128" key="labeling/shapeBorderColorR"/>
+        <property value="0" key="labeling/shapeBorderWidth"/>
+        <property value="0" key="labeling/shapeBorderWidthMapUnitMaxScale"/>
+        <property value="0" key="labeling/shapeBorderWidthMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/shapeBorderWidthMapUnitScale"/>
+        <property value="MapUnit" key="labeling/shapeBorderWidthUnit"/>
+        <property value="1" key="labeling/shapeBorderWidthUnits"/>
+        <property value="false" key="labeling/shapeDraw"/>
+        <property value="255" key="labeling/shapeFillColorA"/>
+        <property value="255" key="labeling/shapeFillColorB"/>
+        <property value="255" key="labeling/shapeFillColorG"/>
+        <property value="255" key="labeling/shapeFillColorR"/>
+        <property value="64" key="labeling/shapeJoinStyle"/>
+        <property value="0" key="labeling/shapeOffsetMapUnitMaxScale"/>
+        <property value="0" key="labeling/shapeOffsetMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/shapeOffsetMapUnitScale"/>
+        <property value="MapUnit" key="labeling/shapeOffsetUnit"/>
+        <property value="1" key="labeling/shapeOffsetUnits"/>
+        <property value="0" key="labeling/shapeOffsetX"/>
+        <property value="0" key="labeling/shapeOffsetY"/>
+        <property value="1" key="labeling/shapeOpacity"/>
+        <property value="0" key="labeling/shapeRadiiMapUnitMaxScale"/>
+        <property value="0" key="labeling/shapeRadiiMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/shapeRadiiMapUnitScale"/>
+        <property value="MapUnit" key="labeling/shapeRadiiUnit"/>
+        <property value="1" key="labeling/shapeRadiiUnits"/>
+        <property value="0" key="labeling/shapeRadiiX"/>
+        <property value="0" key="labeling/shapeRadiiY"/>
+        <property value="0" key="labeling/shapeRotation"/>
+        <property value="0" key="labeling/shapeRotationType"/>
+        <property value="" key="labeling/shapeSVGFile"/>
+        <property value="0" key="labeling/shapeSizeMapUnitMaxScale"/>
+        <property value="0" key="labeling/shapeSizeMapUnitMinScale"/>
+        <property value="0,0,0,0,0,0" key="labeling/shapeSizeMapUnitScale"/>
+        <property value="0" key="labeling/shapeSizeType"/>
+        <property value="MapUnit" key="labeling/shapeSizeUnit"/>
+        <property value="1" key="labeling/shapeSizeUnits"/>
+        <property value="0" key="labeling/shapeSizeX"/>
+        <property value="0" key="labeling/shapeSizeY"/>
+        <property value="0" key="labeling/shapeTransparency"/>
+        <property value="0" key="labeling/shapeType"/>
+        <property value="<substitutions/>" key="labeling/substitutions"/>
+        <property value="255" key="labeling/textColorA"/>
+        <property value="0" key="labeling/textColorB"/>
+        <property value="0" key="labeling/textColorG"/>
+        <property value="0" key="labeling/textColorR"/>
+        <property value="1" key="labeling/textOpacity"/>
+        <property value="0" key="labeling/textTransp"/>
+        <property value="0" key="labeling/upsidedownLabels"/>
+        <property value="false" key="labeling/useSubstitutions"/>
+        <property value="" key="labeling/wrapChar"/>
+        <property value="0" key="labeling/xOffset"/>
+        <property value="0" key="labeling/yOffset"/>
+        <property value="0" key="labeling/zIndex"/>
+        <property key="variableNames"/>
+        <property key="variableValues"/>
+      </customproperties>
+      <blendMode>0</blendMode>
+      <featureBlendMode>0</featureBlendMode>
+      <layerTransparency>0</layerTransparency>
+      <SingleCategoryDiagramRenderer sizeLegend="0" attributeLegend="1" diagramType="Pie">
+        <DiagramCategory enabled="0" maxScaleDenominator="1e+08" penWidth="0" minimumSize="0" lineSizeType="MM" scaleDependency="Area" diagramOrientation="Up" barWidth="5" angleOffset="1440" penAlpha="255" sizeType="MM" sizeScale="0,0,0,0,0,0" scaleBasedVisibility="0" transparency="0" penColor="#000000" backgroundColor="#ffffff" height="15" lineSizeScale="0,0,0,0,0,0" width="15" labelPlacementMethod="XHeight" minScaleDenominator="0" backgroundAlpha="255">
+          <fontProperties description="DejaVu Sans,11,-1,5,50,0,0,0,0,0" style=""/>
+          <attribute label="" color="#000000" field=""/>
+        </DiagramCategory>
+        <symbol name="sizeSymbol" alpha="1" clip_to_extent="1" type="marker">
+          <layer enabled="1" locked="0" pass="0" class="SimpleMarker">
+            <prop v="0" k="angle"/>
+            <prop v="255,0,0,255" k="color"/>
+            <prop v="1" k="horizontal_anchor_point"/>
+            <prop v="bevel" k="joinstyle"/>
+            <prop v="circle" k="name"/>
+            <prop v="0,0" k="offset"/>
+            <prop v="0,0,0,0,0,0" k="offset_map_unit_scale"/>
+            <prop v="MM" k="offset_unit"/>
+            <prop v="0,0,0,255" k="outline_color"/>
+            <prop v="solid" k="outline_style"/>
+            <prop v="0" k="outline_width"/>
+            <prop v="0,0,0,0,0,0" k="outline_width_map_unit_scale"/>
+            <prop v="MM" k="outline_width_unit"/>
+            <prop v="diameter" k="scale_method"/>
+            <prop v="2" k="size"/>
+            <prop v="0,0,0,0,0,0" k="size_map_unit_scale"/>
+            <prop v="MM" k="size_unit"/>
+            <prop v="1" k="vertical_anchor_point"/>
+          </layer>
+        </symbol>
+      </SingleCategoryDiagramRenderer>
+      <DiagramLayerSettings priority="0" obstacle="0" yPosColumn="-1" showColumn="0" zIndex="0" placement="0" dist="0" xPosColumn="-1" linePlacementFlags="10" showAll="1"/>
+      <annotationform>.</annotationform>
+      <aliases>
+        <alias name="" index="0" field="pk"/>
+        <alias name="" index="1" field="name"/>
+      </aliases>
+      <excludeAttributesWMS/>
+      <excludeAttributesWFS/>
+      <attributeactions>
+        <defaultAction value="{00000000-0000-0000-0000-000000000000}" key="Canvas"/>
+      </attributeactions>
+      <attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
+        <columns>
+          <column name="pk" width="-1" hidden="0" type="field"/>
+          <column name="name" width="-1" hidden="0" type="field"/>
+          <column width="-1" hidden="1" type="actions"/>
+        </columns>
+      </attributetableconfig>
+      <editform>.</editform>
+      <editforminit/>
+      <editforminitcodesource>0</editforminitcodesource>
+      <editforminitfilepath></editforminitfilepath>
+      <editforminitcode><![CDATA[# -*- coding: utf-8 -*-
+"""
+QGIS forms can have a Python function that is called when the form is
+opened.
+
+Use this function to add extra logic to your forms.
+
+Enter the name of the function in the "Python Init function"
+field.
+An example follows:
+"""
+from qgis.PyQt.QtWidgets import QWidget
+
+def my_form_open(dialog, layer, feature):
+    geom = feature.geometry()
+    control = dialog.findChild(QWidget, "MyLineEdit")
+]]></editforminitcode>
+      <featformsuppress>0</featformsuppress>
+      <editorlayout>generatedlayout</editorlayout>
+      <attributeEditorForm>
+        <attributeEditorContainer groupBox="0" name="ttt" visibilityExpressionEnabled="0" showLabel="1" visibilityExpression="" columnCount="0"/>
+      </attributeEditorForm>
+      <widgets/>
+      <conditionalstyles>
+        <rowstyles/>
+        <fieldstyles/>
+      </conditionalstyles>
+      <expressionfields/>
+      <previewExpression>name</previewExpression>
+      <mapTip></mapTip>
+    </maplayer>
     <maplayer minimumScale="0" maximumScale="1e+08" simplifyDrawingHints="1" minLabelScale="1" maxLabelScale="1e+08" simplifyDrawingTol="1" geometry="Polygon" simplifyMaxScale="1" type="vector" hasScaleBasedVisibilityFlag="0" simplifyLocal="1" scaleBasedLabelVisibilityFlag="0">
       <id>Hello_Project_SubsetString_copy20160223113949592</id>
       <datasource>dbname='./helloworld.db' table="hello" (geom) sql=</datasource>
@@ -500,8 +1169,8 @@ An example follows:
 from PyQt4.QtGui import QWidget
 
 def my_form_open(dialog, layer, feature):
-	geom = feature.geometry()
-	control = dialog.findChild(QWidget, "MyLineEdit")
+    geom = feature.geometry()
+    control = dialog.findChild(QWidget, "MyLineEdit")
 ]]></editforminitcode>
       <featformsuppress>0</featformsuppress>
       <editorlayout>generatedlayout</editorlayout>
@@ -817,8 +1486,8 @@ An example follows:
 from PyQt4.QtGui import QWidget
 
 def my_form_open(dialog, layer, feature):
-	geom = feature.geometry()
-	control = dialog.findChild(QWidget, "MyLineEdit")
+    geom = feature.geometry()
+    control = dialog.findChild(QWidget, "MyLineEdit")
 ]]></editforminitcode>
       <featformsuppress>0</featformsuppress>
       <editorlayout>generatedlayout</editorlayout>
@@ -1134,8 +1803,8 @@ An example follows:
 from PyQt4.QtGui import QWidget
 
 def my_form_open(dialog, layer, feature):
-	geom = feature.geometry()
-	control = dialog.findChild(QWidget, "MyLineEdit")
+    geom = feature.geometry()
+    control = dialog.findChild(QWidget, "MyLineEdit")
 ]]></editforminitcode>
       <featformsuppress>0</featformsuppress>
       <editorlayout>generatedlayout</editorlayout>
@@ -2591,9 +3260,7 @@ def my_form_open(dialog, layer, feature):
       <hello20131022151106574 type="int">0</hello20131022151106574>
       <points20150803121107046 type="int">1</points20150803121107046>
     </WFSLayersPrecision>
-    <WMSRestrictedComposers type="QStringList">
-      <value>layoutA4</value>
-    </WMSRestrictedComposers>
+    <WMSRestrictedComposers type="QStringList"/>
     <WMSServiceTitle type="QString">QGIS Server test</WMSServiceTitle>
     <WMSContactPhone type="QString"></WMSContactPhone>
     <WFSTLayers>
diff --git a/tests/testdata/symbol_layer/external_sld/simple_streams.sld b/tests/testdata/symbol_layer/external_sld/simple_streams.sld
new file mode 100644
index 0000000..30c2f7f
--- /dev/null
+++ b/tests/testdata/symbol_layer/external_sld/simple_streams.sld
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
+  xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
+  <NamedLayer>
+    <Name>Simple Streams</Name>
+    <UserStyle>
+
+      <Title>Default Styler for streams segments</Title>
+      <Abstract>Blue lines, 2px wide</Abstract>
+      <FeatureTypeStyle>
+        <FeatureTypeName>Feature</FeatureTypeName>
+        <Rule>
+          <Title>Streams</Title>
+          <LineSymbolizer>
+            <Stroke>
+              <CssParameter name="stroke">
+                <ogc:Literal>#003EBA</ogc:Literal>
+              </CssParameter>
+              <CssParameter name="stroke-width">
+                <ogc:Literal>2</ogc:Literal>
+              </CssParameter>
+              <CssParameter name="stroke-opacity">0.1</CssParameter>
+            </Stroke>
+          </LineSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>
\ No newline at end of file
diff --git a/tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-directValue.sld b/tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-directValue.sld
new file mode 100644
index 0000000..ee82a9c
--- /dev/null
+++ b/tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-directValue.sld
@@ -0,0 +1,30 @@
+<?xml version="1.0" ?>
+<sld:StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:sld="http://www.opengis.net/sld">
+	<sld:NamedLayer>
+		<sld:Name>testSimpleMarkerRotation</sld:Name>
+		<sld:UserStyle>
+			<sld:Name>testSimpleMarkerRotation</sld:Name>
+			<sld:FeatureTypeStyle>
+				<sld:Name>name</sld:Name>
+				<sld:Rule>
+					<sld:Name>Single symbol</sld:Name>
+					<sld:PointSymbolizer>
+						<sld:Graphic>
+							<sld:Mark>
+								<sld:WellKnownName>star</sld:WellKnownName>
+								<sld:Fill>
+									<sld:CssParameter name="fill">#ff0000</sld:CssParameter>
+								</sld:Fill>
+								<sld:Stroke>
+									<sld:CssParameter name="stroke">#00ff00</sld:CssParameter>
+								</sld:Stroke>
+							</sld:Mark>
+							<sld:Size>36</sld:Size>
+							<sld:Rotation>50.0</sld:Rotation>
+						</sld:Graphic>
+					</sld:PointSymbolizer>
+				</sld:Rule>
+			</sld:FeatureTypeStyle>
+		</sld:UserStyle>
+	</sld:NamedLayer>
+</sld:StyledLayerDescriptor>
diff --git a/tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-ogcLiteral.sld b/tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-ogcLiteral.sld
new file mode 100644
index 0000000..d3139fb
--- /dev/null
+++ b/tests/testdata/symbol_layer/external_sld/testSimpleMarkerRotation-ogcLiteral.sld
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" xmlns:se="http://www.opengis.net/se">
+  <NamedLayer>
+    <se:Name>points</se:Name>
+    <UserStyle>
+      <se:Name>points</se:Name>
+      <se:FeatureTypeStyle>
+        <se:Rule>
+          <se:Name>Single symbol</se:Name>
+          <se:PointSymbolizer>
+            <se:Graphic>
+              <se:Mark>
+                <se:WellKnownName>regular_star</se:WellKnownName>
+                <se:Fill>
+                  <se:SvgParameter name="fill">#ff0000</se:SvgParameter>
+                </se:Fill>
+                <se:Stroke>
+                  <se:SvgParameter name="stroke">#00ff00</se:SvgParameter>
+                </se:Stroke>
+              </se:Mark>
+              <se:Size>10</se:Size>
+              <se:Rotation>
+                <ogc:Literal>50</ogc:Literal>
+              </se:Rotation>
+            </se:Graphic>
+          </se:PointSymbolizer>
+        </se:Rule>
+      </se:FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>

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



More information about the Pkg-grass-devel mailing list