[qgis] 01/01: New upstream version 2.18.12+dfsg

Bas Couwenberg sebastic at debian.org
Fri Aug 18 20:23:26 UTC 2017


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

sebastic pushed a commit to branch upstream
in repository qgis.

commit fc9eb39218b888edec16166f15d51256b23aba1c
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Fri Aug 18 20:02:17 2017 +0200

    New upstream version 2.18.12+dfsg
---
 CMakeLists.txt                                     |   2 +-
 ChangeLog                                          | 184 ++++++
 debian/changelog                                   |  10 +-
 i18n/qgis_de.ts                                    |   4 +-
 python/plugins/processing/algs/gdal/merge.py       |   7 +
 .../plugins/processing/algs/saga/SagaAlgorithm.py  |   2 +-
 .../processing/algs/saga/SagaNameDecorator.py      |  12 +-
 .../processing/algs/saga/description/ANGMAP.txt    |  10 +
 .../algs/saga/description/AccumulatedCost.txt      |  12 +
 .../saga/description/AccumulationFunctions.txt     |  12 +
 .../AddIndicatorFieldsforCategories.txt            |   6 +
 .../saga/description/AngularDistanceWeighted.txt   |  23 +
 ...tificialNeuralNetworkClassification(OpenCV).txt |  22 +
 .../algs/saga/description/Aspect-SlopeGrid.txt     |   6 +
 .../description/AutomatedCloudCoverAssessment.txt  |  14 +
 .../algs/saga/description/AverageWithMask1.txt     |   8 +
 .../algs/saga/description/AverageWithMask2.txt     |   8 +
 .../saga/description/AverageWithThereshold1.txt    |   7 +
 .../saga/description/AverageWithThereshold2.txt    |   7 +
 .../saga/description/AverageWithThereshold3.txt    |   7 +
 .../algs/saga/description/BasicTerrainAnalysis.txt |  20 +
 .../description/BinaryErosion-Reconstruction.txt   |   5 +
 .../algs/saga/description/BioclimaticVariables.txt |  26 +
 .../description/BoostingClassification(OpenCV).txt |  16 +
 .../saga/description/CategoricalCoincidence.txt    |   8 +
 .../algs/saga/description/ChangeDataStorage.txt    |   7 +
 .../CloseGapswithStepwiseResampling.txt            |  10 +
 .../saga/description/ClusterAnalysis(Shapes).txt   |  10 +
 .../algs/saga/description/ClusterAnalysis.txt      |  10 +
 .../saga/description/ClusterAnalysisforGrids.txt   |  12 +-
 .../algs/saga/description/Concentration.txt        |  10 +
 .../description/ConfusionMatrix(PolygonsGrid).txt  |  12 +
 .../saga/description/ConfusionMatrix(TwoGrids).txt |  18 +
 .../algs/saga/description/ConnectivityAnalysis.txt |  10 +
 .../algs/saga/description/ConstantGrid.txt         |  14 +
 .../algs/saga/description/CoveredDistance.txt      |   4 +
 .../algs/saga/description/CreatePointGrid.txt      |   8 +
 .../DecisionTreeClassification(OpenCV).txt         |  13 +
 .../algs/saga/description/Destriping.txt           |   9 +
 .../algs/saga/description/DestripingwithMask.txt   |  14 +
 .../algs/saga/description/Difference.txt           |   6 +
 .../algs/saga/description/DiffusePollutionRisk.txt |  13 +
 .../algs/saga/description/DirectionalAverage.txt   |   7 +
 .../algs/saga/description/Distance(ViGrA).txt      |   5 +
 .../saga/description/EarthsOrbitalParameters.txt   |   6 +
 .../algs/saga/description/EdgeDetection(ViGrA).txt |   7 +
 .../saga/description/EnhancedVegetationIndex.txt   |  10 +
 .../algs/saga/description/EnumerateTableField.txt  |   5 +
 .../algs/saga/description/FieldStatistics.txt      |   5 +
 .../saga/description/FindFieldofExtremeValue.txt   |   9 +
 .../algs/saga/description/FourierFilter(ViGrA).txt |   9 +
 .../description/FourierTransform(RealViGrA).txt    |   4 +
 .../saga/description/FourierTransform(ViGrA).txt   |   6 +
 .../description/FourierTransformInverse(ViGrA).txt |   6 +
 .../description/FourierTransformation(OpenCV).txt  |   5 +
 .../algs/saga/description/FunctionFit.txt          |   9 +
 .../FuzzyLandformElementClassification.txt         |  31 +
 .../saga/description/GWRforMultiplePredictors.txt  |  16 +
 .../GWRforSinglePredictor(GriddedModelOutput).txt  |  27 +
 .../saga/description/GWRforSinglePredictorGrid.txt |  20 +
 .../algs/saga/description/GenerateShapes.txt       |   8 +
 .../GeodesicMorphologicalReconstruction.txt        |   9 +
 .../saga/description/GeographicCoordinateGrids.txt |   5 +
 .../algs/saga/description/GridCombination.txt      |  12 +
 .../saga/description/GridStatisticsforPoints.txt   |  17 +
 .../saga/description/IMCORR-FeatureTracking.txt    |  11 +
 .../saga/description/ISODATAClusteringforGrids.txt |  10 +
 .../processing/algs/saga/description/Identity.txt  |   6 +
 .../processing/algs/saga/description/Intersect.txt |   6 +
 .../algs/saga/description/InvertGrid.txt           |   4 +
 .../saga/description/K-MeansClusteringforGrids.txt |  11 +
 .../K-NearestNeighboursClassification(OpenCV).txt  |  11 +
 .../algs/saga/description/LS-FactorFieldBased.txt  |  16 +
 .../saga/description/LandUseScenarioGenerator.txt  |   8 +
 .../algs/saga/description/LineSmoothing.txt        |   9 +
 .../MaximumEntropyPresencePrediction.txt           |  18 +
 .../saga/description/MaximumFlowPathLength.txt     |   6 +
 .../saga/description/MeltonRuggednessNumber.txt    |   6 +
 .../algs/saga/description/MeshDenoise.txt          |   9 +
 .../algs/saga/description/MirrorGrid.txt           |   5 +
 .../saga/description/ModifedQuadraticShepard.txt   |  12 +
 .../saga/description/MonthlyGlobalbyLatitude.txt   |   7 +
 .../description/MorphologicalFilter(OpenCV).txt    |   8 +
 .../description/MorphologicalFilter(ViGrA).txt     |   8 +
 .../algs/saga/description/MorphometricFeatures.txt |  19 +
 .../algs/saga/description/Mosaicking.txt           |   2 +-
 .../MultipleLinearRegressionAnalysis(Shapes).txt   |  12 +
 .../MultipleLinearRegressionAnalysis.txt           |  12 +
 ...leRegressionAnalysis(GridandPredictorGrids).txt |  16 +
 ...RegressionAnalysis(PointsandPredictorGrids).txt |  20 +
 .../NormalBayesClassification(OpenCV).txt          |   8 +
 .../saga/description/PET(afterHargreavesGrid).txt  |  10 +
 .../saga/description/PET(afterHargreavesTable).txt |   8 +
 .../algs/saga/description/PointDistances.txt       |   9 +
 .../saga/description/PolygonSelf-Intersection.txt  |   5 +
 .../RandomForestClassification(OpenCV).txt         |  14 +
 .../RandomForestPresencePrediction(ViGrA).txt      |  20 +
 .../RegressionAnalysis(PointsandPredictorGrid).txt |   9 +
 .../algs/saga/description/RegressionKriging.txt    |  32 +
 .../algs/saga/description/ResamplingFilter.txt     |   6 +
 .../algs/saga/description/RiverBasin.txt           |  19 +
 .../algs/saga/description/RiverGridGeneration.txt  |   9 +
 .../algs/saga/description/SVMClassification.txt    |  24 +
 .../algs/saga/description/SeededRegionGrowing.txt  |  15 +
 .../algs/saga/description/SievingClasses.txt       |   8 +
 .../saga/description/SimpleFilterwithinshapes.txt  |   8 +
 .../algs/saga/description/SimpleKriging.txt        |  25 +
 .../SingleValueDecomposition(OpenCV).txt           |   6 +
 .../description/SlopeLimitedFlowAccumulation.txt   |  10 +
 .../algs/saga/description/Smoothing(ViGrA).txt     |   7 +
 .../algs/saga/description/SnapPointstoGrid.txt     |   9 +
 .../algs/saga/description/SnapPointstoLines.txt    |   7 +
 .../algs/saga/description/SnapPointstoPoints.txt   |   7 +
 .../algs/saga/description/SplitLinesatPoints.txt   |   7 +
 .../algs/saga/description/SplitLineswithLines.txt  |   6 +
 .../SupervisedClassificationforGrids.txt           |  21 +
 .../SupervisedClassificationforShapes.txt          |  20 +
 .../SupportVectorMachineClassification(OpenCV).txt |  15 +
 .../SurfaceGradientandConcentration.txt            |  12 +
 .../algs/saga/description/SurfaceandGradient.txt   |   6 +
 .../saga/description/SymmetricalDifference.txt     |   6 +
 .../processing/algs/saga/description/TCILow.txt    |   5 +
 .../saga/description/TasseledCapTransformation.txt |  11 +
 .../algs/saga/description/TerrainMapView.txt       |  11 +
 ...rrainSurfaceClassification(IwahashiandPike).txt |  16 +
 .../saga/description/TerrainSurfaceConvexity.txt   |  13 +
 .../saga/description/TerrainSurfaceTexture.txt     |  11 +
 .../algs/saga/description/ThiessenPolygons.txt     |   5 +
 .../description/TopofAtmosphereReflectance.txt     |  69 +++
 .../algs/saga/description/TopographicOpenness.txt  |   9 +
 .../processing/algs/saga/description/Union.txt     |   6 +
 .../processing/algs/saga/description/Update.txt    |   6 +
 .../description/UpslopeandDownslopeCurvature.txt   |   9 +
 .../algs/saga/description/ValleyDepth.txt          |   8 +
 .../ValleyandRidgeDetection(TopHatApproach).txt    |  12 +
 .../description/VegetationIndex(DistanceBased).txt |  12 +
 .../algs/saga/description/WarpingShapes.txt        |  10 +
 .../description/WatershedSegmentation(ViGrA).txt   |   7 +
 .../algs/saga/description/WindExpositionIndex.txt  |   9 +
 ...RegressionAnalysis(PointsandPredictorGrids).txt |  14 +
 python/plugins/processing/gui/AlgorithmExecutor.py |   1 +
 .../plugins/processing/gui/ScriptEditorDialog.py   |   1 -
 python/plugins/processing/tools/dataobjects.py     |  15 +-
 src/app/dwg/libdxfrw/intern/dwgreader18.cpp        |   6 +-
 src/app/qgisapp.cpp                                |   2 +-
 src/app/qgsclipboard.cpp                           |  13 +-
 src/core/qgsgml.cpp                                |  17 +-
 src/core/qgsgml.h                                  |   4 +-
 src/core/qgssnappingutils.cpp                      |   3 +-
 src/core/qgsvectorfilewriter.cpp                   | 135 ++++-
 src/core/qgsvectorlayercache.cpp                   |   1 +
 .../symbology-ng/qgsinvertedpolygonrenderer.cpp    |   8 +
 src/core/symbology-ng/qgsinvertedpolygonrenderer.h |   2 +
 src/customwidgets/CMakeLists.txt                   |   1 +
 .../editorwidgets/core/qgseditorwidgetwrapper.h    |   2 +-
 .../editorwidgets/qgsrelationreferencewidget.cpp   |   2 +-
 .../qgsvaluerelationwidgetwrapper.cpp              |  24 +
 .../editorwidgets/qgsvaluerelationwidgetwrapper.h  |   5 +
 src/providers/oracle/qgsoracleprovider.cpp         |  39 +-
 src/server/qgswfsserver.cpp                        |   4 +-
 src/server/qgswmsserver.cpp                        |   5 +-
 tests/src/app/testqgisappclipboard.cpp             |  25 +
 tests/src/core/testqgsinvertedpolygonrenderer.cpp  |  12 +
 tests/src/gui/CMakeLists.txt                       |   2 +-
 .../src/gui/testqgsvaluerelationwidgetwrapper.cpp  | 107 ++++
 tests/src/python/CMakeLists.txt                    |   1 +
 tests/src/python/test_qgsserver_two_layers.py      | 119 ++++
 tests/testdata/inverted_polys_rule.qml             | 297 +++++++++
 tests/testdata/qgis_server/secondlayer.cpg         |   1 +
 tests/testdata/qgis_server/secondlayer.dbf         | Bin 0 -> 87 bytes
 tests/testdata/qgis_server/secondlayer.prj         |   1 +
 tests/testdata/qgis_server/secondlayer.qpj         |   1 +
 tests/testdata/qgis_server/secondlayer.shp         | Bin 0 -> 404 bytes
 tests/testdata/qgis_server/secondlayer.shx         | Bin 0 -> 116 bytes
 .../qgis_server/test_project_two_layers.qgs        | 669 +++++++++++++++++++++
 .../qgis_server/wfs_getfeature_multiple.txt        |  97 +++
 176 files changed, 3254 insertions(+), 87 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 263b9b3..6249a5d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 SET(CPACK_PACKAGE_VERSION_MAJOR "2")
 SET(CPACK_PACKAGE_VERSION_MINOR "18")
-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 "Las Palmas")
 IF (POLICY CMP0048) # in CMake 3.0.0+
diff --git a/ChangeLog b/ChangeLog
index ea214ad..907cb06 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,165 @@
+Juergen E. Fischer <jef at norbit.de>	2017-08-18
+
+    Fix trusty build (QStringLiteral is Qt5; followup b6254513d64)
+
+Merge: 987f1acff8 b73b25d495
+Alessandro Pasotti <elpaso at itopen.it>	2017-08-17
+
+    Merge pull request #5030 from boundlessgeo/Win_CutAndPaste_2-18_issue16870
+
+    Clipboard Cut&Paste fix when attached special field values. Fixes #16870
+
+Luigi Pirelli <luipir at gmail.com>	2017-08-17
+
+    fixed unnecessary deepcopy and use the correct api
+
+Luigi Pirelli <luipir at gmail.com>	2017-08-06
+
+    From Clipboard Cut&Paste fix when attached special field values. Fiexies #16870
+
+Juergen E. Fischer <jef at norbit.de>	2017-08-08
+
+    oracle provider: skip updating of key attributes of added features for versioned tables (backport of e7700db46a)
+
+Matthias Kuhn <matthias at opengis.ch>	2017-08-14
+
+    Make inverted polygon legend items checkable
+
+    This was not working with legendSymbolItemsV2(), in particular tested
+    with rule based renderer.
+
+Larry Shaffer <lshaffer at boundlessgeo.com>	2017-08-14
+
+    Add QSCINTILLA_INCLUDE_DIR to custom widgets CMake setup
+
+Nyall Dawson <nyall.dawson at gmail.com>	2017-08-07
+
+    Fix valgrind jump on uninitialised values warnings
+
+Nyall Dawson <nyall.dawson at gmail.com>	2017-08-07
+
+    Fix crash when editing feature after opening a form with relation reference widget
+
+    Also fixes a leak/performance issue - the attribute table model
+    for the relation reference widget is not parented to the widget,
+    so it is never cleaned up when the widget is deleted.
+
+Merge: 8adf1c4d6b f275372489
+Alessandro Pasotti <elpaso at itopen.it>	2017-08-07
+
+    Merge pull request #4893 from cmangeat/bug_16509
+
+    allow WFS GetFeature upon multiple layers, fixes #16509
+
+Christophe Mangeat <christophe.mangeat at camptocamp.com>	2017-08-07
+
+    fix indentaton test  ? (scripts/prepare-commit.sh)
+
+Christophe Mangeat <christophe.mangeat at camptocamp.com>	2017-08-03
+
+    use unitest assert and os.path.join as adviced
+
+Juergen E. Fischer <jef at norbit.de>	2017-07-28
+
+    German translation fix
+
+tcoupin <thibault.coupin at gmail.com>	2017-07-20
+
+    Fix srsDimension parsing in GML
+
+Merge: 8ccc84ed22 399f01afb4
+Hugo Mercier <hugo.mercier at oslandia.com>	2017-07-27
+
+    Merge pull request #4925 from pblottiere/bugfix_scrolllocked_218
+
+    Fixes value relation widget to keep scrollbar activated, fixes #16654 (backport)
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-07-27
+
+    Add tests
+
+Blottiere Paul <blottiere.paul at gmail.com>	2017-07-27
+
+    Fixes value relation widget to always keep scrollbar activated. Fixes #16654
+
+rldhont <rldhont at gmail.com>	2017-07-26
+
+    [BUGFIX][SERVER] GetFeatureInfo not evaluated for maptip context when using FILTER param
+
+    fixed #16670
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-07-25
+
+    fix indentation
+
+Merge: 3f20650b1e 9593a8bb50
+Alexander Bruy <alexander.bruy at gmail.com>	2017-07-25
+
+    Merge branch 'fix_gdalmerge_nodata' of https://github.com/NaturalGIS/naturalgis_qgis into fix_gdalmerge_nodata
+
+Merge: 01e062e4bc 456e01581a
+Alexander Bruy <alexander.bruy at gmail.com>	2017-07-25
+
+    Merge branch 'fix_saga_cluster_analysis' of https://github.com/NaturalGIS/naturalgis_qgis into fix_saga_cluster_analysis
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-07-25
+
+    fix indentation
+
+Merge: 601e37351b 9a181488a6
+Alexander Bruy <alexander.bruy at gmail.com>	2017-07-25
+
+    Merge branch 'saga_desc_2_18' of https://github.com/volaya/QGIS into saga_desc_2_18
+
+Alexander Bruy <alexander.bruy at gmail.com>	2017-07-25
+
+    add missed parameter name
+
+Juergen E. Fischer <jef at norbit.de>	2017-07-24
+
+    vector layer save as: adjust our to OGR's defaults
+    * GPX_USE_EXTENSIONS default is false not true (fixes #16811)
+    * CSV GEOMETRY is none not AS_XY (fixes #16819)
+
+    (backported from commit cb088a2a0cb6224600504574f749348cc4df8bf2)
+
+Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-07-24
+
+    add a nodata option for the gdal merge tool
+
+Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-07-24
+
+    fix SAGA cluster analysis for rasters
+
+volaya <volayaf at gmail.com>	2017-07-24
+
+    [processing] fixed last commit
+
+volaya <volayaf at gmail.com>	2017-07-24
+
+    [processing] get layers list using map layer registry
+
+    fixes #16919
+
+volaya <volayaf at gmail.com>	2017-06-23
+
+    added new SAGA descriptions
+
+Merge: 29548e7df1 8b2a550c29
+Alexander Bruy <alexander.bruy at gmail.com>	2017-07-22
+
+    Merge pull request #4902 from NaturalGIS/saga_218_mosaiking
+
+    [processing] fix SAGA LTR mosaiking tool
+
+Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-07-21
+
+    fix SAGA LTR mosaiking tool
+
+Juergen E. Fischer <jef at norbit.de>	2017-07-21
+
+    Release of 2.18.11
+
 Nyall Dawson <nyall.dawson at gmail.com>	2017-07-21
 
     Correctly create raster for heatmap output
@@ -27,6 +189,16 @@ Alexander Bruy <alexander.bruy at gmail.com>	2017-07-20
 
     [processing] fix SAGA LTR Catchment Area tools
 
+Christophe Mangeat <christophe.mangeat at camptocamp.com>	2017-07-20
+
+    try to please indentation test
+
+Christophe Mangeat <christophe.mangeat at camptocamp.com>	2017-07-20
+
+    wfs, get features upon many layers, add test
+
+    and fix iterator trouble (avoid bad values in response summary, wfs:FeatureCollection, TYPENAME)
+
 Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-07-20
 
     fix QGIS import in PostGIS optional parameter. Fixes #16871
@@ -35,6 +207,10 @@ Giovanni Manghi <giovanni.manghi at naturalgis.pt>	2017-07-20
 
     fix SAGA LTR Catchement Area tools
 
+Christophe Mangeat <christophe.mangeat at camptocamp.com>	2017-07-20
+
+    fix for https://issues.qgis.org/issues/16509
+
 Merge: 3120068bf1 08d0476048
 Alexander Bruy <alexander.bruy at gmail.com>	2017-07-20
 
@@ -97,6 +273,10 @@ Nyall Dawson <nyall.dawson at gmail.com>	2017-07-17
 
     Fix bad string
 
+Alexander Bruy <alexander.bruy at gmail.com>	2017-07-16
+
+    indentation
+
 Matthias Kuhn <matthias at opengis.ch>	2017-07-13
 
     Return invalid fid instead of null fid
@@ -311,6 +491,10 @@ Juergen E. Fischer <jef at norbit.de>	2017-06-23
 
     Release of 2.18.10
 
+volaya <volayaf at gmail.com>	2017-06-23
+
+    added new SAGA descriptions
+
 Nathan Woodrow <woodrow.nathan at gmail.com>	2017-06-23
 
     [MSSQL] Don't MakeValid on geometries
diff --git a/debian/changelog b/debian/changelog
index 0a1cfab..971ce36 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,14 @@
-qgis (2.18.11) UNRELEASED; urgency=medium
+qgis (2.18.12) UNRELEASED; urgency=medium
+
+  * Release of 2.18.12
+
+ -- Jürgen E. Fischer <jef at norbit.de>  Fri, 18 Aug 2017 14:31:22 +0200
+
+qgis (2.18.11) unstable; urgency=medium
 
   * Release of 2.18.11
 
- -- Jürgen E. Fischer <jef at norbit.de>  Fri, 21 Jul 2017 14:00:06 +0200
+ -- Jürgen E. Fischer <jef at norbit.de>  Fri, 18 Aug 2017 14:31:22 +0200
 
 qgis (2.18.10) unstable; urgency=medium
 
diff --git a/i18n/qgis_de.ts b/i18n/qgis_de.ts
index c82b9b7..be5018e 100644
--- a/i18n/qgis_de.ts
+++ b/i18n/qgis_de.ts
@@ -29469,7 +29469,7 @@ Die Datei ist möglicherweise in einer anderen Anwendung geöffnet.</translation
     </message>
     <message>
         <source>Select line color</source>
-        <translation>Lienienfarbe wählen</translation>
+        <translation>Linienfarbe wählen</translation>
     </message>
     <message>
         <source>Transparent line</source>
@@ -62246,7 +62246,7 @@ und nur die Geometriespalte des Haupttypname kann als die Geometriespalte des Er
     <name>QgsSimpleLineSymbolLayerV2Widget</name>
     <message>
         <source>Select line color</source>
-        <translation>Lienienfarbe wählen</translation>
+        <translation>Linienfarbe wählen</translation>
     </message>
     <message>
         <source>Width Assistant...</source>
diff --git a/python/plugins/processing/algs/gdal/merge.py b/python/plugins/processing/algs/gdal/merge.py
index 266e174..9822e77 100644
--- a/python/plugins/processing/algs/gdal/merge.py
+++ b/python/plugins/processing/algs/gdal/merge.py
@@ -34,6 +34,7 @@ from processing.core.outputs import OutputRaster
 from processing.core.parameters import ParameterBoolean
 from processing.core.parameters import ParameterMultipleInput
 from processing.core.parameters import ParameterSelection
+from processing.core.parameters import ParameterNumber
 from processing.tools.system import isWindows
 from processing.algs.gdal.GdalUtils import GdalUtils
 
@@ -45,6 +46,7 @@ class merge(GdalAlgorithm):
     INPUT = 'INPUT'
     OUTPUT = 'OUTPUT'
     PCT = 'PCT'
+    NODATA = 'NODATA'
     SEPARATE = 'SEPARATE'
     RTYPE = 'RTYPE'
 
@@ -62,6 +64,8 @@ class merge(GdalAlgorithm):
                                            self.tr('Grab pseudocolor table from first layer'), False))
         self.addParameter(ParameterBoolean(merge.SEPARATE,
                                            self.tr('Place each input file into a separate band'), False))
+        self.addParameter(ParameterNumber(self.NODATA,
+                                          self.tr('Assign a specified nodata value to output bands'), None, None, -9999))
         self.addParameter(ParameterSelection(self.RTYPE,
                                              self.tr('Output raster type'), self.TYPE, 5))
 
@@ -69,6 +73,9 @@ class merge(GdalAlgorithm):
 
     def getConsoleCommands(self):
         arguments = []
+        if self.getParameterValue(merge.NODATA):
+            arguments.append('-a_nodata')
+            arguments.append(unicode(self.getParameterValue(merge.NODATA)))
         arguments.append('-ot')
         arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)])
         if self.getParameterValue(merge.SEPARATE):
diff --git a/python/plugins/processing/algs/saga/SagaAlgorithm.py b/python/plugins/processing/algs/saga/SagaAlgorithm.py
index f20bb19..69c5db9 100644
--- a/python/plugins/processing/algs/saga/SagaAlgorithm.py
+++ b/python/plugins/processing/algs/saga/SagaAlgorithm.py
@@ -168,7 +168,7 @@ class SagaAlgorithm(GeoAlgorithm):
                 layers = param.value.split(';')
                 if layers is None or len(layers) == 0:
                     continue
-                if param.datatype == dataobjects.TYPE_RASTER:
+                if param.datatype == ParameterMultipleInput.TYPE_RASTER:
                     for i, layerfile in enumerate(layers):
                         if layerfile.endswith('sdat'):
                             layerfile = param.value[:-4] + "sgrd"
diff --git a/python/plugins/processing/algs/saga/SagaNameDecorator.py b/python/plugins/processing/algs/saga/SagaNameDecorator.py
index c49c002..b150bfb 100644
--- a/python/plugins/processing/algs/saga/SagaNameDecorator.py
+++ b/python/plugins/processing/algs/saga/SagaNameDecorator.py
@@ -33,11 +33,17 @@ groups = {'grid_analysis': 'Raster analysis',
           'grid_gridding': 'Raster creation tools',
           'grid_spline': 'Raster creation tools',
           'grid_tools': 'Raster tools',
+          'contrib_perego': 'Raster tools',
+          'climate_tools': 'Climate tools',
           'grid_visualisation': 'Raster visualization',
           'imagery_classification': 'Image analysis',
           'imagery_rga': 'Image analysis',
           'imagery_segmentation': 'Image analysis',
           'imagery_tools': 'Image analysis',
+          'imagery_maxent': 'Image analysis',
+          'imagery_opencv': 'Image analysis',
+          'imagery_vigra': 'Image analysis',
+          'imagery_svm': 'Image analysis',
           'io_esri_e00': 'I/O',
           'io_gdal': 'I/O',
           'io_gps': 'I/O',
@@ -63,6 +69,8 @@ groups = {'grid_analysis': 'Raster analysis',
           'sim_ecosystems_hugget': 'Simulation',
           'sim_fire_spreading': 'Simulation',
           'sim_hydrology': 'Simulation',
+          'sim_rivflow': 'Simulation',
+          'sim_qm_of_esp': 'Simulation',
           'statistics_grid': 'Geostatistics',
           'statistics_kriging': 'Raster creation tools',
           'statistics_points': 'Geostatistics',
@@ -72,6 +80,7 @@ groups = {'grid_analysis': 'Raster analysis',
           'ta_hydrology': 'Terrain Analysis - Hydrology',
           'ta_lighting': 'Terrain Analysis - Lighting',
           'ta_morphometry': 'Terrain Analysis - Morphometry',
+          'ta_slope_stability': 'Terrain Analysis - Morphometry',
           'ta_preprocessor': 'Terrain Analysis - Hydrology',
           'ta_profiles': 'Terrain Analysis - Profiles',
           'table_calculus': 'Table tools',
@@ -82,11 +91,12 @@ groups = {'grid_analysis': 'Raster analysis',
 def decoratedGroupName(name):
     return groups.get(name, name)
 
+
 algorithms = {'Add Grid Values to Points': 'Add raster values to points',
               'Add Grid Values to Shapes': 'Add raster values to features',
               'Change Grid Values': 'Reclassify values (simple)',
               'Clip Grid with Polygon': 'Clip raster with polygon',
-              'Cluster Analysis for Grids': 'Cluster Analysis',
+              'K-Means Clustering for Grid': 'Cluster Analysis',
               'Contour Lines from Grid': 'Contour Lines',
               'Cubic Spline Approximation': 'Interpolate (Cubic spline)',
               'Cut Shapes Layer': 'Cut vector Layer',
diff --git a/python/plugins/processing/algs/saga/description/ANGMAP.txt b/python/plugins/processing/algs/saga/description/ANGMAP.txt
new file mode 100644
index 0000000..23ce3fd
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ANGMAP.txt
@@ -0,0 +1,10 @@
+ANGMAP
+ta_slope_stability
+ParameterRaster|DEM|Elevation|False
+ParameterRaster|C|Dip grid (degrees)|True
+ParameterRaster|D|Dip direction grid (degrees)|True
+ParameterNumber|fB|Global structure dip (degrees)|None|None| 45.000000
+ParameterNumber|fC|Global structure dip direction (degrees)|None|None| 90.000000
+OutputRaster|E|Angle
+OutputRaster|F|CL dipdir
+OutputRaster|G|CL dip
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AccumulatedCost.txt b/python/plugins/processing/algs/saga/description/AccumulatedCost.txt
new file mode 100644
index 0000000..0798ded
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AccumulatedCost.txt
@@ -0,0 +1,12 @@
+Accumulated Cost
+grid_analysis
+ParameterSelection|DEST_TYPE|Input Type of Destinations|[0] Point;[1] Grid| 0
+ParameterVector|DEST_POINTS|Destinations|-1|False
+ParameterRaster|DEST_GRID|Destinations|False
+ParameterRaster|COST|Local Cost|False
+ParameterRaster|DIR_MAXCOST|Direction of Maximum Cost|True
+ParameterSelection|DIR_UNIT|Units of Direction|[0] radians;[1] degree| 0
+ParameterNumber|DIR_K|K Factor|None|None| 2.000000
+OutputRaster|ACCUMULATED|Accumulated Cost
+OutputRaster|ALLOCATION|Allocation
+ParameterNumber|THRESHOLD|Threshold for different route| 0.000000|None| 0.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AccumulationFunctions.txt b/python/plugins/processing/algs/saga/description/AccumulationFunctions.txt
new file mode 100644
index 0000000..ef19e65
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AccumulationFunctions.txt
@@ -0,0 +1,12 @@
+Accumulation Functions
+grid_analysis
+ParameterRaster|SURFACE|Surface|False
+ParameterRaster|INPUT|Input|False
+ParameterRaster|STATE_IN|State t|True
+ParameterRaster|CONTROL|Operation Control|True
+ParameterRaster|CTRL_LINEAR|Linear Flow Control Grid|True
+OutputRaster|FLUX|Flux
+OutputRaster|STATE_OUT|State t + 1
+ParameterSelection|OPERATION|Operation|[0] accuflux;[1] accucapacityflux / state;[2] accufractionflux / state;[3] accuthresholdflux / state;[4] accutriggerflux / state| 0
+ParameterBoolean|LINEAR|Switch to Linear Flow|True
+ParameterNumber|THRES_LINEAR|Threshold Linear Flow|None|None| 0.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AddIndicatorFieldsforCategories.txt b/python/plugins/processing/algs/saga/description/AddIndicatorFieldsforCategories.txt
new file mode 100644
index 0000000..684c960
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AddIndicatorFieldsforCategories.txt
@@ -0,0 +1,6 @@
+Add Indicator Fields for Categories
+table_tools
+ParameterTable|TABLE|Table|False
+ParameterTable|FIELD|Categories|False
+ParameterTable|OUT_TABLE|Output table with field(s) deleted|True
+OutputVector|OUT_SHAPES|Output shapes with field(s) deleted
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AngularDistanceWeighted.txt b/python/plugins/processing/algs/saga/description/AngularDistanceWeighted.txt
new file mode 100644
index 0000000..9523f8f
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AngularDistanceWeighted.txt
@@ -0,0 +1,23 @@
+Angular Distance Weighted
+grid_gridding
+ParameterVector|SHAPES|Points|-1|False
+ParameterTable|FIELD|Attribute|False
+ParameterSelection|TARGET_DEFINITION|Target Grid System|[0] user defined;[1] grid or grid system| 0
+ParameterNumber|TARGET_USER_SIZE|Cellsize| 0.000000|None| 1.000000
+ParameterNumber|TARGET_USER_XMIN|Left|None|None| 0.000000
+ParameterNumber|TARGET_USER_XMAX|Right|None|None| 100.000000
+ParameterNumber|TARGET_USER_YMIN|Bottom|None|None| 0.000000
+ParameterNumber|TARGET_USER_YMAX|Top|None|None| 100.000000
+ParameterSelection|TARGET_USER_FITS|Fit|[0] nodes;[1] cells| 0
+ParameterRaster|TARGET_TEMPLATE|Target System|True
+OutputRaster|TARGET_OUT_GRID|Target Grid
+ParameterSelection|SEARCH_RANGE|Search Range|[0] local;[1] global| 0
+ParameterNumber|SEARCH_RADIUS|Maximum Search Distance| 0.000000|None| 1000.000000
+ParameterSelection|SEARCH_POINTS_ALL|Number of Points|[0] maximum number of nearest points;[1] all points within search distance| 0
+ParameterNumber|SEARCH_POINTS_MIN|Minimum| 1|None| -1
+ParameterNumber|SEARCH_POINTS_MAX|Maximum| 1|None| 20
+ParameterSelection|SEARCH_DIRECTION|Direction|[0] all directions;[1] quadrants| 0
+ParameterSelection|DW_WEIGHTING|Weighting Function|[0] no distance weighting;[1] inverse distance to a power;[2] exponential;[3] gaussian weighting| 1
+ParameterNumber|DW_IDW_POWER|Inverse Distance Weighting Power| 0.000000|None| 2.000000
+ParameterBoolean|DW_IDW_OFFSET|Inverse Distance Offset|False
+ParameterNumber|DW_BANDWIDTH|Gaussian and Exponential Weighting Bandwidth| 0.000000|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ArtificialNeuralNetworkClassification(OpenCV).txt b/python/plugins/processing/algs/saga/description/ArtificialNeuralNetworkClassification(OpenCV).txt
new file mode 100644
index 0000000..f32058d
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ArtificialNeuralNetworkClassification(OpenCV).txt
@@ -0,0 +1,22 @@
+Artificial Neural Network Classification (OpenCV)
+imagery_opencv
+ParameterMultipleInput|FEATURES|Features|3|False
+ParameterBoolean|NORMALIZE|Normalize|False
+ParameterVector|TRAIN_AREAS|Training Areas|2|False
+ParameterTable|TRAIN_CLASS|Class Identifier|False
+OutputRaster|CLASSES|Classification
+ParameterNumber|ANN_LAYERS|Number of Layers| 1|None| 3
+ParameterNumber|ANN_NEURONS|Number of Neurons| 1|None| 3
+ParameterNumber|ANN_MAXITER|Maximum Number of Iterations| 1|None| 300
+ParameterNumber|ANN_EPSILON|Error Change (Epsilon)| 0.000000|None| 0.000000
+ParameterSelection|ANN_ACTIVATION|Activation Function|[0] Identity;[1] Sigmoid;[2] Gaussian| 1
+ParameterNumber|ANN_ACT_ALPHA|Function's Alpha|None|None| 1.000000
+ParameterNumber|ANN_ACT_BETA|Function's Beta|None|None| 1.000000
+ParameterSelection|ANN_PROPAGATION|Training Method|[0] resilient propagation;[1] back propagation| 1
+ParameterNumber|ANN_RP_DW0|Initial Update Value|None|None| 0.000000
+ParameterNumber|ANN_RP_DW_PLUS|Increase Factor| 1.010000|None| 1.200000
+ParameterNumber|ANN_RP_DW_MINUS|Decrease Factor| 0.010000| 0.990000| 0.500000
+ParameterNumber|ANN_RP_DW_MIN|Lower Value Update Limit| 0.010000|None| 0.100000
+ParameterNumber|ANN_RP_DW_MAX|Upper Value Update Limit| 1.010000|None| 1.100000
+ParameterNumber|ANN_BP_DW|Weight Gradient Term|None|None| 0.100000
+ParameterNumber|ANN_BP_MOMENT|Moment Term|None|None| 0.100000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Aspect-SlopeGrid.txt b/python/plugins/processing/algs/saga/description/Aspect-SlopeGrid.txt
new file mode 100644
index 0000000..160cafc
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Aspect-SlopeGrid.txt
@@ -0,0 +1,6 @@
+Aspect-Slope Grid
+grid_visualisation
+ParameterRaster|ASPECT|Aspect|False
+ParameterRaster|SLOPE|Slope|False
+OutputRaster|ASPECT_SLOPE|Aspect-Slope
+ParameterTable|LUT|Lookup Table|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AutomatedCloudCoverAssessment.txt b/python/plugins/processing/algs/saga/description/AutomatedCloudCoverAssessment.txt
new file mode 100644
index 0000000..6d9bbf2
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AutomatedCloudCoverAssessment.txt
@@ -0,0 +1,14 @@
+Automated Cloud Cover Assessment
+imagery_tools
+ParameterRaster|BAND2|Landsat Band 2|False
+ParameterRaster|BAND3|Landsat Band 3|False
+ParameterRaster|BAND4|Landsat Band 4|False
+ParameterRaster|BAND5|Landsat Band 5|False
+ParameterRaster|BAND6|Landsat Band 6|False
+OutputRaster|CLOUD|Cloud Cover
+ParameterBoolean|FILTER|Apply post-processing filter to remove small holes|True
+ParameterNumber|B56C|B56 Composite (step 6)|None|None| 225.000000
+ParameterNumber|B45R|B45 Ratio: Desert detection (step 10)|None|None| 1.000000
+ParameterBoolean|CSIG|Always use cloud signature (step 14)|True
+ParameterBoolean|PASS2|Bypass second-pass processing, and merge warm (not ambiguous) and cold clouds|True
+ParameterBoolean|SHADOW|Include a category for cloud shadows|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AverageWithMask1.txt b/python/plugins/processing/algs/saga/description/AverageWithMask1.txt
new file mode 100644
index 0000000..13c570c
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AverageWithMask1.txt
@@ -0,0 +1,8 @@
+Average With Mask 1
+contrib_perego
+ParameterRaster|INPUT|Input|False
+ParameterRaster|MASK|Mask Grid|False
+OutputRaster|RESULT|AWM1 Grid
+ParameterNumber|V|Mask value|None|None| 1.000000
+ParameterNumber|RX|Radius X| 1|None| 1
+ParameterNumber|RY|Radius Y| 1|None| 1
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AverageWithMask2.txt b/python/plugins/processing/algs/saga/description/AverageWithMask2.txt
new file mode 100644
index 0000000..fd260f5
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AverageWithMask2.txt
@@ -0,0 +1,8 @@
+Average With Mask 2
+contrib_perego
+ParameterRaster|INPUT|Input|False
+ParameterRaster|MASK|Mask Grid|False
+OutputRaster|RESULT|AWM2 Grid
+ParameterNumber|V|Mask value|None|None| 1.000000
+ParameterNumber|RX|Radius X| 1|None| 1
+ParameterNumber|RY|Radius Y| 1|None| 1
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AverageWithThereshold1.txt b/python/plugins/processing/algs/saga/description/AverageWithThereshold1.txt
new file mode 100644
index 0000000..346949c
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AverageWithThereshold1.txt
@@ -0,0 +1,7 @@
+Average With Thereshold 1
+contrib_perego
+ParameterRaster|INPUT|Input|False
+OutputRaster|RESULT|AWT Grid
+ParameterNumber|RX|Radius X| 1|None| 1
+ParameterNumber|RY|Radius Y| 1|None| 1
+ParameterNumber|THRESH|Threshold|None|None| 2.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AverageWithThereshold2.txt b/python/plugins/processing/algs/saga/description/AverageWithThereshold2.txt
new file mode 100644
index 0000000..1991ead
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AverageWithThereshold2.txt
@@ -0,0 +1,7 @@
+Average With Thereshold 2
+contrib_perego
+ParameterRaster|INPUT|Input|False
+OutputRaster|RESULT|AWT Grid
+ParameterNumber|RX|Radius X| 1|None| 1
+ParameterNumber|RY|Radius Y| 1|None| 1
+ParameterNumber|THRESH|Threshold|None|None| 2.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/AverageWithThereshold3.txt b/python/plugins/processing/algs/saga/description/AverageWithThereshold3.txt
new file mode 100644
index 0000000..3d17c33
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/AverageWithThereshold3.txt
@@ -0,0 +1,7 @@
+Average With Thereshold 3
+contrib_perego
+ParameterRaster|INPUT|Input|False
+OutputRaster|RESULT|AWT Grid
+ParameterNumber|RX|Radius X| 1|None| 1
+ParameterNumber|RY|Radius Y| 1|None| 1
+ParameterNumber|THRESH|Threshold|None|None| 2.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/BasicTerrainAnalysis.txt b/python/plugins/processing/algs/saga/description/BasicTerrainAnalysis.txt
new file mode 100644
index 0000000..43cd020
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/BasicTerrainAnalysis.txt
@@ -0,0 +1,20 @@
+Basic Terrain Analysis
+ta_compound
+ParameterRaster|ELEVATION|Elevation|False
+OutputRaster|SHADE|Analytical Hillshading
+OutputRaster|SLOPE|Slope
+OutputRaster|ASPECT|Aspect
+OutputRaster|HCURV|Plan Curvature
+OutputRaster|VCURV|Profile Curvature
+OutputRaster|CONVERGENCE|Convergence Index
+OutputRaster|SINKS|Closed Depressions
+OutputRaster|FLOW|Total Catchment Area
+OutputRaster|WETNESS|Topographic Wetness Index
+OutputRaster|LSFACTOR|LS-Factor
+OutputVector|CHANNELS|Channel Network
+OutputVector|BASINS|Drainage Basins
+OutputRaster|CHNL_BASE|Channel Network Base Level
+OutputRaster|CHNL_DIST|Channel Network Distance
+OutputRaster|VALL_DEPTH|Valley Depth
+OutputRaster|RSP|Relative Slope Position
+ParameterNumber|THRESHOLD|Channel Density| 1|None| 5
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/BinaryErosion-Reconstruction.txt b/python/plugins/processing/algs/saga/description/BinaryErosion-Reconstruction.txt
new file mode 100644
index 0000000..29c47b2
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/BinaryErosion-Reconstruction.txt
@@ -0,0 +1,5 @@
+Binary Erosion-Reconstruction
+grid_filter
+ParameterRaster|INPUT_GRID|Input Grid|False
+OutputRaster|OUTPUT_GRID|Output Grid
+ParameterNumber|RADIUS|Filter Size (Radius)|None|None| 3
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/BioclimaticVariables.txt b/python/plugins/processing/algs/saga/description/BioclimaticVariables.txt
new file mode 100644
index 0000000..32ef323
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/BioclimaticVariables.txt
@@ -0,0 +1,26 @@
+Bioclimatic Variables
+climate_tools
+ParameterMultipleInput|TMEAN|Mean Temperature|3|False
+ParameterMultipleInput|TMIN|Minimum Temperature|3|False
+ParameterMultipleInput|TMAX|Maximum Temperature|3|False
+ParameterMultipleInput|P|Precipitation|3|False
+OutputRaster|BIO_01|Annual Mean Temperature
+OutputRaster|BIO_02|Mean Diurnal Range
+OutputRaster|BIO_03|Isothermality
+OutputRaster|BIO_04|Temperature Seasonality
+OutputRaster|BIO_05|Maximum Temperature of Warmest Month
+OutputRaster|BIO_06|Minimum Temperature of Coldest Month
+OutputRaster|BIO_07|Temperature Annual Range
+OutputRaster|BIO_08|Mean Temperature of Wettest Quarter
+OutputRaster|BIO_09|Mean Temperature of Driest Quarter
+OutputRaster|BIO_10|Mean Temperature of Warmest Quarter
+OutputRaster|BIO_11|Mean Temperature of Coldest Quarter
+OutputRaster|BIO_12|Annual Precipitation
+OutputRaster|BIO_13|Precipitation of Wettest Month
+OutputRaster|BIO_14|Precipitation of Driest Month
+OutputRaster|BIO_15|Precipitation Seasonality
+OutputRaster|BIO_16|Precipitation of Wettest Quarter
+OutputRaster|BIO_17|Precipitation of Driest Quarter
+OutputRaster|BIO_18|Precipitation of Warmest Quarter
+OutputRaster|BIO_19|Precipitation of Coldest Quarter
+ParameterSelection|SEASONALITY|Temperature Seasonality|[0] Coefficient of Variation;[1] Standard Deviation| 1
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/BoostingClassification(OpenCV).txt b/python/plugins/processing/algs/saga/description/BoostingClassification(OpenCV).txt
new file mode 100644
index 0000000..c39bb62
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/BoostingClassification(OpenCV).txt
@@ -0,0 +1,16 @@
+Boosting Classification (OpenCV)
+imagery_opencv
+ParameterMultipleInput|FEATURES|Features|3|False
+ParameterBoolean|NORMALIZE|Normalize|False
+ParameterVector|TRAIN_AREAS|Training Areas|-1|False
+ParameterTable|TRAIN_CLASS|Class Identifier|False
+OutputRaster|CLASSES|Classification
+ParameterNumber|MAX_DEPTH|Maximum Tree Depth| 1|None| 10
+ParameterNumber|MIN_SAMPLES|Minimum Sample Count| 2|None| 2
+ParameterNumber|MAX_CATEGRS|Maximum Categories| 1|None| 10
+ParameterBoolean|1SE_RULE|Use 1SE Rule|True
+ParameterBoolean|TRUNC_PRUNED|Truncate Pruned Trees|True
+ParameterNumber|REG_ACCURACY|Regression Accuracy| 0.000000|None| 0.010000
+ParameterNumber|WEAK_COUNT|Weak Count| 0|None| 100
+ParameterNumber|WGT_TRIM_RATE|Weight Trim Rate| 0.000000| 1.000000| 0.950000
+ParameterSelection|BOOST_TYPE|Boost Type|[0] Discrete AdaBoost;[1] Real AdaBoost;[2] LogitBoost;[3] Gentle AdaBoost| 1
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/CategoricalCoincidence.txt b/python/plugins/processing/algs/saga/description/CategoricalCoincidence.txt
new file mode 100644
index 0000000..159816f
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/CategoricalCoincidence.txt
@@ -0,0 +1,8 @@
+Categorical Coincidence
+statistics_grid
+ParameterMultipleInput|GRIDS|Grids|3|False
+OutputRaster|CATEGORIES|Number of Categories
+OutputRaster|COINCIDENCE|Coincidence
+OutputRaster|MAJ_COUNT|Dominance of Majority
+OutputRaster|MAJ_VALUE|Value of Majority
+ParameterNumber|RADIUS|Radius [Cells]| 0|None| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ChangeDataStorage.txt b/python/plugins/processing/algs/saga/description/ChangeDataStorage.txt
new file mode 100644
index 0000000..d52c9ee
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ChangeDataStorage.txt
@@ -0,0 +1,7 @@
+Change Data Storage
+grid_tools
+ParameterRaster|INPUT|Grid|False
+OutputRaster|OUTPUT|Converted Grid
+ParameterSelection|TYPE|Data storage type|[0] bit;[1] unsigned 1 byte integer;[2] signed 1 byte integer;[3] unsigned 2 byte integer;[4] signed 2 byte integer;[5] unsigned 4 byte integer;[6] signed 4 byte integer;[7] 4 byte floating point number;[8] 8 byte floating point number| 7
+ParameterNumber|OFFSET|Offset|None|None| 0.000000
+ParameterNumber|SCALE|Scale|None|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/CloseGapswithStepwiseResampling.txt b/python/plugins/processing/algs/saga/description/CloseGapswithStepwiseResampling.txt
new file mode 100644
index 0000000..e6a8d53
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/CloseGapswithStepwiseResampling.txt
@@ -0,0 +1,10 @@
+Close Gaps with Stepwise Resampling
+grid_tools
+ParameterRaster|INPUT|Grid|False
+ParameterRaster|MASK|Mask|True
+OutputRaster|RESULT|Result
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbour;[1] Bilinear Interpolation;[2] Bicubic Spline Interpolation;[3] B-Spline Interpolation| 3
+ParameterNumber|GROW|Grow Factor| 1.000000|None| 2.000000
+ParameterBoolean|PYRAMIDS|Use Pyramids|False
+ParameterSelection|START|Start Size|[0] grid cell size;[1] user defined size| 0
+ParameterNumber|START_SIZE|User Defined Size| 0.000000|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ClusterAnalysis(Shapes).txt b/python/plugins/processing/algs/saga/description/ClusterAnalysis(Shapes).txt
new file mode 100644
index 0000000..0967d7a
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ClusterAnalysis(Shapes).txt
@@ -0,0 +1,10 @@
+Cluster Analysis (Shapes)
+table_calculus
+ParameterVector|INPUT|Shapes|-1|False
+OutputVector|RESULT|Result
+ParameterTable|FIELDS|Attributes|False
+ParameterTable|CLUSTER|Cluster|False
+ParameterTable|STATISTICS|Statistics|False
+ParameterSelection|METHOD|Method|[0] Iterative Minimum Distance (Forgy 1965);[1] Hill-Climbing (Rubin 1967);[2] Combined Minimum Distance / Hillclimbing| 1
+ParameterNumber|NCLUSTER|Clusters| 2|None| 10
+ParameterBoolean|NORMALISE|Normalise|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ClusterAnalysis.txt b/python/plugins/processing/algs/saga/description/ClusterAnalysis.txt
new file mode 100644
index 0000000..702d24d
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ClusterAnalysis.txt
@@ -0,0 +1,10 @@
+Cluster Analysis
+table_calculus
+ParameterTable|INPUT|Table|False
+ParameterTable|RESULT|Result|True
+ParameterTable|FIELDS|Attributes|False
+ParameterTable|CLUSTER|Cluster|False
+ParameterTable|STATISTICS|Statistics|False
+ParameterSelection|METHOD|Method|[0] Iterative Minimum Distance (Forgy 1965);[1] Hill-Climbing (Rubin 1967);[2] Combined Minimum Distance / Hillclimbing| 1
+ParameterNumber|NCLUSTER|Clusters| 2|None| 10
+ParameterBoolean|NORMALISE|Normalise|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ClusterAnalysisforGrids.txt b/python/plugins/processing/algs/saga/description/ClusterAnalysisforGrids.txt
index 0c477e9..08b100e 100644
--- a/python/plugins/processing/algs/saga/description/ClusterAnalysisforGrids.txt
+++ b/python/plugins/processing/algs/saga/description/ClusterAnalysisforGrids.txt
@@ -1,9 +1,11 @@
-Cluster Analysis for Grids
+K-Means Clustering for Grids
 imagery_classification
 ParameterMultipleInput|GRIDS|Grids|3.0|False
 ParameterSelection|METHOD|Method|[0] Iterative Minimum Distance (Forgy 1965);[1] Hill-Climbing (Rubin 1967);[2] Combined Minimum Distance / Hillclimbing
-ParameterNumber|NCLUSTER|Clusters|None|None|5
-ParameterBoolean|NORMALISE       |Normalise|True
-ParameterBoolean|OLDVERSION      |Old Version|True
+ParameterNumber|NCLUSTER|Clusters|2|None|10
+ParameterNumber|MAXITER|Maximum Iterations|0|None|0
+ParameterBoolean|NORMALISE|Normalise|True
+ParameterBoolean|OLDVERSION|Old Version|False
+ParameterBoolean|UPDATEVIEW|Update View|False
 OutputRaster|CLUSTER|Clusters
-OutputTable|STATISTICS|Statistics
+OutputTable|STATISTICS|Statistics
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Concentration.txt b/python/plugins/processing/algs/saga/description/Concentration.txt
new file mode 100644
index 0000000..1751808
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Concentration.txt
@@ -0,0 +1,10 @@
+Concentration
+sim_hydrology
+ParameterRaster|MASK|Mask|False
+ParameterRaster|GRAD|Gradient|False
+OutputRaster|CONC|Concentration
+ParameterNumber|CONC_IN|Inlet Concentration| 0.000000|None| 5.000000
+ParameterNumber|CONC_OUT|Outlet Concentration| 0.000000|None| 3.000000
+ParameterNumber|CONC_E|Concentration Approximation Threshold| 0.000000|None| 0.001000
+ParameterNumber|GRAD_MIN|Minimum Gradient| 0.000000|None| 0.000000
+ParameterSelection|NEIGHBOURS|Neighbourhood|[0] Moore (8);[1] Neumann (4);[2] Optimised| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ConfusionMatrix(PolygonsGrid).txt b/python/plugins/processing/algs/saga/description/ConfusionMatrix(PolygonsGrid).txt
new file mode 100644
index 0000000..640b11d
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ConfusionMatrix(PolygonsGrid).txt
@@ -0,0 +1,12 @@
+Confusion Matrix (Polygons / Grid)
+imagery_classification
+ParameterRaster|GRID|Classification|False
+ParameterTable|GRID_LUT|Look-up Table|True
+ParameterTable|GRID_LUT_MIN|Value|False
+ParameterTable|GRID_LUT_MAX|Value (Maximum)|False
+ParameterTable|GRID_LUT_NAM|Name|False
+ParameterVector|POLYGONS|Polygons|-1|False
+ParameterTable|FIELD|Classes|False
+ParameterTable|CONFUSION|Confusion Matrix|False
+ParameterTable|CLASSES|Class Values|False
+ParameterTable|SUMMARY|Summary|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ConfusionMatrix(TwoGrids).txt b/python/plugins/processing/algs/saga/description/ConfusionMatrix(TwoGrids).txt
new file mode 100644
index 0000000..32002a8
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ConfusionMatrix(TwoGrids).txt
@@ -0,0 +1,18 @@
+Confusion Matrix (Two Grids)
+imagery_classification
+ParameterRaster|ONE|Classification 1|False
+ParameterTable|ONE_LUT|Look-up Table|True
+ParameterTable|ONE_LUT_MIN|Value|False
+ParameterTable|ONE_LUT_MAX|Value (Maximum)|False
+ParameterTable|ONE_LUT_NAM|Name|False
+ParameterRaster|TWO|Classification 2|False
+ParameterTable|TWO_LUT|Look-up Table|True
+ParameterTable|TWO_LUT_MIN|Value|False
+ParameterTable|TWO_LUT_MAX|Value (Maximum)|False
+ParameterTable|TWO_LUT_NAM|Name|False
+OutputRaster|COMBINED|Combined Classes
+ParameterBoolean|NOCHANGE|Report Unchanged Classes|True
+ParameterTable|CONFUSION|Confusion Matrix|False
+ParameterSelection|OUTPUT|Output as...|[0] cells;[1] percent;[2] area| 0
+ParameterTable|CLASSES|Class Values|False
+ParameterTable|SUMMARY|Summary|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ConnectivityAnalysis.txt b/python/plugins/processing/algs/saga/description/ConnectivityAnalysis.txt
new file mode 100644
index 0000000..c3a51b4
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ConnectivityAnalysis.txt
@@ -0,0 +1,10 @@
+Connectivity Analysis
+grid_filter
+ParameterRaster|INPUT_GRID|Input Binary Grid|False
+OutputRaster|FILTERED_MASK|Filtered Image
+ParameterBoolean|FILTER|Apply Filter?|True
+ParameterNumber|SIZE|Filter Size (Radius)|None|None| 3
+OutputRaster|SYMBOLIC_IMAGE|Symbolic Image
+OutputVector|OUTLINES|Outlines
+ParameterBoolean|BORDER_PIXEL_CENTERS|Pixel Centers?|False
+ParameterBoolean|REMOVE_MARGINAL_REGIONS|Remove Border Regions?|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ConstantGrid.txt b/python/plugins/processing/algs/saga/description/ConstantGrid.txt
new file mode 100644
index 0000000..c60ba63
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ConstantGrid.txt
@@ -0,0 +1,14 @@
+Constant Grid
+grid_tools
+ParameterString|NAME|Name
+ParameterNumber|CONST|Constant Value|None|None| 1.000000
+ParameterSelection|TYPE|Data Type|[0] bit;[1] unsigned 1 byte integer;[2] signed 1 byte integer;[3] unsigned 2 byte integer;[4] signed 2 byte integer;[5] unsigned 8 byte integer;[6] signed 8 byte integer;[7] 4 byte floating point number;[8] 8 byte floating point number| 7
+ParameterSelection|DEFINITION|Target Grid System|[0] user defined;[1] grid or grid system| 0
+ParameterNumber|USER_SIZE|Cellsize| 0.000000|None| 1.000000
+ParameterNumber|USER_XMIN|Left|None|None| 0.000000
+ParameterNumber|USER_XMAX|Right|None|None| 100.000000
+ParameterNumber|USER_YMIN|Bottom|None|None| 0.000000
+ParameterNumber|USER_YMAX|Top|None|None| 100.000000
+ParameterSelection|USER_FITS|Fit|[0] nodes;[1] cells| 0
+ParameterRaster|TEMPLATE|Target System|True
+OutputRaster|OUT_GRID|Target Grid
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/CoveredDistance.txt b/python/plugins/processing/algs/saga/description/CoveredDistance.txt
new file mode 100644
index 0000000..66e73f6
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/CoveredDistance.txt
@@ -0,0 +1,4 @@
+Covered Distance
+grid_analysis
+ParameterMultipleInput|INPUT|Grids|3|False
+OutputRaster|RESULT|Covered Distance
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/CreatePointGrid.txt b/python/plugins/processing/algs/saga/description/CreatePointGrid.txt
new file mode 100644
index 0000000..92751ef
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/CreatePointGrid.txt
@@ -0,0 +1,8 @@
+Create Point Grid
+shapes_points
+OutputVector|POINTS|Point Grid
+ParameterNumber|X_EXTENT_MIN|X-Extent (Min)|None|None|None
+ParameterNumber|X_EXTENT_MAX|X-Extent (Max)|None|None|None
+ParameterNumber|Y_EXTENT_MIN|Y-Extent (Min)|None|None|None
+ParameterNumber|Y_EXTENT_MAX|Y-Extent (Max)|None|None|None
+ParameterNumber|DIST|Distance|None|None| 100.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/DecisionTreeClassification(OpenCV).txt b/python/plugins/processing/algs/saga/description/DecisionTreeClassification(OpenCV).txt
new file mode 100644
index 0000000..9482928
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/DecisionTreeClassification(OpenCV).txt
@@ -0,0 +1,13 @@
+Decision Tree Classification (OpenCV)
+imagery_opencv
+ParameterMultipleInput|FEATURES|Features|3|False
+ParameterBoolean|NORMALIZE|Normalize|False
+ParameterVector|TRAIN_AREAS|Training Areas|-1|False
+ParameterTable|TRAIN_CLASS|Class Identifier|False
+OutputRaster|CLASSES|Classification
+ParameterNumber|MAX_DEPTH|Maximum Tree Depth| 1|None| 10
+ParameterNumber|MIN_SAMPLES|Minimum Sample Count| 2|None| 2
+ParameterNumber|MAX_CATEGRS|Maximum Categories| 1|None| 10
+ParameterBoolean|1SE_RULE|Use 1SE Rule|True
+ParameterBoolean|TRUNC_PRUNED|Truncate Pruned Trees|True
+ParameterNumber|REG_ACCURACY|Regression Accuracy| 0.000000|None| 0.010000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Destriping.txt b/python/plugins/processing/algs/saga/description/Destriping.txt
new file mode 100644
index 0000000..00957ae
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Destriping.txt
@@ -0,0 +1,9 @@
+Destriping
+contrib_perego
+ParameterRaster|INPUT|Input|False
+OutputRaster|RESULT3|Destriped Grid
+OutputRaster|RESULT1|Low-pass 1
+OutputRaster|RESULT2|Low-pass 2
+ParameterNumber|ANG|Angle (in degrees)|None|None| 0.000000
+ParameterNumber|R|Radius|None|None| 10.000000
+ParameterNumber|D|Stripes distance|None|None| 2.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/DestripingwithMask.txt b/python/plugins/processing/algs/saga/description/DestripingwithMask.txt
new file mode 100644
index 0000000..87ade0d
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/DestripingwithMask.txt
@@ -0,0 +1,14 @@
+Destriping with Mask
+contrib_perego
+ParameterRaster|INPUT|Input|False
+ParameterRaster|MASK|Mask Grid|False
+OutputRaster|RESULT3|Destriped Grid
+OutputRaster|RESULT1|Low-pass 1
+OutputRaster|RESULT2|Low-pass 2
+ParameterNumber|ANG|Angle (in degrees)|None|None| 0.000000
+ParameterNumber|R|Radius|None|None| 20.000000
+ParameterNumber|D|Stripes distance|None|None| 2.000000
+ParameterNumber|MIN|Min|None|None| -10.000000
+ParameterNumber|MAX|Max|None|None| 10.000000
+ParameterNumber|MMIN|Mask Min|None|None| -10000.000000
+ParameterNumber|MMAX|Mask Max|None|None| 10000.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Difference.txt b/python/plugins/processing/algs/saga/description/Difference.txt
new file mode 100644
index 0000000..8f1d07f
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Difference.txt
@@ -0,0 +1,6 @@
+Difference
+shapes_polygons
+ParameterVector|A|Layer A|-1|False
+ParameterVector|B|Layer B|-1|False
+OutputVector|RESULT|Difference
+ParameterBoolean|SPLIT|Split Parts|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/DiffusePollutionRisk.txt b/python/plugins/processing/algs/saga/description/DiffusePollutionRisk.txt
new file mode 100644
index 0000000..df79b90
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/DiffusePollutionRisk.txt
@@ -0,0 +1,13 @@
+Diffuse Pollution Risk
+sim_hydrology
+ParameterRaster|DEM|Elevation|False
+ParameterRaster|CHANNEL|Channel Network|True
+ParameterRaster|WEIGHT|Land Cover Weights|True
+ParameterNumber|WEIGHT_DEFAULT|Default| 0.000000|None| 1.000000
+ParameterRaster|RAIN|Rainfall|True
+ParameterNumber|RAIN_DEFAULT|Default| 0.000000|None| 500.000000
+OutputRaster|DELIVERY|Delivery Index
+OutputRaster|RISK_POINT|Locational Risk
+OutputRaster|RISK_DIFFUSE|Diffuse Pollution Risk
+ParameterSelection|METHOD|Flow Direction Algorithm|[0] single;[1] multiple| 1
+ParameterNumber|CHANNEL_START|Channel Initiation Threshold| 1|None| 150
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/DirectionalAverage.txt b/python/plugins/processing/algs/saga/description/DirectionalAverage.txt
new file mode 100644
index 0000000..9a0f6f5
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/DirectionalAverage.txt
@@ -0,0 +1,7 @@
+Directional Average
+contrib_perego
+ParameterRaster|INPUT|Input|False
+OutputRaster|RESULT|Output Grid
+ParameterNumber|ANG|Angle (in degrees)|None|None| 0.000000
+ParameterNumber|R1|Main Radius|None|None| 1.000000
+ParameterNumber|R2|Transversal radius|None|None| 0.500000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Distance(ViGrA).txt b/python/plugins/processing/algs/saga/description/Distance(ViGrA).txt
new file mode 100644
index 0000000..e4d3201
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Distance(ViGrA).txt
@@ -0,0 +1,5 @@
+Distance (ViGrA)
+imagery_vigra
+ParameterRaster|INPUT|Features|False
+OutputRaster|OUTPUT|Distance
+ParameterSelection|NORM|Type of distance calculation|[0] Chessboard;[1] Manhattan;[2] Euclidean| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/EarthsOrbitalParameters.txt b/python/plugins/processing/algs/saga/description/EarthsOrbitalParameters.txt
new file mode 100644
index 0000000..a086d2b
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/EarthsOrbitalParameters.txt
@@ -0,0 +1,6 @@
+Earth's Orbital Parameters
+climate_tools
+ParameterTable|ORBPAR|Earth's Orbital Parameters|False
+ParameterNumber|START|Start [ka]|None|None| -200.000000
+ParameterNumber|STOP|Stop [ka]|None|None| 2.000000
+ParameterNumber|STEP|Step [ka]| 0.001000|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/EdgeDetection(ViGrA).txt b/python/plugins/processing/algs/saga/description/EdgeDetection(ViGrA).txt
new file mode 100644
index 0000000..f67e399
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/EdgeDetection(ViGrA).txt
@@ -0,0 +1,7 @@
+Edge Detection (ViGrA)
+imagery_vigra
+ParameterRaster|INPUT|Input|False
+OutputRaster|OUTPUT|Edges
+ParameterSelection|TYPE|Detector type|[0] Canny;[1] Shen-Castan| 0
+ParameterNumber|SCALE|Operator scale| 0.000000|None| 1.000000
+ParameterNumber|THRESHOLD|Gradient threshold| 0.000000|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/EnhancedVegetationIndex.txt b/python/plugins/processing/algs/saga/description/EnhancedVegetationIndex.txt
new file mode 100644
index 0000000..b6f39ad
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/EnhancedVegetationIndex.txt
@@ -0,0 +1,10 @@
+Enhanced Vegetation Index
+imagery_tools
+ParameterRaster|BLUE|Blue Reflectance|True
+ParameterRaster|RED|Red Reflectance|False
+ParameterRaster|NIR|Near Infrared Reflectance|False
+OutputRaster|EVI|Enhanced Vegetation Index
+ParameterNumber|GAIN|Gain| 0.000000|None| 2.500000
+ParameterNumber|L|Canopy Background Adjustment| 0.000000|None| 1.000000
+ParameterNumber|CBLUE|Aerosol Resistance Coefficient (Blue)| 0.000000|None| 7.500000
+ParameterNumber|CRED|Aerosol Resistance Coefficient (Red)| 0.000000|None| 6.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/EnumerateTableField.txt b/python/plugins/processing/algs/saga/description/EnumerateTableField.txt
new file mode 100644
index 0000000..03231b6
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/EnumerateTableField.txt
@@ -0,0 +1,5 @@
+Enumerate Table Field
+table_tools
+ParameterTable|INPUT|Input|False
+ParameterTable|FIELD|Attribute|False
+ParameterTable|OUTPUT|Output|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FieldStatistics.txt b/python/plugins/processing/algs/saga/description/FieldStatistics.txt
new file mode 100644
index 0000000..9ba4f3d
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/FieldStatistics.txt
@@ -0,0 +1,5 @@
+Field Statistics
+table_calculus
+ParameterTable|TABLE|Table|False
+ParameterTable|FIELDS|Attributes|False
+ParameterTable|STATISTICS|Statistics|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FindFieldofExtremeValue.txt b/python/plugins/processing/algs/saga/description/FindFieldofExtremeValue.txt
new file mode 100644
index 0000000..cba0a96
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/FindFieldofExtremeValue.txt
@@ -0,0 +1,9 @@
+Find Field of Extreme Value
+table_calculus
+ParameterTable|INPUT|Input|False
+ParameterTable|FIELDS|Attributes|False
+ParameterTable|EXTREME_ID|Attribute|False
+ParameterTable|EXTREME_VALUE|Value|False
+ParameterTable|OUTPUT|Output|True
+ParameterSelection|TYPE|TYPE|[0] minimum;[1] maximum| 1
+ParameterSelection|IDENTIFY|Attribute Identification|[0] name;[1] index| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FourierFilter(ViGrA).txt b/python/plugins/processing/algs/saga/description/FourierFilter(ViGrA).txt
new file mode 100644
index 0000000..1c062d0
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/FourierFilter(ViGrA).txt
@@ -0,0 +1,9 @@
+Fourier Filter (ViGrA)
+imagery_vigra
+ParameterRaster|INPUT|Input|False
+OutputRaster|OUTPUT|Output
+ParameterNumber|SCALE|Size of smoothing filter| 0.000000|None| 2.000000
+ParameterNumber|POWER|Power|None|None| 0.500000
+ParameterNumber|RANGE_MIN|Range (Min)|None|None|None
+ParameterNumber|RANGE_MAX|Range (Max)|None|None|None
+ParameterSelection|FILTER|Filter|[0] gaussian;[1] power of distance;[2] include range;[3] exclude range| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FourierTransform(RealViGrA).txt b/python/plugins/processing/algs/saga/description/FourierTransform(RealViGrA).txt
new file mode 100644
index 0000000..cea405f
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/FourierTransform(RealViGrA).txt
@@ -0,0 +1,4 @@
+Fourier Transform (Real, ViGrA)
+imagery_vigra
+ParameterRaster|INPUT|Input|False
+OutputRaster|OUTPUT|Output
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FourierTransform(ViGrA).txt b/python/plugins/processing/algs/saga/description/FourierTransform(ViGrA).txt
new file mode 100644
index 0000000..368f152
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/FourierTransform(ViGrA).txt
@@ -0,0 +1,6 @@
+Fourier Transform (ViGrA)
+imagery_vigra
+ParameterRaster|INPUT|Input|False
+OutputRaster|REAL|Real
+OutputRaster|IMAG|Imaginary
+ParameterBoolean|CENTER|Centered|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FourierTransformInverse(ViGrA).txt b/python/plugins/processing/algs/saga/description/FourierTransformInverse(ViGrA).txt
new file mode 100644
index 0000000..4c93e01
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/FourierTransformInverse(ViGrA).txt
@@ -0,0 +1,6 @@
+Fourier Transform Inverse (ViGrA)
+imagery_vigra
+ParameterRaster|REAL|Real|False
+ParameterRaster|IMAG|Imaginary|False
+OutputRaster|OUTPUT|Output
+ParameterBoolean|CENTER|Centered|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FourierTransformation(OpenCV).txt b/python/plugins/processing/algs/saga/description/FourierTransformation(OpenCV).txt
new file mode 100644
index 0000000..15a9526
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/FourierTransformation(OpenCV).txt
@@ -0,0 +1,5 @@
+Fourier Transformation (OpenCV)
+imagery_opencv
+ParameterRaster|INPUT|Input|False
+OutputRaster|REAL|Fourier Transformation (Real)
+OutputRaster|IMAG|Fourier Transformation (Imaginary)
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FunctionFit.txt b/python/plugins/processing/algs/saga/description/FunctionFit.txt
new file mode 100644
index 0000000..91f68ec
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/FunctionFit.txt
@@ -0,0 +1,9 @@
+Function Fit
+table_calculus
+ParameterTable|SOURCE|Source|False
+ParameterTable|YFIELD|y - Values|False
+ParameterSelection|USE_X|Use x -Values|[0] No;[1] Yes| 0
+ParameterTable|XFIELD|x - Values|False
+ParameterString|FORMEL|Formula
+ParameterNumber|ITER|Iterationen| 1|None| 1000
+ParameterNumber|LAMDA|Max Lamda| 1.000000|None| 10000.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/FuzzyLandformElementClassification.txt b/python/plugins/processing/algs/saga/description/FuzzyLandformElementClassification.txt
new file mode 100644
index 0000000..e9c9532
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/FuzzyLandformElementClassification.txt
@@ -0,0 +1,31 @@
+Fuzzy Landform Element Classification
+ta_morphometry
+ParameterRaster|SLOPE|Slope|False
+ParameterRaster|MINCURV|Minimum Curvature|False
+ParameterRaster|MAXCURV|Maximum Curvature|False
+ParameterRaster|PCURV|Profile Curvature|False
+ParameterRaster|TCURV|Tangential Curvature|False
+OutputRaster|PLAIN|Plain
+OutputRaster|PIT|Pit
+OutputRaster|PEAK|Peak
+OutputRaster|RIDGE|Ridge
+OutputRaster|CHANNEL|Channel
+OutputRaster|SADDLE|Saddle
+OutputRaster|BSLOPE|Back Slope
+OutputRaster|FSLOPE|Foot Slope
+OutputRaster|SSLOPE|Shoulder Slope
+OutputRaster|HOLLOW|Hollow
+OutputRaster|FHOLLOW|Foot Hollow
+OutputRaster|SHOLLOW|Shoulder Hollow
+OutputRaster|SPUR|Spur
+OutputRaster|FSPUR|Foot Spur
+OutputRaster|SSPUR|Shoulder Spur
+OutputRaster|FORM|Landform
+OutputRaster|MEM|Maximum Membership
+OutputRaster|ENTROPY|Entropy
+OutputRaster|CI|Confusion Index
+ParameterSelection|SLOPETODEG|Slope Grid Units|[0] degree;[1] radians| 0
+ParameterNumber|T_SLOPE_MIN|Slope Thresholds [Degree] (Min)|None|None|None
+ParameterNumber|T_SLOPE_MAX|Slope Thresholds [Degree] (Max)|None|None|None
+ParameterNumber|T_CURVE_MIN|Curvature Thresholds [1 / m] (Min)|None|None|None
+ParameterNumber|T_CURVE_MAX|Curvature Thresholds [1 / m] (Max)|None|None|None
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/GWRforMultiplePredictors.txt b/python/plugins/processing/algs/saga/description/GWRforMultiplePredictors.txt
new file mode 100644
index 0000000..4f315ed
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/GWRforMultiplePredictors.txt
@@ -0,0 +1,16 @@
+GWR for Multiple Predictors
+statistics_regression
+ParameterVector|POINTS|Points|0|False
+ParameterTable|DEPENDENT|Dependent Variable|False
+ParameterTable|PREDICTORS|Predictors|False
+OutputVector|REGRESSION|Regression
+ParameterSelection|DW_WEIGHTING|Weighting Function|[0] no distance weighting;[1] inverse distance to a power;[2] exponential;[3] gaussian weighting| 3
+ParameterNumber|DW_IDW_POWER|Inverse Distance Weighting Power| 0.000000|None| 1.000000
+ParameterBoolean|DW_IDW_OFFSET|Inverse Distance Offset|True
+ParameterNumber|DW_BANDWIDTH|Gaussian and Exponential Weighting Bandwidth| 0.000000|None| 1.000000
+ParameterSelection|SEARCH_RANGE|Search Range|[0] local;[1] global| 0
+ParameterNumber|SEARCH_RADIUS|Maximum Search Distance| 0.000000|None| 1000.000000
+ParameterSelection|SEARCH_POINTS_ALL|Number of Points|[0] maximum number of nearest points;[1] all points within search distance| 0
+ParameterNumber|SEARCH_POINTS_MIN|Minimum| 1|None| 16
+ParameterNumber|SEARCH_POINTS_MAX|Maximum| 1|None| 20
+ParameterSelection|SEARCH_DIRECTION|Direction|[0] all directions;[1] quadrants| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/GWRforSinglePredictor(GriddedModelOutput).txt b/python/plugins/processing/algs/saga/description/GWRforSinglePredictor(GriddedModelOutput).txt
new file mode 100644
index 0000000..40351eb
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/GWRforSinglePredictor(GriddedModelOutput).txt
@@ -0,0 +1,27 @@
+GWR for Single Predictor (Gridded Model Output)
+statistics_regression
+ParameterVector|POINTS|Points|0|False
+ParameterTable|DEPENDENT|Dependent Variable|False
+ParameterTable|PREDICTOR|Predictor|False
+ParameterSelection|TARGET_DEFINITION|Target Grid System|[0] user defined;[1] grid or grid system| 0
+ParameterNumber|TARGET_USER_SIZE|Cellsize| 0.000000|None| 1.000000
+ParameterNumber|TARGET_USER_XMIN|Left|None|None| 0.000000
+ParameterNumber|TARGET_USER_XMAX|Right|None|None| 100.000000
+ParameterNumber|TARGET_USER_YMIN|Bottom|None|None| 0.000000
+ParameterNumber|TARGET_USER_YMAX|Top|None|None| 100.000000
+ParameterSelection|TARGET_USER_FITS|Fit|[0] nodes;[1] cells| 0
+ParameterRaster|TARGET_TEMPLATE|Target System|True
+OutputRaster|TARGET_OUT_GRID|Target Grid
+OutputRaster|INTERCEPT|Intercept
+OutputRaster|SLOPE|Slope
+OutputRaster|QUALITY|Quality
+ParameterSelection|DW_WEIGHTING|Weighting Function|[0] no distance weighting;[1] inverse distance to a power;[2] exponential;[3] gaussian weighting| 3
+ParameterNumber|DW_IDW_POWER|Inverse Distance Weighting Power| 0.000000|None| 1.000000
+ParameterBoolean|DW_IDW_OFFSET|Inverse Distance Offset|True
+ParameterNumber|DW_BANDWIDTH|Gaussian and Exponential Weighting Bandwidth| 0.000000|None| 1.000000
+ParameterSelection|SEARCH_RANGE|Search Range|[0] local;[1] global| 0
+ParameterNumber|SEARCH_RADIUS|Maximum Search Distance| 0.000000|None| 1000.000000
+ParameterSelection|SEARCH_POINTS_ALL|Number of Points|[0] maximum number of nearest points;[1] all points within search distance| 0
+ParameterNumber|SEARCH_POINTS_MIN|Minimum| 1|None| 16
+ParameterNumber|SEARCH_POINTS_MAX|Maximum| 1|None| 20
+ParameterSelection|SEARCH_DIRECTION|Direction|[0] all directions;[1] quadrants| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/GWRforSinglePredictorGrid.txt b/python/plugins/processing/algs/saga/description/GWRforSinglePredictorGrid.txt
new file mode 100644
index 0000000..0689e94
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/GWRforSinglePredictorGrid.txt
@@ -0,0 +1,20 @@
+GWR for Single Predictor Grid
+statistics_regression
+ParameterVector|POINTS|Points|0|False
+ParameterTable|DEPENDENT|Dependent Variable|False
+OutputVector|RESIDUALS|Residuals
+ParameterRaster|PREDICTOR|Predictor|False
+OutputRaster|REGRESSION|Regression
+OutputRaster|QUALITY|Coefficient of Determination
+OutputRaster|INTERCEPT|Intercept
+OutputRaster|SLOPE|Slope
+ParameterSelection|DW_WEIGHTING|Weighting Function|[0] no distance weighting;[1] inverse distance to a power;[2] exponential;[3] gaussian weighting| 3
+ParameterNumber|DW_IDW_POWER|Inverse Distance Weighting Power| 0.000000|None| 1.000000
+ParameterBoolean|DW_IDW_OFFSET|Inverse Distance Offset|True
+ParameterNumber|DW_BANDWIDTH|Gaussian and Exponential Weighting Bandwidth| 0.000000|None| 1.000000
+ParameterSelection|SEARCH_RANGE|Search Range|[0] local;[1] global| 0
+ParameterNumber|SEARCH_RADIUS|Maximum Search Distance| 0.000000|None| 1000.000000
+ParameterSelection|SEARCH_POINTS_ALL|Number of Points|[0] maximum number of nearest points;[1] all points within search distance| 0
+ParameterNumber|SEARCH_POINTS_MIN|Minimum| 1|None| 16
+ParameterNumber|SEARCH_POINTS_MAX|Maximum| 1|None| 20
+ParameterSelection|SEARCH_DIRECTION|Direction|[0] all directions;[1] quadrants| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/GenerateShapes.txt b/python/plugins/processing/algs/saga/description/GenerateShapes.txt
new file mode 100644
index 0000000..7ea1bf0
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/GenerateShapes.txt
@@ -0,0 +1,8 @@
+Generate Shapes
+shapes_tools
+ParameterTable|INPUT|Input|False
+ParameterTable|FIELD_ID|ID|False
+ParameterTable|FIELD_X|X|False
+ParameterTable|FIELD_Y|Y|False
+ParameterSelection|SHAPE_TYPE|Shape Type|[0] Point(s);[1] Line(s);[2] Polygon(s)| 0
+OutputVector|OUTPUT|Output
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/GeodesicMorphologicalReconstruction.txt b/python/plugins/processing/algs/saga/description/GeodesicMorphologicalReconstruction.txt
new file mode 100644
index 0000000..c59db3d
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/GeodesicMorphologicalReconstruction.txt
@@ -0,0 +1,9 @@
+Geodesic Morphological Reconstruction
+grid_filter
+ParameterRaster|INPUT_GRID|Input Grid|False
+OutputRaster|OBJECT_GRID|Object Grid
+OutputRaster|DIFFERENCE_GRID|Difference Input - Reconstruction
+ParameterNumber|SHIFT_VALUE|Shift value|None|None| 5.000000
+ParameterBoolean|BORDER_YES_NO|Preserve 1px border Yes/No|True
+ParameterBoolean|BIN_YES_NO|Create a binary mask Yes/No|True
+ParameterNumber|THRESHOLD|Threshold|None|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/GeographicCoordinateGrids.txt b/python/plugins/processing/algs/saga/description/GeographicCoordinateGrids.txt
new file mode 100644
index 0000000..1b56212
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/GeographicCoordinateGrids.txt
@@ -0,0 +1,5 @@
+Geographic Coordinate Grids
+pj_proj4
+ParameterRaster|GRID|Grid|False
+OutputRaster|LON|Longitude
+OutputRaster|LAT|Latitude
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/GridCombination.txt b/python/plugins/processing/algs/saga/description/GridCombination.txt
new file mode 100644
index 0000000..93c4bfe
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/GridCombination.txt
@@ -0,0 +1,12 @@
+GridCombination
+sim_rivflow
+ParameterRaster|INPUT|Gelaendemodell (DTM)|False
+ParameterFile|Folder1|Pfad WaterGap Raster|False|False
+ParameterNumber|sY|Start-Jahr| 1906| 2000| 1990
+ParameterNumber|eY|End-Jahr| 1906| 2000| 1990
+ParameterBoolean|DomW|Domestic Water|True
+ParameterBoolean|ElecW|Electricity Water|True
+ParameterBoolean|LiveW|Livestock Water|True
+ParameterBoolean|ManW|Manufacturing Water|True
+ParameterBoolean|IrrW|Irrigation Water|True
+ParameterSelection|FvA|Flaechenverbrauch-Auswahl (FvA)|[0] Resultierendes Raster ueber WasserENTNAHME erstellen;[1] Resultierendes Raster ueber WasserNUTZUNG erstellen| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/GridStatisticsforPoints.txt b/python/plugins/processing/algs/saga/description/GridStatisticsforPoints.txt
new file mode 100644
index 0000000..f0355fe
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/GridStatisticsforPoints.txt
@@ -0,0 +1,17 @@
+Grid Statistics for Points
+shapes_grid
+ParameterMultipleInput|GRIDS|Grids|3|False
+ParameterVector|POINTS|Points|0|False
+ParameterSelection|KERNEL_TYPE|Kernel Type|[0] square;[1] circle| 0
+ParameterNumber|KERNEL_SIZE|Kernel Size| 1|None| 1
+ParameterSelection|NAMING|Field Naming|[0] grid number;[1] grid name| 1
+OutputVector|RESULT|Statistics
+ParameterBoolean|COUNT|Number of Cells|True
+ParameterBoolean|MIN|Minimum|True
+ParameterBoolean|MAX|Maximum|True
+ParameterBoolean|RANGE|Range|True
+ParameterBoolean|SUM|Sum|True
+ParameterBoolean|MEAN|Mean|True
+ParameterBoolean|VAR|Variance|True
+ParameterBoolean|STDDEV|Standard Deviation|True
+ParameterNumber|QUANTILE|Quantile| 0| 50| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/IMCORR-FeatureTracking.txt b/python/plugins/processing/algs/saga/description/IMCORR-FeatureTracking.txt
new file mode 100644
index 0000000..a00cb8f
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/IMCORR-FeatureTracking.txt
@@ -0,0 +1,11 @@
+IMCORR - Feature Tracking
+grid_analysis
+ParameterRaster|GRID_1|Grid 1|False
+ParameterRaster|GRID_2|Grid 2|False
+ParameterRaster|DTM_1|DTM 1|True
+ParameterRaster|DTM_2|DTM 2|True
+OutputVector|CORRPOINTS|Correlated Points
+OutputVector|CORRLINES|Displacement Vector
+ParameterSelection|SEARCH_CHIPSIZE|Search Chip Size (Cells)|[0] 16x16;[1] 32x32;[2] 64x64;[3] 128x128;[4] 256x256| 2
+ParameterSelection|REF_CHIPSIZE|Reference Chip Size (Cells)|[0] 16x16;[1] 32x32;[2] 64x64;[3] 128x128| 1
+ParameterNumber|GRID_SPACING|Grid Spacing (Map Units)| 0.100000| 256.000000| 10.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ISODATAClusteringforGrids.txt b/python/plugins/processing/algs/saga/description/ISODATAClusteringforGrids.txt
new file mode 100644
index 0000000..190539d
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ISODATAClusteringforGrids.txt
@@ -0,0 +1,10 @@
+ISODATA Clustering for Grids
+imagery_classification
+ParameterMultipleInput|FEATURES|Features|3|False
+OutputRaster|CLUSTER|Clusters
+ParameterTable|STATISTICS|Statistics|False
+ParameterBoolean|NORMALIZE|Normalize|False
+ParameterNumber|ITERATIONS|Maximum Number of Iterations| 3|None| 20
+ParameterNumber|CLUSTER_INI|Initial Number of Clusters| 0|None| 5
+ParameterNumber|CLUSTER_MAX|Maximum Number of Clusters| 3|None| 16
+ParameterNumber|SAMPLES_MIN|Minimum Number of Samples in a Cluster| 2|None| 5
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Identity.txt b/python/plugins/processing/algs/saga/description/Identity.txt
new file mode 100644
index 0000000..a9f37b4
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Identity.txt
@@ -0,0 +1,6 @@
+Identity
+shapes_polygons
+ParameterVector|A|Layer A|-1|False
+ParameterVector|B|Layer B|-1|False
+OutputVector|RESULT|Identity
+ParameterBoolean|SPLIT|Split Parts|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Intersect.txt b/python/plugins/processing/algs/saga/description/Intersect.txt
new file mode 100644
index 0000000..44cbf41
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Intersect.txt
@@ -0,0 +1,6 @@
+Intersect
+shapes_polygons
+ParameterVector|A|Layer A|-1|False
+ParameterVector|B|Layer B|-1|False
+OutputVector|RESULT|Intersect
+ParameterBoolean|SPLIT|Split Parts|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/InvertGrid.txt b/python/plugins/processing/algs/saga/description/InvertGrid.txt
new file mode 100644
index 0000000..8132386
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/InvertGrid.txt
@@ -0,0 +1,4 @@
+Invert Grid
+grid_tools
+ParameterRaster|GRID|Grid|False
+OutputRaster|INVERSE|Inverse Grid
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/K-MeansClusteringforGrids.txt b/python/plugins/processing/algs/saga/description/K-MeansClusteringforGrids.txt
new file mode 100644
index 0000000..b1bee55
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/K-MeansClusteringforGrids.txt
@@ -0,0 +1,11 @@
+K-Means Clustering for Grids
+imagery_classification
+ParameterMultipleInput|GRIDS|Grids|3|False
+OutputRaster|CLUSTER|Clusters
+ParameterTable|STATISTICS|Statistics|False
+ParameterSelection|METHOD|Method|[0] Iterative Minimum Distance (Forgy 1965);[1] Hill-Climbing (Rubin 1967);[2] Combined Minimum Distance / Hillclimbing| 1
+ParameterNumber|NCLUSTER|Clusters| 2|None| 10
+ParameterNumber|MAXITER|Maximum Iterations| 0|None| 0
+ParameterBoolean|NORMALISE|Normalise|False
+ParameterBoolean|OLDVERSION|Old Version|False
+ParameterBoolean|UPDATEVIEW|Update View|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/K-NearestNeighboursClassification(OpenCV).txt b/python/plugins/processing/algs/saga/description/K-NearestNeighboursClassification(OpenCV).txt
new file mode 100644
index 0000000..ef2f972
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/K-NearestNeighboursClassification(OpenCV).txt
@@ -0,0 +1,11 @@
+K-Nearest Neighbours Classification (OpenCV)
+imagery_opencv
+ParameterMultipleInput|FEATURES|Features|3|False
+ParameterBoolean|NORMALIZE|Normalize|False
+ParameterVector|TRAIN_AREAS|Training Areas|-1|False
+ParameterTable|TRAIN_CLASS|Class Identifier|False
+OutputRaster|CLASSES|Classification
+ParameterNumber|NEIGHBOURS|Default Number of Neighbours| 1|None| 3
+ParameterSelection|TRAINING|Training Method|[0] classification;[1] regression model| 0
+ParameterSelection|ALGORITHM|Algorithm Type|[0] brute force;[1] KD Tree| 0
+ParameterNumber|EMAX|Parameter for KD Tree implementation| 1|None| 1000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/LS-FactorFieldBased.txt b/python/plugins/processing/algs/saga/description/LS-FactorFieldBased.txt
new file mode 100644
index 0000000..9c59a43
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/LS-FactorFieldBased.txt
@@ -0,0 +1,16 @@
+LS-Factor, Field Based
+ta_hydrology
+ParameterRaster|DEM|Elevation|False
+ParameterVector|FIELDS|Fields|-1|True
+OutputVector|STATISTICS|Field Statistics
+OutputRaster|UPSLOPE_AREA|Upslope Length Factor
+OutputRaster|UPSLOPE_LENGTH|Effective Flow Length
+OutputRaster|UPSLOPE_SLOPE|Upslope Slope
+OutputRaster|LS_FACTOR|LS Factor
+OutputRaster|BALANCE|Sediment Balance
+ParameterSelection|METHOD|LS Calculation|[0] Moore & Nieber 1989;[1] Desmet & Govers 1996;[2] Wischmeier & Smith 1978| 0
+ParameterSelection|METHOD_SLOPE|Type of Slope|[0] local slope;[1] distance weighted average catchment slope| 0
+ParameterSelection|METHOD_AREA|Specific Catchment Area|[0] specific catchment area (contour length simply as cell size);[1] specific catchment area (contour length dependent on aspect);[2] catchment length (square root of catchment area);[3] effective flow length| 1
+ParameterBoolean|STOP_AT_EDGE|Stop at Edge|True
+ParameterNumber|EROSIVITY|Rill/Interrill Erosivity| 0.000000|None| 1.000000
+ParameterSelection|STABILITY|Stability|[0] stable;[1] instable (thawing)| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/LandUseScenarioGenerator.txt b/python/plugins/processing/algs/saga/description/LandUseScenarioGenerator.txt
new file mode 100644
index 0000000..fb8042e
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/LandUseScenarioGenerator.txt
@@ -0,0 +1,8 @@
+Land Use Scenario Generator
+shapes_tools
+ParameterVector|FIELDS|Fields|-1|False
+ParameterTable|FIELD_ID|Field Identifier|False
+OutputVector|SCENARIO|Land Use Scenario
+ParameterSelection|OUTPUT|Output of...|[0] Identifier;[1] Name| 0
+ParameterTable|STATISTICS|Crop Statistics|False
+ParameterTable|KNOWN_CROPS|Known Crops|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/LineSmoothing.txt b/python/plugins/processing/algs/saga/description/LineSmoothing.txt
new file mode 100644
index 0000000..3fd1e79
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/LineSmoothing.txt
@@ -0,0 +1,9 @@
+Line Smoothing
+shapes_lines
+ParameterVector|LINES_IN|Lines|1|False
+OutputVector|LINES_OUT|Smoothed Lines
+ParameterSelection|METHOD|Method|[0] basic SIA model;[1] improved SIA model;[2] Gaussian Filtering| 2
+ParameterNumber|SENSITIVITY|Sensitivity| 1|None| 3
+ParameterNumber|ITERATIONS|Iterations| 1|None| 10
+ParameterNumber|PRESERVATION|Preservation| 1.000000|None| 10.000000
+ParameterNumber|SIGMA|Sigma| 0.500000|None| 2.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MaximumEntropyPresencePrediction.txt b/python/plugins/processing/algs/saga/description/MaximumEntropyPresencePrediction.txt
new file mode 100644
index 0000000..44eac6e
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MaximumEntropyPresencePrediction.txt
@@ -0,0 +1,18 @@
+Maximum Entropy Presence Prediction
+imagery_maxent
+ParameterVector|PRESENCE|Presence Data|-1|False
+ParameterMultipleInput|FEATURES_NUM|Numerical Features|3|True
+ParameterMultipleInput|FEATURES_CAT|Categorical Features|3|True
+OutputRaster|PREDICTION|Presence Prediction
+OutputRaster|PROBABILITY|Presence Probability
+ParameterNumber|BACKGROUND|Background Sample Density [Percent]| 0.000000| 100.000000| 1.000000
+ParameterSelection|METHOD|Method|[0] Yoshimasa Tsuruoka;[1] Dekang Lin| 0
+ParameterFile|YT_FILE_LOAD|Load from File...|False|False
+ParameterFile|YT_FILE_SAVE|Save to File...|False|False
+ParameterSelection|YT_REGUL|Regularization|[0] none;[1] L1;[2] L2| 1
+ParameterNumber|YT_REGUL_VAL|Regularization Factor| 0.000000|None| 1.000000
+ParameterBoolean|YT_NUMASREAL|Real-valued Numerical Features|True
+ParameterNumber|DL_ALPHA|Alpha|None|None| 0.100000
+ParameterNumber|DL_THRESHOLD|Threshold| 0.000000|None| 0.000000
+ParameterNumber|DL_ITERATIONS|Maximum Iterations| 1|None| 100
+ParameterNumber|NUM_CLASSES|Number of Numeric Value Classes| 1|None| 32
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MaximumFlowPathLength.txt b/python/plugins/processing/algs/saga/description/MaximumFlowPathLength.txt
new file mode 100644
index 0000000..d515f14
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MaximumFlowPathLength.txt
@@ -0,0 +1,6 @@
+Maximum Flow Path Length
+ta_hydrology
+ParameterRaster|ELEVATION|Elevation|False
+ParameterRaster|WEIGHTS|Weights|True
+OutputRaster|DISTANCE|Flow Path Length
+ParameterSelection|DIRECTION|Direction of Measurement|[0] downstream;[1] upstream| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MeltonRuggednessNumber.txt b/python/plugins/processing/algs/saga/description/MeltonRuggednessNumber.txt
new file mode 100644
index 0000000..397662a
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MeltonRuggednessNumber.txt
@@ -0,0 +1,6 @@
+Melton Ruggedness Number
+ta_hydrology
+ParameterRaster|DEM|Elevation|False
+OutputRaster|AREA|Catchment Area
+OutputRaster|ZMAX|Maximum Height
+OutputRaster|MRN|Melton Ruggedness Number
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MeshDenoise.txt b/python/plugins/processing/algs/saga/description/MeshDenoise.txt
new file mode 100644
index 0000000..7a2e014
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MeshDenoise.txt
@@ -0,0 +1,9 @@
+Mesh Denoise
+grid_filter
+ParameterRaster|INPUT|Grid|False
+OutputRaster|OUTPUT|Denoised Grid
+ParameterNumber|SIGMA|Threshold| 0.000000| 1.000000| 0.900000
+ParameterNumber|ITER|Number of Iterations for Normal Updating| 1|None| 5
+ParameterNumber|VITER|Number of Iterations for Vertex Updating| 1|None| 50
+ParameterSelection|NB_CV|Common Edge Type of Face Neighbourhood|[0] Common Vertex;[1] Common Edge| 0
+ParameterBoolean|ZONLY|Only Z-Direction Position is Updated|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MirrorGrid.txt b/python/plugins/processing/algs/saga/description/MirrorGrid.txt
new file mode 100644
index 0000000..7a284fb
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MirrorGrid.txt
@@ -0,0 +1,5 @@
+Mirror Grid
+grid_tools
+ParameterRaster|GRID|Grid|False
+OutputRaster|MIRROR|Mirror Grid
+ParameterSelection|METHOD|Method|[0] horizontally;[1] vertically;[2] both| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ModifedQuadraticShepard.txt b/python/plugins/processing/algs/saga/description/ModifedQuadraticShepard.txt
new file mode 100644
index 0000000..f61ade9
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ModifedQuadraticShepard.txt
@@ -0,0 +1,12 @@
+Modifed Quadratic Shepard
+grid_gridding
+ParameterVector|SHAPES|Points|-1|False
+ParameterTable|FIELD|Attribute|False
+Hardcoded|-TARGET_DEFINITION 0
+Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
+ParameterNumber|TARGET_USER_SIZE|Cellsize|0.000000|None|1.000000
+ParameterSelection|TARGET_USER_FITS|Fit|[0] nodes;[1] cells| 0
+ParameterRaster|TARGET_TEMPLATE|Target System|True
+OutputRaster|TARGET_OUT_GRID|Target Grid
+ParameterNumber|QUADRATIC_NEIGHBORS|Quadratic Neighbors| 5|None| 13
+ParameterNumber|WEIGHTING_NEIGHBORS|Weighting Neighbors| 3|None| 19
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MonthlyGlobalbyLatitude.txt b/python/plugins/processing/algs/saga/description/MonthlyGlobalbyLatitude.txt
new file mode 100644
index 0000000..f93cdbb
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MonthlyGlobalbyLatitude.txt
@@ -0,0 +1,7 @@
+Monthly Global by Latitude
+climate_tools
+ParameterTable|SOLARRAD|Solar Radiation|False
+ParameterTable|ALBEDO|Albedo|True
+ParameterTable|FIELD|Field|False
+ParameterNumber|YEAR|Year [ka]|None|None| 2.000000
+ParameterNumber|DLAT|Latitude Increment [Degree]| 1| 90| 5
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MorphologicalFilter(OpenCV).txt b/python/plugins/processing/algs/saga/description/MorphologicalFilter(OpenCV).txt
new file mode 100644
index 0000000..aae6573
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MorphologicalFilter(OpenCV).txt
@@ -0,0 +1,8 @@
+Morphological Filter (OpenCV)
+imagery_opencv
+ParameterRaster|INPUT|Input|False
+OutputRaster|OUTPUT|Output
+ParameterSelection|TYPE|Operation|[0] dilation;[1] erosion;[2] opening;[3] closing;[4] morpological gradient;[5] top hat;[6] black hat| 0
+ParameterSelection|SHAPE|Element Shape|[0] ellipse;[1] rectangle;[2] cross| 0
+ParameterNumber|RADIUS|Radius (cells)| 0|None| 1
+ParameterNumber|ITERATIONS|Iterations| 1|None| 1
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MorphologicalFilter(ViGrA).txt b/python/plugins/processing/algs/saga/description/MorphologicalFilter(ViGrA).txt
new file mode 100644
index 0000000..a0bb3b0
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MorphologicalFilter(ViGrA).txt
@@ -0,0 +1,8 @@
+Morphological Filter (ViGrA)
+imagery_vigra
+ParameterRaster|INPUT|Input|False
+OutputRaster|OUTPUT|Output
+ParameterSelection|TYPE|Operation|[0] Dilation;[1] Erosion;[2] Median;[3] User defined rank| 0
+ParameterNumber|RADIUS|Radius (cells)| 0|None| 1
+ParameterNumber|RANK|User defined rank| 0.000000| 1.000000| 0.500000
+ParameterBoolean|RESCALE|Rescale Values (0-255)|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MorphometricFeatures.txt b/python/plugins/processing/algs/saga/description/MorphometricFeatures.txt
new file mode 100644
index 0000000..54fe3c1
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MorphometricFeatures.txt
@@ -0,0 +1,19 @@
+Morphometric Features
+ta_morphometry
+ParameterRaster|DEM|Elevation|False
+OutputRaster|FEATURES|Morphometric Features
+OutputRaster|ELEVATION|Generalized Surface
+OutputRaster|SLOPE|Slope
+OutputRaster|ASPECT|Aspect
+OutputRaster|PROFC|Profile Curvature
+OutputRaster|PLANC|Plan Curvature
+OutputRaster|LONGC|Longitudinal Curvature
+OutputRaster|CROSC|Cross-Sectional Curvature
+OutputRaster|MAXIC|Maximum Curvature
+OutputRaster|MINIC|Minimum Curvature
+ParameterNumber|SIZE|Scale Radius (Cells)| 1|None| 5
+ParameterNumber|TOL_SLOPE|Slope Tolerance|None|None| 1.000000
+ParameterNumber|TOL_CURVE|Curvature Tolerance|None|None| 0.000100
+ParameterNumber|EXPONENT|Distance Weighting Exponent| 0.000000| 4.000000| 0.000000
+ParameterNumber|ZSCALE|Vertical Scaling|None|None| 1.000000
+ParameterBoolean|CONSTRAIN|Constrain|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Mosaicking.txt b/python/plugins/processing/algs/saga/description/Mosaicking.txt
index 16f0439..b956b82 100644
--- a/python/plugins/processing/algs/saga/description/Mosaicking.txt
+++ b/python/plugins/processing/algs/saga/description/Mosaicking.txt
@@ -4,7 +4,7 @@ AllowUnmatching
 ParameterMultipleInput|GRIDS|Input Grids|3|False
 ParameterString|NAME|Name|Mosaic
 ParameterSelection|TYPE|Preferred data storage type|[0] 1 bit;[1] 1 byte unsigned integer;[2] 1 byte signed integer;[3] 2 byte unsigned integer;[4] 2 byte signed integer;[5] 4 byte unsigned integer;[6] 4 byte signed integer;[7] 4 byte floating point;[8] 8 byte floating point|7
-ParameterSelection|INTERPOL|Interpolation|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation|0
+ParameterSelection|RESAMPLING|Interpolation|[0] Nearest Neighbor;[1] Bilinear Interpolation;[2] Inverse Distance Interpolation;[3] Bicubic Spline Interpolation;[4] B-Spline Interpolation|0
 ParameterSelection|OVERLAP|Overlapping Areas|[0] first;[1] last;[2] minimum;[3] maximum;[4] mean;[5] blend boundary;[6] feathering|1
 ParameterNumber|BLEND_DIST|Blending Distance|0.0|None|10.0
 ParameterSelection|MATCH|Match|[0] none;[1] regression|0
diff --git a/python/plugins/processing/algs/saga/description/MultipleLinearRegressionAnalysis(Shapes).txt b/python/plugins/processing/algs/saga/description/MultipleLinearRegressionAnalysis(Shapes).txt
new file mode 100644
index 0000000..69ff500
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MultipleLinearRegressionAnalysis(Shapes).txt
@@ -0,0 +1,12 @@
+Multiple Linear Regression Analysis (Shapes)
+statistics_regression
+ParameterVector|TABLE|Shapes|-1|False
+OutputVector|RESULTS|Results
+ParameterTable|DEPENDENT|Dependent Variable|False
+ParameterTable|INFO_COEFF|Details: Coefficients|True
+ParameterTable|INFO_MODEL|Details: Model|True
+ParameterTable|INFO_STEPS|Details: Steps|True
+ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise| 3
+ParameterNumber|P_VALUE|Significance Level| 0.000000| 100.000000| 5.000000
+ParameterSelection|CROSSVAL|Cross Validation|[0] none;[1] leave one out;[2] 2-fold;[3] k-fold| 0
+ParameterNumber|CROSSVAL_K|Cross Validation Subsamples| 2|None| 10
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MultipleLinearRegressionAnalysis.txt b/python/plugins/processing/algs/saga/description/MultipleLinearRegressionAnalysis.txt
new file mode 100644
index 0000000..157ec8f
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MultipleLinearRegressionAnalysis.txt
@@ -0,0 +1,12 @@
+Multiple Linear Regression Analysis
+statistics_regression
+ParameterTable|TABLE|Table|False
+ParameterTable|RESULTS|Results|True
+ParameterTable|DEPENDENT|Dependent Variable|False
+ParameterTable|INFO_COEFF|Details: Coefficients|True
+ParameterTable|INFO_MODEL|Details: Model|True
+ParameterTable|INFO_STEPS|Details: Steps|True
+ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise| 3
+ParameterNumber|P_VALUE|Significance Level| 0.000000| 100.000000| 5.000000
+ParameterSelection|CROSSVAL|Cross Validation|[0] none;[1] leave one out;[2] 2-fold;[3] k-fold| 0
+ParameterNumber|CROSSVAL_K|Cross Validation Subsamples| 2|None| 10
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(GridandPredictorGrids).txt b/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(GridandPredictorGrids).txt
new file mode 100644
index 0000000..f837ab9
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(GridandPredictorGrids).txt
@@ -0,0 +1,16 @@
+Multiple Regression Analysis (Grid and Predictor Grids)
+statistics_regression
+ParameterRaster|DEPENDENT|Dependent Variable|False
+ParameterMultipleInput|PREDICTORS|Predictors|3|False
+OutputRaster|REGRESSION|Regression
+OutputRaster|RESIDUALS|Residuals
+ParameterTable|INFO_COEFF|Details: Coefficients|True
+ParameterTable|INFO_MODEL|Details: Model|True
+ParameterTable|INFO_STEPS|Details: Steps|True
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbour;[1] Bilinear Interpolation;[2] Bicubic Spline Interpolation;[3] B-Spline Interpolation| 3
+ParameterBoolean|COORD_X|Include X Coordinate|False
+ParameterBoolean|COORD_Y|Include Y Coordinate|False
+ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise| 3
+ParameterNumber|P_VALUE|Significance Level| 0.000000| 100.000000| 5.000000
+ParameterSelection|CROSSVAL|Cross Validation|[0] none;[1] leave one out;[2] 2-fold;[3] k-fold| 0
+ParameterNumber|CROSSVAL_K|Cross Validation Subsamples| 2|None| 10
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(PointsandPredictorGrids).txt b/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(PointsandPredictorGrids).txt
new file mode 100644
index 0000000..8dd6acb
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/MultipleRegressionAnalysis(PointsandPredictorGrids).txt
@@ -0,0 +1,20 @@
+Multiple Regression Analysis (Points and Predictor Grids)
+statistics_regression
+ParameterMultipleInput|PREDICTORS|Predictors|3|False
+ParameterVector|POINTS|Points|-1|False
+ParameterTable|ATTRIBUTE|Dependent Variable|False
+ParameterTable|INFO_COEFF|Details: Coefficients|True
+ParameterTable|INFO_MODEL|Details: Model|True
+ParameterTable|INFO_STEPS|Details: Steps|True
+OutputVector|RESIDUALS|Residuals
+OutputRaster|REGRESSION|Regression
+OutputRaster|REGRESCORR|Regression with Residual Correction
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbour;[1] Bilinear Interpolation;[2] Bicubic Spline Interpolation;[3] B-Spline Interpolation| 3
+ParameterBoolean|COORD_X|Include X Coordinate|False
+ParameterBoolean|COORD_Y|Include Y Coordinate|False
+ParameterBoolean|INTERCEPT|Intercept|True
+ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise| 3
+ParameterNumber|P_VALUE|Significance Level| 0.000000| 100.000000| 5.000000
+ParameterSelection|CROSSVAL|Cross Validation|[0] none;[1] leave one out;[2] 2-fold;[3] k-fold| 0
+ParameterNumber|CROSSVAL_K|Cross Validation Subsamples| 2|None| 10
+ParameterSelection|RESIDUAL_COR|Residual Interpolation|[0] Multleve B-Spline Interpolation;[1] Inverse Distance Weighted| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/NormalBayesClassification(OpenCV).txt b/python/plugins/processing/algs/saga/description/NormalBayesClassification(OpenCV).txt
new file mode 100644
index 0000000..4541874
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/NormalBayesClassification(OpenCV).txt
@@ -0,0 +1,8 @@
+Normal Bayes Classification (OpenCV)
+imagery_opencv
+ParameterMultipleInput|FEATURES|Features|3|False
+ParameterBoolean|NORMALIZE|Normalize|False
+OutputRaster|PROBABILITY|Probability
+ParameterVector|TRAIN_AREAS|Training Areas|-1|False
+ParameterTable|TRAIN_CLASS|Class Identifier|False
+OutputRaster|CLASSES|Classification
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/PET(afterHargreavesGrid).txt b/python/plugins/processing/algs/saga/description/PET(afterHargreavesGrid).txt
new file mode 100644
index 0000000..26427f0
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/PET(afterHargreavesGrid).txt
@@ -0,0 +1,10 @@
+PET (after Hargreaves, Grid)
+climate_tools
+ParameterRaster|T|Mean Temperature|False
+ParameterRaster|T_MIN|Minimum Temperature|False
+ParameterRaster|T_MAX|Maximum Temperature|False
+OutputRaster|PET|Potential Evapotranspiration
+ParameterNumber|LAT|Latitude [Degree]| -90.000000| 90.000000| 53.000000
+ParameterSelection|TIME|Time|[0] day;[1] month| 0
+ParameterSelection|MONTH|Month|[0] January;[1] February;[2] March;[3] April;[4] May;[5] June;[6] July;[7] August;[8] September;[9] October;[10] November;[11] December| 5
+ParameterNumber|DAY|Day of Month| 1| 31| 30
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/PET(afterHargreavesTable).txt b/python/plugins/processing/algs/saga/description/PET(afterHargreavesTable).txt
new file mode 100644
index 0000000..5ec8e76
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/PET(afterHargreavesTable).txt
@@ -0,0 +1,8 @@
+PET (after Hargreaves, Table)
+climate_tools
+ParameterTable|TABLE|Data|False
+ParameterTable|JD|Julian Day|False
+ParameterTable|T|Mean Temperature|False
+ParameterTable|T_MIN|Minimum Temperature|False
+ParameterTable|T_MAX|Maximum Temperature|False
+ParameterNumber|LAT|Latitude| -90.000000| 90.000000| 53.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/PointDistances.txt b/python/plugins/processing/algs/saga/description/PointDistances.txt
new file mode 100644
index 0000000..ed9c071
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/PointDistances.txt
@@ -0,0 +1,9 @@
+Point Distances
+shapes_points
+ParameterVector|POINTS|Points|0|False
+ParameterTable|ID_POINTS|Identifier|False
+ParameterVector|NEAR|Near Points|-1|True
+ParameterTable|ID_NEAR|Identifier|False
+ParameterTable|DISTANCES|Distances|False
+ParameterSelection|FORMAT|Output Format|[0] complete input times near points matrix;[1] each pair with a single record| 1
+ParameterNumber|MAX_DIST|Maximum Distance| 0.000000|None| 0.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/PolygonSelf-Intersection.txt b/python/plugins/processing/algs/saga/description/PolygonSelf-Intersection.txt
new file mode 100644
index 0000000..4ed096c
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/PolygonSelf-Intersection.txt
@@ -0,0 +1,5 @@
+Polygon Self-Intersection
+shapes_polygons
+ParameterVector|POLYGONS|Polygons|-1|False
+ParameterTable|ID|Identifier|False
+OutputVector|INTERSECT|Intersection
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/RandomForestClassification(OpenCV).txt b/python/plugins/processing/algs/saga/description/RandomForestClassification(OpenCV).txt
new file mode 100644
index 0000000..5a0c1a0
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/RandomForestClassification(OpenCV).txt
@@ -0,0 +1,14 @@
+Random Forest Classification (OpenCV)
+imagery_opencv
+ParameterMultipleInput|FEATURES|Features|3|False
+ParameterBoolean|NORMALIZE|Normalize|False
+ParameterVector|TRAIN_AREAS|Training Areas|-1|False
+ParameterTable|TRAIN_CLASS|Class Identifier|False
+OutputRaster|CLASSES|Classification
+ParameterNumber|MAX_DEPTH|Maximum Tree Depth| 1|None| 10
+ParameterNumber|MIN_SAMPLES|Minimum Sample Count| 2|None| 2
+ParameterNumber|MAX_CATEGRS|Maximum Categories| 1|None| 10
+ParameterBoolean|1SE_RULE|Use 1SE Rule|True
+ParameterBoolean|TRUNC_PRUNED|Truncate Pruned Trees|True
+ParameterNumber|REG_ACCURACY|Regression Accuracy| 0.000000|None| 0.010000
+ParameterNumber|ACTIVE_VARS|Active Variable Count| 0|None| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/RandomForestPresencePrediction(ViGrA).txt b/python/plugins/processing/algs/saga/description/RandomForestPresencePrediction(ViGrA).txt
new file mode 100644
index 0000000..ec6bf74
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/RandomForestPresencePrediction(ViGrA).txt
@@ -0,0 +1,20 @@
+Random Forest Presence Prediction (ViGrA)
+imagery_vigra
+ParameterMultipleInput|FEATURES|Features|3|False
+OutputRaster|PREDICTION|Presence Prediction
+OutputRaster|PROBABILITY|Presence Probability
+ParameterVector|PRESENCE|Presence Data|-1|False
+ParameterNumber|BACKGROUND|Background Sample Density [Percent]| 0.000000| 100.000000| 1.000000
+ParameterBoolean|DO_MRMR|Minimum Redundancy Feature Selection|False
+ParameterNumber|mRMR_NFEATURES|Number of Features| 1|None| 50
+ParameterBoolean|mRMR_DISCRETIZE|Discretization|True
+ParameterNumber|mRMR_THRESHOLD|Discretization Threshold| 0.000000|None| 1.000000
+ParameterSelection|mRMR_METHOD|Selection Method|[0] Mutual Information Difference (MID);[1] Mutual Information Quotient (MIQ)| 0
+ParameterFile|RF_IMPORT|Import from File|False|False
+ParameterFile|RF_EXPORT|Export to File|False|False
+ParameterNumber|RF_TREE_COUNT|Tree Count| 1|None| 32
+ParameterNumber|RF_TREE_SAMPLES|Samples per Tree| 0.000000| 1.000000| 1.000000
+ParameterBoolean|RF_REPLACE|Sample with Replacement|True
+ParameterNumber|RF_SPLIT_MIN_SIZE|Minimum Node Split Size| 1|None| 1
+ParameterSelection|RF_NODE_FEATURES|Features per Node|[0] logarithmic;[1] square root;[2] all| 1
+ParameterSelection|RF_STRATIFICATION|Stratification|[0] none;[1] equal;[2] proportional| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/RegressionAnalysis(PointsandPredictorGrid).txt b/python/plugins/processing/algs/saga/description/RegressionAnalysis(PointsandPredictorGrid).txt
new file mode 100644
index 0000000..6bca4a1
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/RegressionAnalysis(PointsandPredictorGrid).txt
@@ -0,0 +1,9 @@
+Regression Analysis (Points and Predictor Grid)
+statistics_regression
+ParameterRaster|PREDICTOR|Predictor|False
+ParameterVector|POINTS|Points|-1|False
+ParameterTable|ATTRIBUTE|Dependent Variable|False
+OutputRaster|REGRESSION|Regression
+OutputVector|RESIDUAL|Residuals
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbour;[1] Bilinear Interpolation;[2] Bicubic Spline Interpolation;[3] B-Spline Interpolation| 3
+ParameterSelection|METHOD|Regression Function|[0] Y = a + b * X (linear);[1] Y = a + b / X;[2] Y = a / (b - X);[3] Y = a * X^b (power);[4] Y = a e^(b * X) (exponential);[5] Y = a + b * ln(X) (logarithmic)| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/RegressionKriging.txt b/python/plugins/processing/algs/saga/description/RegressionKriging.txt
new file mode 100644
index 0000000..23551ee
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/RegressionKriging.txt
@@ -0,0 +1,32 @@
+Regression Kriging
+statistics_kriging
+ParameterVector|POINTS|Points|-1|False
+ParameterTable|FIELD|Attribute|False
+ParameterMultipleInput|PREDICTORS|Predictors|3|False
+OutputRaster|REGRESSION|Regression
+OutputRaster|PREDICTION|Prediction
+OutputRaster|RESIDUALS|Residuals
+OutputRaster|VARIANCE|Quality Measure
+ParameterSelection|TQUALITY|Type of Quality Measure|[0] standard deviation;[1] variance| 0
+ParameterBoolean|LOG|Logarithmic Transformation|False
+ParameterBoolean|BLOCK|Block Kriging|False
+ParameterNumber|DBLOCK|Block Size| 0.000000|None| 100.000000
+ParameterNumber|VAR_MAXDIST|Maximum Distance|None|None| -1.000000
+ParameterNumber|VAR_NCLASSES|Lag Distance Classes| 1|None| 100
+ParameterNumber|VAR_NSKIP|Skip| 1|None| 1
+ParameterString|VAR_MODEL|Variogram Model
+ParameterTable|INFO_COEFF|Regression: Coefficients|True
+ParameterTable|INFO_MODEL|Regression: Model|True
+ParameterTable|INFO_STEPS|Regression: Steps|True
+ParameterBoolean|COORD_X|Include X Coordinate|False
+ParameterBoolean|COORD_Y|Include Y Coordinate|False
+ParameterBoolean|INTERCEPT|Intercept|True
+ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise| 3
+ParameterNumber|P_VALUE|Significance Level| 0.000000| 100.000000| 5.000000
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbour;[1] Bilinear Interpolation;[2] Bicubic Spline Interpolation;[3] B-Spline Interpolation| 3
+ParameterSelection|SEARCH_RANGE|Search Range|[0] local;[1] global| 0
+ParameterNumber|SEARCH_RADIUS|Maximum Search Distance| 0.000000|None| 1000.000000
+ParameterSelection|SEARCH_POINTS_ALL|Number of Points|[0] maximum number of nearest points;[1] all points within search distance| 0
+ParameterNumber|SEARCH_POINTS_MIN|Minimum| 1|None| 16
+ParameterNumber|SEARCH_POINTS_MAX|Maximum| 1|None| 20
+ParameterSelection|SEARCH_DIRECTION|Direction|[0] all directions;[1] quadrants| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ResamplingFilter.txt b/python/plugins/processing/algs/saga/description/ResamplingFilter.txt
new file mode 100644
index 0000000..9c5b1b9
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ResamplingFilter.txt
@@ -0,0 +1,6 @@
+Resampling Filter
+grid_filter
+ParameterRaster|GRID|Grid|False
+OutputRaster|LOPASS|Low Pass Filter
+OutputRaster|HIPASS|High Pass Filter
+ParameterNumber|SCALE|Scale Factor| 1.000000|None| 10.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/RiverBasin.txt b/python/plugins/processing/algs/saga/description/RiverBasin.txt
new file mode 100644
index 0000000..93992cc
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/RiverBasin.txt
@@ -0,0 +1,19 @@
+RiverBasin
+sim_rivflow
+ParameterRaster|INPUT|DTM|False
+ParameterRaster|INPUT2|HGGrid|False
+ParameterRaster|INPUT3|statisches Entnahmeraster|True
+ParameterBoolean|WCons|Anteilige Flaechenwasserentnahme|False
+ParameterSelection|WCons2|Dynamische Flaechenwassernutzung...|[0] ...anteilig aus den Flussrasterzellen;[1] ...anteilig aus Rasterzellen der Teileinzugegebiete| 0
+OutputRaster|OUTPUT2|Grad
+OutputRaster|OUTPUT3|Direc
+OutputRaster|OUTPUT4|HGGrad
+OutputRaster|OUTPUT5|RivSpeed
+OutputRaster|OUTPUT6|Coordinates
+OutputRaster|OUTPUT7|BasinShare
+OutputRaster|OUTPUT8|statWUse
+OutputRaster|OUTPUT9|NumInFlowCells
+ParameterNumber|pCr|Hauptgerinne-Parameter pHG| 0.000000|None| 0.003500
+ParameterNumber|nCr|Hauptgerinne-Speicherkaskade nHG| 1|None| 1
+ParameterBoolean|EnfVmax|Maximal Geschwindigkeit des Hauptgerinnes beruecksichtigen|True
+ParameterNumber|VTresh|Maximalgeschwindigkeit im Hauptgerinne in km/h| 0.000000| 10.000000| 4.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/RiverGridGeneration.txt b/python/plugins/processing/algs/saga/description/RiverGridGeneration.txt
new file mode 100644
index 0000000..1e91a03
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/RiverGridGeneration.txt
@@ -0,0 +1,9 @@
+RiverGridGeneration
+sim_rivflow
+ParameterRaster|INPUT|Gel�ndemodell (DTM)|False
+OutputRaster|OUTPUT|HG Raster
+ParameterNumber|SX|Abflusspfad-Quelle, x-Wert| 0|None| 0
+ParameterNumber|SY|Abflusspfad-Quelle, y-Wert| 0|None| 0
+ParameterNumber|MX|Abflusspfad-M�ndung, x-Wert| 0|None| 0
+ParameterNumber|MY|Abflusspfad-M�ndung, y-Wert| 0|None| 0
+ParameterBoolean|Owrite|Overwrite RiverGridCells|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SVMClassification.txt b/python/plugins/processing/algs/saga/description/SVMClassification.txt
new file mode 100644
index 0000000..358f072
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SVMClassification.txt
@@ -0,0 +1,24 @@
+SVM Classification
+imagery_svm
+ParameterMultipleInput|GRIDS|Grids|3|False
+OutputRaster|CLASSES|Classification
+ParameterSelection|SCALING|Scaling|[0] none;[1] normalize (0-1);[2] standardize| 2
+ParameterBoolean|MESSAGE|Verbose Messages|False
+ParameterSelection|MODEL_SRC|Model Source|[0] create from training areas;[1] restore from file| 0
+ParameterFile|MODEL_LOAD|Restore Model from File|False|False
+ParameterVector|ROI|Training Areas|-1|False
+ParameterTable|ROI_ID|Class Identifier|False
+ParameterFile|MODEL_SAVE|Store Model to File|False|False
+ParameterSelection|SVM_TYPE|SVM Type|[0] C-SVC;[1] nu-SVC;[2] one-class SVM;[3] epsilon-SVR;[4] nu-SVR| 0
+ParameterSelection|KERNEL_TYPE|Kernel Type|[0] linear;[1] polynomial;[2] radial basis function;[3] sigmoid| 2
+ParameterNumber|DEGREE|Degree|None|None| 3
+ParameterNumber|GAMMA|Gamma|None|None| 0.000000
+ParameterNumber|COEF0|coef0|None|None| 0.000000
+ParameterNumber|COST|C|None|None| 1.000000
+ParameterNumber|NU|nu-SVR|None|None| 0.500000
+ParameterNumber|EPS_SVR|SVR Epsilon|None|None| 0.100000
+ParameterNumber|CACHE_SIZE|Cache Size|None|None| 100.000000
+ParameterNumber|EPS|Epsilon|None|None| 0.001000
+ParameterBoolean|SHRINKING|Shrinking|False
+ParameterBoolean|PROBABILITY|Probability Estimates|False
+ParameterNumber|CROSSVAL|Cross Validation| 1|None| 1
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SeededRegionGrowing.txt b/python/plugins/processing/algs/saga/description/SeededRegionGrowing.txt
new file mode 100644
index 0000000..fc6391f
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SeededRegionGrowing.txt
@@ -0,0 +1,15 @@
+Seeded Region Growing
+imagery_segmentation
+ParameterRaster|SEEDS|Seeds|False
+ParameterMultipleInput|FEATURES|Features|3|False
+OutputRaster|SEGMENTS|Segments
+OutputRaster|SIMILARITY|Similarity
+ParameterTable|TABLE|Seeds|False
+ParameterBoolean|NORMALIZE|Normalize|False
+ParameterSelection|NEIGHBOUR|Neighbourhood|[0] 4 (von Neumann);[1] 8 (Moore)| 0
+ParameterSelection|METHOD|Method|[0] feature space and position;[1] feature space| 0
+ParameterNumber|SIG_1|Variance in Feature Space| 0.000000|None| 1.000000
+ParameterNumber|SIG_2|Variance in Position Space| 0.000000|None| 1.000000
+ParameterNumber|THRESHOLD|Similarity Threshold| 0.000000|None| 0.000000
+ParameterBoolean|REFRESH|Refresh|False
+ParameterNumber|LEAFSIZE|Leaf Size (for Speed Optimisation)| 2|None| 256
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SievingClasses.txt b/python/plugins/processing/algs/saga/description/SievingClasses.txt
new file mode 100644
index 0000000..6e17e94
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SievingClasses.txt
@@ -0,0 +1,8 @@
+Sieving Classes
+grid_filter
+ParameterRaster|INPUT|Classes|False
+OutputRaster|OUTPUT|Sieved Classes
+ParameterSelection|MODE|Neighbourhood|[0] Neumann;[1] Moore| 1
+ParameterNumber|THRESHOLD|Minimum Threshold| 2|None| 4
+ParameterSelection|ALL|Class Selection|[0] single class;[1] all classes| 1
+ParameterNumber|CLASS|Class Identifier|None|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SimpleFilterwithinshapes.txt b/python/plugins/processing/algs/saga/description/SimpleFilterwithinshapes.txt
new file mode 100644
index 0000000..95fb15b
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SimpleFilterwithinshapes.txt
@@ -0,0 +1,8 @@
+Simple Filter within shapes
+grid_filter
+ParameterRaster|INPUT|Grid|False
+OutputRaster|RESULT|Filtered Grid
+ParameterVector|SHAPES|Boundaries|-1|False
+ParameterSelection|MODE|Search Mode|[0] Square;[1] Circle| 1
+ParameterSelection|METHOD|Filter|[0] Smooth;[1] Sharpen;[2] Edge| 0
+ParameterNumber|RADIUS|Radius| 1|None| 1
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SimpleKriging.txt b/python/plugins/processing/algs/saga/description/SimpleKriging.txt
new file mode 100644
index 0000000..72a76c9
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SimpleKriging.txt
@@ -0,0 +1,25 @@
+Simple Kriging
+statistics_kriging
+ParameterVector|POINTS|Points|0|False
+ParameterTable|FIELD|Attribute|False
+ParameterSelection|TQUALITY|Type of Quality Measure|[0] standard deviation;[1] variance| 0
+ParameterBoolean|LOG|Logarithmic Transformation|False
+ParameterBoolean|BLOCK|Block Kriging|False
+ParameterNumber|DBLOCK|Block Size| 0.000000|None| 100.000000
+ParameterNumber|VAR_MAXDIST|Maximum Distance|None|None| -1.000000
+ParameterNumber|VAR_NCLASSES|Lag Distance Classes| 1|None| 100
+ParameterNumber|VAR_NSKIP|Skip| 1|None| 1
+ParameterString|VAR_MODEL|Model
+Hardcoded|-TARGET_DEFINITION 0
+Extent TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX
+ParameterNumber|TARGET_USER_SIZE|Cellsize|None|None|100.0
+ParameterSelection|TARGET_USER_FITS|Fit|[0] nodes;[1] cells| 0
+ParameterRaster|TARGET_TEMPLATE|Target System|True
+OutputRaster|PREDICTION|Prediction
+OutputRaster|VARIANCE|Quality Measure
+ParameterSelection|SEARCH_RANGE|Search Range|[0] local;[1] global| 0
+ParameterNumber|SEARCH_RADIUS|Maximum Search Distance| 0.000000|None| 1000.000000
+ParameterSelection|SEARCH_POINTS_ALL|Number of Points|[0] maximum number of nearest points;[1] all points within search distance| 0
+ParameterNumber|SEARCH_POINTS_MIN|Minimum| 1|None| 16
+ParameterNumber|SEARCH_POINTS_MAX|Maximum| 1|None| 20
+ParameterSelection|SEARCH_DIRECTION|Direction|[0] all directions;[1] quadrants| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SingleValueDecomposition(OpenCV).txt b/python/plugins/processing/algs/saga/description/SingleValueDecomposition(OpenCV).txt
new file mode 100644
index 0000000..123c249
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SingleValueDecomposition(OpenCV).txt
@@ -0,0 +1,6 @@
+Single Value Decomposition (OpenCV)
+imagery_opencv
+ParameterRaster|INPUT|Input|False
+OutputRaster|OUTPUT|Output
+ParameterNumber|RANGE_MIN|Range (Min)|None|None|None
+ParameterNumber|RANGE_MAX|Range (Max)|None|None|None
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SlopeLimitedFlowAccumulation.txt b/python/plugins/processing/algs/saga/description/SlopeLimitedFlowAccumulation.txt
new file mode 100644
index 0000000..1e924c8
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SlopeLimitedFlowAccumulation.txt
@@ -0,0 +1,10 @@
+Slope Limited Flow Accumulation
+ta_hydrology
+ParameterRaster|DEM|Elevation|False
+ParameterRaster|WEIGHT|Weight|True
+OutputRaster|FLOW|Flow Accumulation
+ParameterNumber|SLOPE_MIN|Slope Minimum| 0.000000|None| 0.000000
+ParameterNumber|SLOPE_MAX|Slope Threshold| 0.000000| 90.000000| 5.000000
+ParameterBoolean|B_FLOW|Use Flow Threshold|False
+ParameterNumber|T_FLOW_MIN|Flow Threshold (Min)|None|None|None
+ParameterNumber|T_FLOW_MAX|Flow Threshold (Max)|None|None|None
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Smoothing(ViGrA).txt b/python/plugins/processing/algs/saga/description/Smoothing(ViGrA).txt
new file mode 100644
index 0000000..94d3f21
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Smoothing(ViGrA).txt
@@ -0,0 +1,7 @@
+Smoothing (ViGrA)
+imagery_vigra
+ParameterRaster|INPUT|Input|False
+OutputRaster|OUTPUT|Output
+ParameterSelection|TYPE|Type of smoothing|[0] exponential;[1] nonlinear;[2] gaussian| 0
+ParameterNumber|SCALE|Size of smoothing filter| 0.000000|None| 2.000000
+ParameterNumber|EDGE|Edge threshold for nonlinear smoothing| 0.000000|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SnapPointstoGrid.txt b/python/plugins/processing/algs/saga/description/SnapPointstoGrid.txt
new file mode 100644
index 0000000..5a7e348
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SnapPointstoGrid.txt
@@ -0,0 +1,9 @@
+Snap Points to Grid
+shapes_points
+ParameterVector|INPUT|Points|0|False
+ParameterRaster|GRID|Grid|False
+OutputVector|OUTPUT|Result
+OutputVector|MOVES|Moves
+ParameterNumber|DISTANCE|Search Distance (Map Units)| 0.000000|None| 0.000000
+ParameterSelection|SHAPE|Search Shape|[0] circle;[1] square| 0
+ParameterSelection|EXTREME|Extreme|[0] minimum;[1] maximum| 1
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SnapPointstoLines.txt b/python/plugins/processing/algs/saga/description/SnapPointstoLines.txt
new file mode 100644
index 0000000..ece260c
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SnapPointstoLines.txt
@@ -0,0 +1,7 @@
+Snap Points to Lines
+shapes_points
+ParameterVector|INPUT|Points|1|False
+ParameterVector|SNAP|Snap Features|-1|False
+OutputVector|OUTPUT|Result
+OutputVector|MOVES|Moves
+ParameterNumber|DISTANCE|Search Distance| 0.000000|None| 0.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SnapPointstoPoints.txt b/python/plugins/processing/algs/saga/description/SnapPointstoPoints.txt
new file mode 100644
index 0000000..30a60e9
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SnapPointstoPoints.txt
@@ -0,0 +1,7 @@
+Snap Points to Points
+shapes_points
+ParameterVector|INPUT|Points|-1|False
+ParameterVector|SNAP|Snap Features|-1|False
+OutputVector|OUTPUT|Result
+OutputVector|MOVES|Moves
+ParameterNumber|DISTANCE|Search Distance| 0.000000|None| 0.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SplitLinesatPoints.txt b/python/plugins/processing/algs/saga/description/SplitLinesatPoints.txt
new file mode 100644
index 0000000..f9740a1
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SplitLinesatPoints.txt
@@ -0,0 +1,7 @@
+Split Lines at Points
+shapes_lines
+ParameterVector|LINES|Lines|1|False
+ParameterVector|SPLIT|Split Features|0|False
+OutputVector|INTERSECT|Intersection
+ParameterSelection|OUTPUT|Output|[0] polylines;[1] separate lines| 1
+ParameterNumber|EPSILON|Epsilon|None|None| 0.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SplitLineswithLines.txt b/python/plugins/processing/algs/saga/description/SplitLineswithLines.txt
new file mode 100644
index 0000000..1a96df2
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SplitLineswithLines.txt
@@ -0,0 +1,6 @@
+Split Lines with Lines
+shapes_lines
+ParameterVector|LINES|Lines|1|False
+ParameterVector|SPLIT|Split Features|1|False
+OutputVector|INTERSECT|Intersection
+ParameterSelection|OUTPUT|Output|[0] polylines;[1] separate lines| 1
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SupervisedClassificationforGrids.txt b/python/plugins/processing/algs/saga/description/SupervisedClassificationforGrids.txt
new file mode 100644
index 0000000..ba6e0e7
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SupervisedClassificationforGrids.txt
@@ -0,0 +1,21 @@
+Supervised Classification for Grids
+imagery_classification
+ParameterMultipleInput|GRIDS|Features|3|False
+ParameterBoolean|NORMALISE|Normalise|False
+OutputRaster|CLASSES|Classification
+OutputRaster|QUALITY|Quality
+ParameterVector|TRAINING|Training Areas|-1|True
+ParameterTable|TRAINING_CLASS|Class Identifier|False
+ParameterFile|FILE_LOAD|Load Statistics from File...|False|False
+ParameterFile|FILE_SAVE|Save Statistics to File...|False|False
+ParameterSelection|METHOD|Method|[0] Binary Encoding;[1] Parallelepiped;[2] Minimum Distance;[3] Mahalanobis Distance;[4] Maximum Likelihood;[5] Spectral Angle Mapping;[6] Winner Takes All| 2
+ParameterNumber|THRESHOLD_DIST|Distance Threshold| 0.000000|None| 0.000000
+ParameterNumber|THRESHOLD_ANGLE|Spectral Angle Threshold (Degree)| 0.000000| 90.000000| 0.000000
+ParameterNumber|THRESHOLD_PROB|Probability Threshold| 0.000000| 100.000000| 0.000000
+ParameterSelection|RELATIVE_PROB|Probability Reference|[0] absolute;[1] relative| 1
+ParameterBoolean|WTA_0|Binary Encoding|False
+ParameterBoolean|WTA_1|Parallelepiped|False
+ParameterBoolean|WTA_2|Minimum Distance|False
+ParameterBoolean|WTA_3|Mahalanobis Distance|False
+ParameterBoolean|WTA_4|Maximum Likelihood|False
+ParameterBoolean|WTA_5|Spectral Angle Mapping|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SupervisedClassificationforShapes.txt b/python/plugins/processing/algs/saga/description/SupervisedClassificationforShapes.txt
new file mode 100644
index 0000000..fadb3b7
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SupervisedClassificationforShapes.txt
@@ -0,0 +1,20 @@
+Supervised Classification for Shapes
+imagery_classification
+ParameterVector|SHAPES|Shapes|-1|False
+OutputVector|CLASSES|Classification
+ParameterTable|FEATURES|Features|False
+ParameterBoolean|NORMALISE|Normalise|False
+ParameterTable|TRAINING|Training Classes|False
+ParameterFile|FILE_LOAD|Load Statistics from File...|False|False
+ParameterFile|FILE_SAVE|Save Statistics to File...|False|False
+ParameterSelection|METHOD|Method|[0] Binary Encoding;[1] Parallelepiped;[2] Minimum Distance;[3] Mahalanobis Distance;[4] Maximum Likelihood;[5] Spectral Angle Mapping;[6] Winner Takes All| 2
+ParameterNumber|THRESHOLD_DIST|Distance Threshold| 0.000000|None| 0.000000
+ParameterNumber|THRESHOLD_ANGLE|Spectral Angle Threshold (Degree)| 0.000000| 90.000000| 0.000000
+ParameterNumber|THRESHOLD_PROB|Probability Threshold| 0.000000| 100.000000| 0.000000
+ParameterSelection|RELATIVE_PROB|Probability Reference|[0] absolute;[1] relative| 1
+ParameterBoolean|WTA_0|Binary Encoding|False
+ParameterBoolean|WTA_1|Parallelepiped|False
+ParameterBoolean|WTA_2|Minimum Distance|False
+ParameterBoolean|WTA_3|Mahalanobis Distance|False
+ParameterBoolean|WTA_4|Maximum Likelihood|False
+ParameterBoolean|WTA_5|Spectral Angle Mapping|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SupportVectorMachineClassification(OpenCV).txt b/python/plugins/processing/algs/saga/description/SupportVectorMachineClassification(OpenCV).txt
new file mode 100644
index 0000000..5bb5d34
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SupportVectorMachineClassification(OpenCV).txt
@@ -0,0 +1,15 @@
+Support Vector Machine Classification (OpenCV)
+imagery_opencv
+ParameterMultipleInput|FEATURES|Features|3|False
+ParameterBoolean|NORMALIZE|Normalize|False
+ParameterVector|TRAIN_AREAS|Training Areas|-1|False
+ParameterTable|TRAIN_CLASS|Class Identifier|False
+OutputRaster|CLASSES|Classification
+ParameterSelection|SVM_TYPE|SVM Type|[0] c-support vector classification;[1] nu support vector classification;[2] distribution estimation (one class);[3] epsilon support vector regression;[4] nu support vector regression| 0
+ParameterNumber|C|C| 0.000000|None| 1.000000
+ParameterNumber|NU|Nu| 0.000000|None| 0.500000
+ParameterNumber|P|P| 0.000000|None| 0.500000
+ParameterSelection|KERNEL|Kernel Type|[0] linear;[1] polynomial;[2] radial basis function;[3] sigmoid;[4] exponential chi2;[5] histogram intersection| 1
+ParameterNumber|COEF0|Coefficient 0| 0.000000|None| 1.000000
+ParameterNumber|DEGREE|Degree| 0.000000|None| 0.500000
+ParameterNumber|GAMMA|Gamma| 0.000000|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SurfaceGradientandConcentration.txt b/python/plugins/processing/algs/saga/description/SurfaceGradientandConcentration.txt
new file mode 100644
index 0000000..da382dd
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SurfaceGradientandConcentration.txt
@@ -0,0 +1,12 @@
+Surface, Gradient and Concentration
+sim_hydrology
+ParameterRaster|MASK|Mask|False
+OutputRaster|SURF|Surface
+OutputRaster|GRAD|Gradient
+OutputRaster|CONC|Concentration
+ParameterNumber|SURF_E|Surface Approximation Threshold| 0.000000|None| 0.001000
+ParameterNumber|CONC_IN|Inlet Concentration| 0.000000|None| 5.000000
+ParameterNumber|CONC_OUT|Outlet Concentration| 0.000000|None| 3.000000
+ParameterNumber|CONC_E|Concentration Approximation Threshold| 0.000000|None| 0.001000
+ParameterNumber|GRAD_MIN|Minimum Gradient| 0.000000|None| 0.000000
+ParameterSelection|NEIGHBOURS|Neighbourhood|[0] Moore (8);[1] Neumann (4);[2] Optimised| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SurfaceandGradient.txt b/python/plugins/processing/algs/saga/description/SurfaceandGradient.txt
new file mode 100644
index 0000000..55aceca
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SurfaceandGradient.txt
@@ -0,0 +1,6 @@
+Surface and Gradient
+sim_hydrology
+ParameterRaster|MASK|Mask|False
+OutputRaster|SURF|Surface
+OutputRaster|GRAD|Gradient
+ParameterNumber|SURF_E|Surface Approximation Threshold| 0.000000|None| 0.001000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/SymmetricalDifference.txt b/python/plugins/processing/algs/saga/description/SymmetricalDifference.txt
new file mode 100644
index 0000000..c68254c
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/SymmetricalDifference.txt
@@ -0,0 +1,6 @@
+Symmetrical Difference
+shapes_polygons
+ParameterVector|A|Layer A|-1|False
+ParameterVector|B|Layer B|-1|False
+OutputVector|RESULT|Symmetrical Difference
+ParameterBoolean|SPLIT|Split Parts|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/TCILow.txt b/python/plugins/processing/algs/saga/description/TCILow.txt
new file mode 100644
index 0000000..aa68d2d
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/TCILow.txt
@@ -0,0 +1,5 @@
+TCI Low
+ta_hydrology
+ParameterRaster|DISTANCE|Vertical Distance to Channel Network|False
+ParameterRaster|TWI|Topographic Wetness Index|False
+OutputRaster|TCILOW|TCI Low
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/TasseledCapTransformation.txt b/python/plugins/processing/algs/saga/description/TasseledCapTransformation.txt
new file mode 100644
index 0000000..f659e3e
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/TasseledCapTransformation.txt
@@ -0,0 +1,11 @@
+Tasseled Cap Transformation
+imagery_tools
+ParameterRaster|BLUE|Blue (TM 1)|True
+ParameterRaster|RED|Red (TM 2)|False
+ParameterRaster|GREEN|Green (TM 3)|False
+ParameterRaster|NIR|Near Infrared (TM 4)|False
+ParameterRaster|MIR1|Mid Infrared (TM 5)|False
+ParameterRaster|MIR2|Mid Infrared (TM 7)|False
+OutputRaster|BRIGHTNESS|Brightness
+OutputRaster|GREENNESS|Greenness
+OutputRaster|WETNESS|Wetness
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/TerrainMapView.txt b/python/plugins/processing/algs/saga/description/TerrainMapView.txt
new file mode 100644
index 0000000..ea3f7f3
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/TerrainMapView.txt
@@ -0,0 +1,11 @@
+Terrain Map View
+grid_visualisation
+ParameterRaster|DEM|DEM|False
+OutputRaster|SHADE|Shade
+OutputRaster|OPENNESS|Openness
+OutputRaster|SLOPE|Slope
+OutputVector|CONTOURS|Contours
+ParameterSelection|METHOD|Method|[0] Topography;[1] Morphology| 0
+ParameterNumber|RADIUS|Radial Limit| 0.000000|None| 1000.000000
+ParameterBoolean|CONTOUR_LINES|Contour Lines|True
+ParameterNumber|EQUIDISTANCE|Equidistance| 0.000000|None| 50.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/TerrainSurfaceClassification(IwahashiandPike).txt b/python/plugins/processing/algs/saga/description/TerrainSurfaceClassification(IwahashiandPike).txt
new file mode 100644
index 0000000..77891b9
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/TerrainSurfaceClassification(IwahashiandPike).txt
@@ -0,0 +1,16 @@
+Terrain Surface Classification (Iwahashi and Pike)
+ta_morphometry
+ParameterRaster|DEM|Elevation|False
+ParameterRaster|SLOPE|Slope|True
+ParameterRaster|CONVEXITY|Convexity|True
+ParameterBoolean|CONV_RECALC|Recalculate|False
+ParameterRaster|TEXTURE|Texture|True
+ParameterBoolean|TEXT_RECALC|Recalculate|False
+OutputRaster|LANDFORMS|Landforms
+ParameterSelection|TYPE|Number of Classes|[0] 8;[1] 12;[2] 16| 2
+ParameterNumber|CONV_SCALE|Scale (Cells)| 1|None| 10
+ParameterSelection|CONV_KERNEL|Laplacian Filter Kernel|[0] four-neighbourhood;[1] eight-neihbourhood;[2] eight-neihbourhood (distance based weighting)| 0
+ParameterSelection|CONV_TYPE|Type|[0] convexity;[1] concavity| 0
+ParameterNumber|CONV_EPSILON|Flat Area Threshold| 0.000000|None| 0.000000
+ParameterNumber|TEXT_SCALE|Scale (Cells)| 1|None| 10
+ParameterNumber|TEXT_EPSILON|Flat Area Threshold| 0.000000|None| 1.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/TerrainSurfaceConvexity.txt b/python/plugins/processing/algs/saga/description/TerrainSurfaceConvexity.txt
new file mode 100644
index 0000000..83ee89d
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/TerrainSurfaceConvexity.txt
@@ -0,0 +1,13 @@
+Terrain Surface Convexity
+ta_morphometry
+ParameterRaster|DEM|Elevation|False
+OutputRaster|CONVEXITY|Convexity
+ParameterSelection|KERNEL|Laplacian Filter Kernel|[0] conventional four-neighbourhood;[1] conventional eight-neihbourhood;[2] eight-neihbourhood (distance based weighting)| 0
+ParameterSelection|TYPE|Type|[0] convexity;[1] concavity| 0
+ParameterNumber|EPSILON|Flat Area Threshold| 0.000000|None| 0.000000
+ParameterNumber|SCALE|Scale (Cells)| 1|None| 10
+ParameterSelection|METHOD|Method|[0] counting cells;[1] resampling| 1
+ParameterSelection|DW_WEIGHTING|Weighting Function|[0] no distance weighting;[1] inverse distance to a power;[2] exponential;[3] gaussian weighting| 3
+ParameterNumber|DW_IDW_POWER|Inverse Distance Weighting Power| 0.000000|None| 1.000000
+ParameterBoolean|DW_IDW_OFFSET|Inverse Distance Offset|True
+ParameterNumber|DW_BANDWIDTH|Gaussian and Exponential Weighting Bandwidth| 0.000000|None| 0.700000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/TerrainSurfaceTexture.txt b/python/plugins/processing/algs/saga/description/TerrainSurfaceTexture.txt
new file mode 100644
index 0000000..562d638
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/TerrainSurfaceTexture.txt
@@ -0,0 +1,11 @@
+Terrain Surface Texture
+ta_morphometry
+ParameterRaster|DEM|Elevation|False
+OutputRaster|TEXTURE|Texture
+ParameterNumber|EPSILON|Flat Area Threshold| 0.000000|None| 1.000000
+ParameterNumber|SCALE|Scale (Cells)| 1|None| 10
+ParameterSelection|METHOD|Method|[0] counting cells;[1] resampling| 1
+ParameterSelection|DW_WEIGHTING|Weighting Function|[0] no distance weighting;[1] inverse distance to a power;[2] exponential;[3] gaussian weighting| 3
+ParameterNumber|DW_IDW_POWER|Inverse Distance Weighting Power| 0.000000|None| 1.000000
+ParameterBoolean|DW_IDW_OFFSET|Inverse Distance Offset|True
+ParameterNumber|DW_BANDWIDTH|Gaussian and Exponential Weighting Bandwidth| 0.000000|None| 0.700000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ThiessenPolygons.txt b/python/plugins/processing/algs/saga/description/ThiessenPolygons.txt
new file mode 100644
index 0000000..b0eabe7
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ThiessenPolygons.txt
@@ -0,0 +1,5 @@
+Thiessen Polygons
+shapes_points
+ParameterVector|POINTS|Points|-1|False
+OutputVector|POLYGONS|Polygons
+ParameterNumber|FRAME|Frame Size| 0.000000|None| 10.000000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/TopofAtmosphereReflectance.txt b/python/plugins/processing/algs/saga/description/TopofAtmosphereReflectance.txt
new file mode 100644
index 0000000..702f0b8
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/TopofAtmosphereReflectance.txt
@@ -0,0 +1,69 @@
+Top of Atmosphere Reflectance
+imagery_tools
+ParameterRaster|DN_MSS01|DN Band 1|True
+ParameterRaster|DN_MSS02|DN Band 2|True
+ParameterRaster|DN_MSS03|DN Band 3|True
+ParameterRaster|DN_MSS04|DN Band 4|True
+OutputRaster|RF_MSS01|Reflectance Band 1
+OutputRaster|RF_MSS02|Reflectance Band 2
+OutputRaster|RF_MSS03|Reflectance Band 3
+OutputRaster|RF_MSS04|Reflectance Band 4
+ParameterRaster|DN_ETM01|DN Band 1|True
+ParameterRaster|DN_ETM02|DN Band 2|True
+ParameterRaster|DN_ETM03|DN Band 3|True
+ParameterRaster|DN_ETM04|DN Band 4|True
+ParameterRaster|DN_ETM05|DN Band 5|True
+ParameterRaster|DN_ETM07|DN Band 7|True
+OutputRaster|RF_ETM01|Reflectance Band 1
+OutputRaster|RF_ETM02|Reflectance Band 2
+OutputRaster|RF_ETM03|Reflectance Band 3
+OutputRaster|RF_ETM04|Reflectance Band 4
+OutputRaster|RF_ETM05|Reflectance Band 5
+OutputRaster|RF_ETM07|Reflectance Band 7
+ParameterRaster|DN_OLI01|DN Band 1|True
+ParameterRaster|DN_OLI02|DN Band 2|True
+ParameterRaster|DN_OLI03|DN Band 3|True
+ParameterRaster|DN_OLI04|DN Band 4|True
+ParameterRaster|DN_OLI05|DN Band 5|True
+ParameterRaster|DN_OLI06|DN Band 6|True
+ParameterRaster|DN_OLI07|DN Band 7|True
+ParameterRaster|DN_OLI09|DN Band 9|True
+OutputRaster|RF_OLI01|Reflectance Band 1
+OutputRaster|RF_OLI02|Reflectance Band 2
+OutputRaster|RF_OLI03|Reflectance Band 3
+OutputRaster|RF_OLI04|Reflectance Band 4
+OutputRaster|RF_OLI05|Reflectance Band 5
+OutputRaster|RF_OLI06|Reflectance Band 6
+OutputRaster|RF_OLI07|Reflectance Band 7
+OutputRaster|RF_OLI09|Reflectance Band 9
+ParameterRaster|DN__TM06|DN Band 6|True
+OutputRaster|RF__TM06|Reflectance Band 6
+ParameterRaster|DN_ETM61|DN Band 61|True
+ParameterRaster|DN_ETM62|DN Band 62|True
+OutputRaster|RF_ETM61|Reflectance Band 61
+OutputRaster|RF_ETM62|Reflectance Band 62
+ParameterRaster|DN_OLI10|DN Band 10|True
+ParameterRaster|DN_OLI11|DN Band 11|True
+OutputRaster|RF_OLI10|Reflectance Band 10
+OutputRaster|RF_OLI11|Reflectance Band 11
+ParameterRaster|DN_PAN08|DN Band 8|True
+OutputRaster|RF_PAN08|Reflectance Band 8
+ParameterFile|METAFILE|Metadata File|False|False
+ParameterSelection|SENSOR|Spacecraft Sensor|[0] Landsat-1 MSS;[1] Landsat-2 MSS;[2] Landsat-3 MSS;[3] Landsat-4 MSS;[4] Landsat-5 MSS;[5] Landsat-4 TM;[6] Landsat-5 TM;[7] Landsat-7 ETM+;[8] Landsat-8 OLI/TIRS| 7
+ParameterString|DATE_ACQU|Image Acquisition Date
+ParameterString|DATE_PROD|Image Creation Date
+ParameterNumber|SUN_HGT|Suns's Height| 0.000000| 90.000000| 45.000000
+ParameterBoolean|AS_RAD|At-Sensor Radiance|False
+ParameterSelection|AC_METHOD|Atmospheric Correction|[0] uncorrected;[1] corrected;[2] dark object subtraction 1;[3] dark object subtraction 2;[4] dark object subtraction 2b;[5] dark object subtraction 3;[6] dark object subtraction 4| 0
+ParameterNumber|AC_DO_CELLS|Minimum Number of Dark Object Cells| 0|None| 1000
+ParameterNumber|AC_RAYLEIGH|Rayleigh Scattering|None|None| 0.000000
+ParameterNumber|AC_SUN_RAD|Solar Radiance| 0.000000| 100.000000| 1.000000
+ParameterSelection|ETM_GAIN_10|Band 1|[0] low;[1] high| 1
+ParameterSelection|ETM_GAIN_20|Band 2|[0] low;[1] high| 1
+ParameterSelection|ETM_GAIN_30|Band 3|[0] low;[1] high| 1
+ParameterSelection|ETM_GAIN_40|Band 4|[0] low;[1] high| 1
+ParameterSelection|ETM_GAIN_50|Band 5|[0] low;[1] high| 1
+ParameterSelection|ETM_GAIN_61|Band 61|[0] low;[1] high| 0
+ParameterSelection|ETM_GAIN_62|Band 62|[0] low;[1] high| 1
+ParameterSelection|ETM_GAIN_70|Band 7|[0] low;[1] high| 1
+ParameterSelection|ETM_GAIN_80|Band 8|[0] low;[1] high| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/TopographicOpenness.txt b/python/plugins/processing/algs/saga/description/TopographicOpenness.txt
new file mode 100644
index 0000000..bcfbd31
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/TopographicOpenness.txt
@@ -0,0 +1,9 @@
+Topographic Openness
+ta_lighting
+ParameterRaster|DEM|Elevation|False
+OutputRaster|POS|Positive Openness
+OutputRaster|NEG|Negative Openness
+ParameterNumber|RADIUS|Radial Limit| 0.000000|None| 10000.000000
+ParameterSelection|METHOD|Method|[0] multi scale;[1] sectors| 1
+ParameterNumber|DLEVEL|Multi Scale Factor| 1.250000|None| 3.000000
+ParameterNumber|NDIRS|Number of Sectors| 2|None| 8
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Union.txt b/python/plugins/processing/algs/saga/description/Union.txt
new file mode 100644
index 0000000..be9cc76
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Union.txt
@@ -0,0 +1,6 @@
+Union
+shapes_polygons
+ParameterVector|A|Layer A|-1|False
+ParameterVector|B|Layer B|-1|False
+OutputVector|RESULT|Union
+ParameterBoolean|SPLIT|Split Parts|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/Update.txt b/python/plugins/processing/algs/saga/description/Update.txt
new file mode 100644
index 0000000..690b7dd
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/Update.txt
@@ -0,0 +1,6 @@
+Update
+shapes_polygons
+ParameterVector|A|Layer A|-1|False
+ParameterVector|B|Layer B|-1|False
+OutputVector|RESULT|Update
+ParameterBoolean|SPLIT|Split Parts|True
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/UpslopeandDownslopeCurvature.txt b/python/plugins/processing/algs/saga/description/UpslopeandDownslopeCurvature.txt
new file mode 100644
index 0000000..0bdeff7
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/UpslopeandDownslopeCurvature.txt
@@ -0,0 +1,9 @@
+Upslope and Downslope Curvature
+ta_morphometry
+ParameterRaster|DEM|Elevation|False
+OutputRaster|C_LOCAL|Local Curvature
+OutputRaster|C_UP|Upslope Curvature
+OutputRaster|C_UP_LOCAL|Local Upslope Curvature
+OutputRaster|C_DOWN|Downslope Curvature
+OutputRaster|C_DOWN_LOCAL|Local Downslope Curvature
+ParameterNumber|WEIGHTING|Upslope Weighting| 0.000000| 1.000000| 0.500000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ValleyDepth.txt b/python/plugins/processing/algs/saga/description/ValleyDepth.txt
new file mode 100644
index 0000000..9d2f142
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ValleyDepth.txt
@@ -0,0 +1,8 @@
+Valley Depth
+ta_channels
+ParameterRaster|ELEVATION|Elevation|False
+OutputRaster|VALLEY_DEPTH|Valley Depth
+OutputRaster|RIDGE_LEVEL|Ridge Level
+ParameterNumber|THRESHOLD|Tension Threshold [Percentage of Cell Size]| 0.000000|None| 1.000000
+ParameterBoolean|NOUNDERGROUND|Keep Ridge Level above Surface|True
+ParameterNumber|ORDER|Ridge Detection Threshold| 1| 7| 4
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ValleyandRidgeDetection(TopHatApproach).txt b/python/plugins/processing/algs/saga/description/ValleyandRidgeDetection(TopHatApproach).txt
new file mode 100644
index 0000000..d84c066a
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ValleyandRidgeDetection(TopHatApproach).txt
@@ -0,0 +1,12 @@
+Valley and Ridge Detection (Top Hat Approach)
+ta_morphometry
+ParameterRaster|DEM|Elevation|False
+OutputRaster|VALLEY|Valley Depth
+OutputRaster|HILL|Hill Height
+OutputRaster|VALLEY_IDX|Valley Index
+OutputRaster|HILL_IDX|Hill Index
+OutputRaster|SLOPE_IDX|Hillslope Index
+ParameterNumber|RADIUS_VALLEY|Valley Radius| 0.000000|None| 1000.000000
+ParameterNumber|RADIUS_HILL|Hill Radius| 0.000000|None| 1000.000000
+ParameterNumber|THRESHOLD|Elevation Threshold| 0.000000|None| 100.000000
+ParameterSelection|METHOD|Slope Index|[0] default;[1] alternative| 0
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/VegetationIndex(DistanceBased).txt b/python/plugins/processing/algs/saga/description/VegetationIndex(DistanceBased).txt
new file mode 100644
index 0000000..f7ed226
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/VegetationIndex(DistanceBased).txt
@@ -0,0 +1,12 @@
+Vegetation Index (Distance Based)
+imagery_tools
+ParameterRaster|RED|Red Reflectance|False
+ParameterRaster|NIR|Near Infrared Reflectance|False
+OutputRaster|PVI0|Perpendicular Vegetation Index (Richardson and Wiegand, 1977)
+OutputRaster|PVI1|Perpendicular Vegetation Index (Perry and Lautenschlager, 1984)
+OutputRaster|PVI2|Perpendicular Vegetation Index (Walther and Shabaani)
+OutputRaster|PVI3|Perpendicular Vegetation Index (Qi, et al., 1994)
+OutputRaster|TSAVI|Transformed Soil Adjusted Vegetation Index (Baret et al. 1989)
+OutputRaster|ATSAVI|Transformed Soil Adjusted Vegetation Index (Baret and Guyot, 1991)
+ParameterNumber|INTERCEPT|Intercept of Soil Line|None|None| 0.000000
+ParameterNumber|SLOPE|Slope of Soil Line|None|None| 0.500000
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/WarpingShapes.txt b/python/plugins/processing/algs/saga/description/WarpingShapes.txt
new file mode 100644
index 0000000..fe73b58
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/WarpingShapes.txt
@@ -0,0 +1,10 @@
+Warping Shapes
+pj_georeference
+ParameterVector|REF_SOURCE|Reference Points (Origin)|-1|False
+ParameterVector|REF_TARGET|Reference Points (Projection)|-1|True
+ParameterTable|XFIELD|x Position|False
+ParameterTable|YFIELD|y Position|False
+ParameterSelection|METHOD|Method|[0] Automatic;[1] Triangulation;[2] Spline;[3] Affine;[4] 1st Order Polynomial;[5] 2nd Order Polynomial;[6] 3rd Order Polynomial;[7] Polynomial, Order| 0
+ParameterNumber|ORDER|Polynomial Order| 1|None| 3
+ParameterVector|INPUT|Input|-1|False
+OutputVector|OUTPUT|Output
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/WatershedSegmentation(ViGrA).txt b/python/plugins/processing/algs/saga/description/WatershedSegmentation(ViGrA).txt
new file mode 100644
index 0000000..153e254
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/WatershedSegmentation(ViGrA).txt
@@ -0,0 +1,7 @@
+Watershed Segmentation (ViGrA)
+imagery_vigra
+ParameterRaster|INPUT|Input|False
+OutputRaster|OUTPUT|Segmentation
+ParameterNumber|SCALE|Width of gradient filter| 0.000000|None| 1.000000
+ParameterBoolean|RGB|RGB coded data|False
+ParameterBoolean|EDGES|Edges|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/WindExpositionIndex.txt b/python/plugins/processing/algs/saga/description/WindExpositionIndex.txt
new file mode 100644
index 0000000..060bb43
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/WindExpositionIndex.txt
@@ -0,0 +1,9 @@
+Wind Exposition Index
+ta_morphometry
+ParameterRaster|DEM|Elevation|False
+OutputRaster|EXPOSITION|Wind Exposition
+ParameterNumber|MAXDIST|Search Distance [km]| 0.000000|None| 300.000000
+ParameterNumber|STEP|Angular Step Size (Degree)| 1.000000| 45.000000| 15.000000
+ParameterBoolean|OLDVER|Old Version|False
+ParameterNumber|ACCEL|Acceleration| 1.000000|None| 1.500000
+ParameterBoolean|PYRAMIDS|Elevation Averaging|False
\ No newline at end of file
diff --git a/python/plugins/processing/algs/saga/description/ZonalMultipleRegressionAnalysis(PointsandPredictorGrids).txt b/python/plugins/processing/algs/saga/description/ZonalMultipleRegressionAnalysis(PointsandPredictorGrids).txt
new file mode 100644
index 0000000..c5b80b5
--- /dev/null
+++ b/python/plugins/processing/algs/saga/description/ZonalMultipleRegressionAnalysis(PointsandPredictorGrids).txt
@@ -0,0 +1,14 @@
+Zonal Multiple Regression Analysis (Points and Predictor Grids)
+statistics_regression
+ParameterMultipleInput|PREDICTORS|Predictors|3|False
+ParameterVector|ZONES|Zones|-1|False
+ParameterVector|POINTS|Points|-1|False
+ParameterTable|ATTRIBUTE|Dependent Variable|False
+OutputVector|RESIDUALS|Residuals
+OutputRaster|REGRESSION|Regression
+ParameterSelection|RESAMPLING|Resampling|[0] Nearest Neighbour;[1] Bilinear Interpolation;[2] Bicubic Spline Interpolation;[3] B-Spline Interpolation| 3
+ParameterBoolean|COORD_X|Include X Coordinate|False
+ParameterBoolean|COORD_Y|Include Y Coordinate|False
+ParameterBoolean|INTERCEPT|Intercept|True
+ParameterSelection|METHOD|Method|[0] include all;[1] forward;[2] backward;[3] stepwise| 3
+ParameterNumber|P_VALUE|Significance Level| 0.000000| 100.000000| 5.000000
\ No newline at end of file
diff --git a/python/plugins/processing/gui/AlgorithmExecutor.py b/python/plugins/processing/gui/AlgorithmExecutor.py
index 5c8e2ef..f1b4284 100644
--- a/python/plugins/processing/gui/AlgorithmExecutor.py
+++ b/python/plugins/processing/gui/AlgorithmExecutor.py
@@ -38,6 +38,7 @@ from processing.tools.system import getTempFilename
 from processing.tools import vector
 from processing.core.SilentProgress import SilentProgress
 
+
 def runalg(alg, progress=None):
     """Executes a given algorithm, showing its progress in the
     progress object passed along.
diff --git a/python/plugins/processing/gui/ScriptEditorDialog.py b/python/plugins/processing/gui/ScriptEditorDialog.py
index f7a3dc1..243a5c9 100644
--- a/python/plugins/processing/gui/ScriptEditorDialog.py
+++ b/python/plugins/processing/gui/ScriptEditorDialog.py
@@ -138,7 +138,6 @@ class ScriptEditorDialog(BASE, WIDGET):
 
         self.editor.setLexerType(self.algType)
 
-
     def showSnippets(self, evt):
         popupmenu = QMenu()
         for name, snippet in self.snippets.iteritems():
diff --git a/python/plugins/processing/tools/dataobjects.py b/python/plugins/processing/tools/dataobjects.py
index 721e180..8ba6830 100644
--- a/python/plugins/processing/tools/dataobjects.py
+++ b/python/plugins/processing/tools/dataobjects.py
@@ -74,8 +74,8 @@ def getSupportedOutputTableExtensions():
 
 
 def getRasterLayers(sorting=True):
-    layers = QgsProject.instance().layerTreeRoot().findLayers()
-    raster = [lay.layer() for lay in layers if lay.layer() is not None and canUseRasterLayer(lay.layer())]
+    layers = QgsMapLayerRegistry.instance().mapLayers().values()
+    raster = [lay for lay in layers if lay is not None and canUseRasterLayer(lay)]
     if sorting:
         return sorted(raster, key=lambda layer: layer.name().lower())
     else:
@@ -83,8 +83,8 @@ def getRasterLayers(sorting=True):
 
 
 def getVectorLayers(shapetype=[-1], sorting=True):
-    layers = QgsProject.instance().layerTreeRoot().findLayers()
-    vector = [lay.layer() for lay in layers if canUseVectorLayer(lay.layer(), shapetype)]
+    layers = QgsMapLayerRegistry.instance().mapLayers().values()
+    vector = [lay for lay in layers if canUseVectorLayer(lay, shapetype)]
     if sorting:
         return sorted(vector, key=lambda layer: layer.name().lower())
     else:
@@ -115,12 +115,11 @@ def getAllLayers():
 
 
 def getTables(sorting=True):
-    layers = QgsProject.instance().layerTreeRoot().findLayers()
+    layers = QgsMapLayerRegistry.instance().mapLayers().values()
     tables = []
     for layer in layers:
-        mapLayer = layer.layer()
-        if mapLayer.type() == QgsMapLayer.VectorLayer:
-            tables.append(mapLayer)
+        if layer.type() == QgsMapLayer.VectorLayer:
+            tables.append(layer)
     if sorting:
         return sorted(tables, key=lambda table: table.name().lower())
     else:
diff --git a/src/app/dwg/libdxfrw/intern/dwgreader18.cpp b/src/app/dwg/libdxfrw/intern/dwgreader18.cpp
index 7d69aa4..b399fe8 100644
--- a/src/app/dwg/libdxfrw/intern/dwgreader18.cpp
+++ b/src/app/dwg/libdxfrw/intern/dwgreader18.cpp
@@ -116,7 +116,7 @@ void dwgReader18::parseSysPage( duint8 *decompSec, duint32 decompSize )
   }
   DRW_DBG( "\n" );
 #endif
-  DRW_DBG( "decompresing " );
+  DRW_DBG( "decompressing " );
   DRW_DBG( compSize );
   DRW_DBG( " bytes in " );
   DRW_DBG( decompSize );
@@ -231,7 +231,7 @@ bool dwgReader18::parseDataPage( dwgSectionInfo si/*, duint8 *dData*/ )
 
     duint8* oData = objData + pi.startOffset;
     pi.uSize = si.maxSize;
-    DRW_DBG( "decompresing " );
+    DRW_DBG( "decompressing " );
     DRW_DBG( pi.cSize );
     DRW_DBG( " bytes in " );
     DRW_DBG( pi.uSize );
@@ -251,7 +251,7 @@ bool dwgReader18::readMetaData()
   if ( ! fileBuf->setPosition( 11 ) )
     return false;
   maintenanceVersion = fileBuf->getRawChar8();
-  DRW_DBG( "maintenance verion= " );
+  DRW_DBG( "maintenance version= " );
   DRW_DBGH( maintenanceVersion );
   DRW_DBG( "\nbyte at 0x0C= " );
   DRW_DBGH( fileBuf->getRawChar8() );
diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp
index 1f3e6bd..9633f54 100644
--- a/src/app/qgisapp.cpp
+++ b/src/app/qgisapp.cpp
@@ -6329,7 +6329,7 @@ void QgisApp::saveAsVectorFileGeneral( QgsVectorLayer* vlayer, bool symbologyOpt
 
 void QgisApp::checkForDeprecatedLabelsInProject()
 {
-  bool ok;
+  bool ok = false;
   QgsProject::instance()->readBoolEntry( "DeprecatedLabels", "/Enabled", false, &ok );
   if ( ok ) // project already flagged (regardless of project property value)
   {
diff --git a/src/app/qgsclipboard.cpp b/src/app/qgsclipboard.cpp
index 4ff6acf..84bc588 100644
--- a/src/app/qgsclipboard.cpp
+++ b/src/app/qgsclipboard.cpp
@@ -187,8 +187,17 @@ QgsFeatureList QgsClipboard::stringToFeatureList( const QString& string, const Q
 
   Q_FOREACH ( const QString& row, values )
   {
-    // Assume that it's just WKT for now.
-    QgsGeometry* geometry = QgsGeometry::fromWkt( row );
+    // Assume that it's just WKT for now. because GeoJSON is managed by
+    // previous QgsOgrUtils::stringToFeatureList call
+    // Get the first value of a \t separated list. WKT clipboard pasted
+    // feature has first element the WKT geom.
+    // This split is to fix te following issue: https://issues.qgis.org/issues/16870
+    // Value separators are set in generateClipboardText
+    QStringList fieldValues = row.split( '\t' );
+    if ( fieldValues.isEmpty() )
+      continue;
+
+    QgsGeometry *geometry = QgsGeometry::fromWkt( fieldValues[0] );
     if ( !geometry )
       continue;
 
diff --git a/src/core/qgsgml.cpp b/src/core/qgsgml.cpp
index 6f7f543..b77202d 100644
--- a/src/core/qgsgml.cpp
+++ b/src/core/qgsgml.cpp
@@ -485,6 +485,7 @@ void QgsGmlStreamingParser::startElement( const XML_Char* el, const XML_Char** a
   const int nsLen = ( pszSep ) ? ( int )( pszSep - el ) : 0;
   const int localNameLen = ( pszSep ) ? ( int )( elLen - nsLen ) - 1 : elLen;
   ParseMode theParseMode( mParseModeStack.isEmpty() ? none : mParseModeStack.top() );
+  int elDimension = 0;
 
   // Figure out if the GML namespace is GML_NAMESPACE or GML32_NAMESPACE
   if ( !mGMLNameSpaceURIPtr && pszSep )
@@ -543,14 +544,14 @@ void QgsGmlStreamingParser::startElement( const XML_Char* el, const XML_Char** a
     mParseModeStack.push( QgsGmlStreamingParser::posList );
     mCoorMode = QgsGmlStreamingParser::posList;
     mStringCash.clear();
-    if ( mDimension == 0 )
+    if ( elDimension == 0 )
     {
       QString srsDimension = readAttribute( "srsDimension", attr );
       bool ok;
       int dimension = srsDimension.toInt( &ok );
       if ( ok )
       {
-        mDimension = dimension;
+        elDimension = dimension;
       }
     }
   }
@@ -808,7 +809,7 @@ void QgsGmlStreamingParser::startElement( const XML_Char* el, const XML_Char** a
   if ( !mGeometryString.empty() )
     isGeom = true;
 
-  if ( mDimension == 0 && isGeom )
+  if ( elDimension == 0 && isGeom )
   {
     // srsDimension can also be set on the top geometry element
     // e.g. https://data.linz.govt.nz/services;key=XXXXXXXX/wfs?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=data.linz.govt.nz:layer-524
@@ -817,10 +818,16 @@ void QgsGmlStreamingParser::startElement( const XML_Char* el, const XML_Char** a
     int dimension = srsDimension.toInt( &ok );
     if ( ok )
     {
-      mDimension = dimension;
+      elDimension = dimension;
     }
   }
 
+  if ( elDimension != 0 )
+  {
+    mDimension = elDimension;
+  }
+  mDimensionStack.push( mDimension );
+
   if ( mEpsg == 0 && isGeom )
   {
     if ( readEpsgFromAttribute( mEpsg, attr ) != 0 )
@@ -847,6 +854,8 @@ void QgsGmlStreamingParser::endElement( const XML_Char* el )
   const int localNameLen = ( pszSep ) ? ( int )( elLen - nsLen ) - 1 : elLen;
   ParseMode theParseMode( mParseModeStack.isEmpty() ? none : mParseModeStack.top() );
 
+  mDimension = mDimensionStack.isEmpty() ? 0 : mDimensionStack.top() ;
+
   const bool isGMLNS = ( nsLen == mGMLNameSpaceURI.size() && mGMLNameSpaceURIPtr && memcmp( el, mGMLNameSpaceURIPtr, nsLen ) == 0 );
 
   if ( theParseMode == coordinate && isGMLNS && LOCALNAME_EQUALS( "coordinates" ) )
diff --git a/src/core/qgsgml.h b/src/core/qgsgml.h
index 2b5008a..7cd333f 100644
--- a/src/core/qgsgml.h
+++ b/src/core/qgsgml.h
@@ -289,7 +289,9 @@ class CORE_EXPORT QgsGmlStreamingParser
     QString mCoordinateSeparator;
     /** Tuple separator for coordinate strings. Usually " " */
     QString mTupleSeparator;
-    /** Number of dimensions in pos or posList */
+    /** Keep track about number of dimensions in pos or posList */
+    QStack<int> mDimensionStack;
+    /** Number of dimensions in pos or posList for the current geometry */
     int mDimension;
     /** Coordinates mode, coordinate or posList */
     ParseMode mCoorMode;
diff --git a/src/core/qgssnappingutils.cpp b/src/core/qgssnappingutils.cpp
index 3ab2d5f..f42fea9 100644
--- a/src/core/qgssnappingutils.cpp
+++ b/src/core/qgssnappingutils.cpp
@@ -609,7 +609,8 @@ void QgsSnappingUtils::readConfigFromProject()
   setSnapOnIntersections( QgsProject::instance()->readNumEntry( "Digitizing", "/IntersectionSnapping", 0 ) );
 
   //read snapping settings from project
-  bool snappingDefinedInProject, ok;
+  bool snappingDefinedInProject = false;
+  bool ok = false;
   QStringList layerIdList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingList", QStringList(), &snappingDefinedInProject );
   QStringList enabledList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingEnabledList", QStringList(), &ok );
   QStringList toleranceList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceList", QStringList(), &ok );
diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp
index 41ca9ae..1539a0b 100644
--- a/src/core/qgsvectorfilewriter.cpp
+++ b/src/core/qgsvectorfilewriter.cpp
@@ -825,7 +825,7 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                          << "AS_XYZ"
                          << "AS_XY"
                          << "AS_YX",
-                         "AS_XY", // Default value
+                         "", // Default value
                          true // Allow None
                        ) );
 
@@ -868,9 +868,21 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                          QObject::tr( "Override the type of shapefile created. "
                                       "Can be one of NULL for a simple .dbf file with no .shp file, POINT, "
                                       "ARC, POLYGON or MULTIPOINT for 2D, or POINTZ, ARCZ, POLYGONZ or "
-                                      "MULTIPOINTZ for 3D. Shapefiles with measure values are not supported, "
-                                      "nor are MULTIPATCH files." ),
-                         QStringList()
+                                      "MULTIPOINTZ for 3D;" ) +
+#if defined(GDAL_COMPUTE_VERSION) && GDAL_VERSION_NUM < GDAL_COMPUTE_VERSION(2,1,0)
+                         QObject::tr( " Shapefiles with measure values are not supported,"
+                                      " nor are MULTIPATCH files." ) +
+#endif
+#if defined(GDAL_COMPUTE_VERSION) && GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,1,0)
+                         QObject::tr( " POINTM, ARCM, POLYGONM or MULTIPOINTM for measured geometries"
+                                      " and POINTZM, ARCZM, POLYGONZM or MULTIPOINTZM for 3D measured"
+                                      " geometries." ) +
+#endif
+#if defined(GDAL_COMPUTE_VERSION) && GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,2,0)
+                         QObject::tr( " MULTIPATCH files are supported since GDAL 2.2." ) +
+#endif
+                         ""
+                         , QStringList()
                          << "NULL"
                          << "POINT"
                          << "ARC"
@@ -879,7 +891,21 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                          << "POINTZ"
                          << "ARCZ"
                          << "POLYGONZ"
-                         << "MULTIPOINTZ",
+                         << "MULTIPOINTZ"
+#if defined(GDAL_COMPUTE_VERSION) && GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,1,0)
+                         << "POINTM"
+                         << "ARCM"
+                         << "POLYGONM"
+                         << "MULTIPOINTM"
+                         << "POINTZM"
+                         << "ARCZM"
+                         << "POLYGONZM"
+                         << "MULTIPOINTZM"
+#endif
+#if defined(GDAL_COMPUTE_VERSION) && GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,2,0)
+                         << "MULTIPATCH"
+#endif
+                         << "",
                          QString(), // Default value
                          true  // Allow None
                        ) );
@@ -1001,7 +1027,7 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                                         "the foo_bar pattern, foo will be considered as the namespace "
                                         "of the element, and a <foo:bar> element will be written. "
                                         "Otherwise, elements will be written in the <ogr:> namespace." ),
-                           true  // Default value
+                           false // Default value
                          ) );
 
   datasetOptions.insert( "WRITE_HEADER_AND_FOOTER", new BoolOption(
@@ -1177,7 +1203,7 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
 
   layerOptions.insert( "GEOMETRY_NAME", new StringOption(
                          QObject::tr( "Name for the geometry column" ),
-                         "geometry"  // Default value
+                         "geom"  // Default value
                        ) );
 
 #if defined(GDAL_COMPUTE_VERSION) && GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,0,0)
@@ -1238,7 +1264,7 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
   datasetOptions.insert( "GPX_USE_EXTENSIONS", new BoolOption(
                            QObject::tr( "If GPX_USE_EXTENSIONS=YES is specified, "
                                         "extra fields will be written inside the <extensions> tag." ),
-                           true  // Default value
+                           false // Default value
                          ) );
 
   datasetOptions.insert( "GPX_EXTENSIONS_NS", new StringOption(
@@ -1329,8 +1355,16 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                            << "clampToGround"
                            << "relativeToGround"
                            << "absolute",
-                           "clampToGround" // Default value
+                           "relativeToGround"  // Default value
+                         ) );
+
+#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,2,0)
+  datasetOptions.insert( "DOCUMENT_ID", new StringOption(
+                           QObject::tr( "The DOCUMENT_ID datasource creation option can be used to specified "
+                                        "the id of the root <Document> node. The default value is root_doc." ),
+                           "root_doc"  // Default value
                          ) );
+#endif
 
   driverMetadata.insert( "KML",
                          MetaData(
@@ -1348,15 +1382,34 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
   datasetOptions.clear();
   layerOptions.clear();
 
-  layerOptions.insert( "SPATIAL_INDEX_MODE", new SetOption(
-                         QObject::tr( "Use this to turn on 'quick spatial index mode'. "
-                                      "In this mode writing files can be about 5 times faster, "
-                                      "but spatial queries can be up to 30 times slower." ),
-                         QStringList()
-                         << "QUICK",
-                         "", // Default value
-                         true // Allow None
+  datasetOptions.insert( "SPATIAL_INDEX_MODE", new SetOption(
+                           QObject::tr( "Use this to turn on 'quick spatial index mode'. "
+                                        "In this mode writing files can be about 5 times faster, "
+                                        "but spatial queries can be up to 30 times slower." ),
+                           QStringList()
+                           << "QUICK"
+                           << "OPTIMIZED",
+                           "QUICK", // Default value
+                           true // Allow None
+                         ) );
+
+#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,0,2)
+  datasetOptions.insert( "BLOCK_SIZE", new IntOption(
+                           QObject::tr( "(multiples of 512): Block size for .map files. Defaults "
+                                        "to 512. MapInfo 15.2 and above creates .tab files with a "
+                                        "blocksize of 16384 bytes. Any MapInfo version should be "
+                                        "able to handle block sizes from 512 to 32256." ),
+                           512
+                         ) );
+#endif
+#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,0,0)
+  layerOptions.insert( "BOUNDS", new StringOption(
+                         QObject::tr( "xmin,ymin,xmax,ymax: Define custom layer bounds to increase the "
+                                      "accuracy of the coordinates. Note: the geometry of written "
+                                      "features must be within the defined box." ),
+                         "" // Default value
                        ) );
+#endif
 
   driverMetadata.insert( "MapInfo File",
                          MetaData(
@@ -1478,7 +1531,7 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
   datasetOptions.insert( "RETURN_PRIMITIVES", new BoolOption(
                            QObject::tr( "Should all the low level geometry primitives be returned as special "
                                         "IsolatedNode, ConnectedNode, Edge and Face layers." ),
-                           true  // Default value
+                           false  // Default value
                          ) );
 
   datasetOptions.insert( "PRESERVE_EMPTY_NUMBERS", new BoolOption(
@@ -1498,7 +1551,7 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                            QObject::tr( "Should additional attributes relating features to their underlying "
                                         "geometric primitives be attached. These are the values of the FSPT group, "
                                         "and are primarily needed when doing S-57 to S-57 translations." ),
-                           true  // Default value
+                           false  // Default value
                          ) );
 
   datasetOptions.insert( "RECODE_BY_DSSI", new BoolOption(
@@ -1695,17 +1748,15 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
   datasetOptions.clear();
   layerOptions.clear();
 
-#if 0
   datasetOptions.insert( "HEADER", new StringOption(
                            QObject::tr( "Override the header file used - in place of header.dxf." ),
-                           ""  // Default value
+                           QLatin1String( "" )  // Default value
                          ) );
 
   datasetOptions.insert( "TRAILER", new StringOption(
                            QObject::tr( "Override the trailer file used - in place of trailer.dxf." ),
-                           ""  // Default value
+                           QLatin1String( "" )  // Default value
                          ) );
-#endif
 
   driverMetadata.insert( "DXF",
                          MetaData(
@@ -1731,14 +1782,20 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                            "GXT" // Default value
                          ) );
 
-#if 0
   datasetOptions.insert( "CONFIG", new StringOption(
                            QObject::tr( "path to the GCT : the GCT file describe the GeoConcept types definitions: "
                                         "In this file, every line must start with //# followed by a keyword. "
                                         "Lines starting with // are comments." ),
-                           ""  // Default value
+                           QLatin1String( "" )  // Default value
+                         ) );
+
+  datasetOptions.insert( "FEATURETYPE", new StringOption(
+                           QObject::tr( "defines the feature to be created. The TYPE corresponds to one of the Name "
+                                        "found in the GCT file for a type section. The SUBTYPE corresponds to one of "
+                                        "the Name found in the GCT file for a sub-type section within the previous "
+                                        "type section." ),
+                           QLatin1String( "" )  // Default value
                          ) );
-#endif
 
   driverMetadata.insert( "Geoconcept",
                          MetaData(
@@ -1766,7 +1823,7 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                          "SHAPE"  // Default value
                        ) );
 
-  layerOptions.insert( "OID_NAME", new StringOption(
+  layerOptions.insert( "FID", new StringOption(
                          QObject::tr( "Name of the OID column to create. Defaults to 'OBJECTID'." ),
                          "OBJECTID"  // Default value
                        ) );
@@ -1797,6 +1854,18 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                          false // Allow None
                        ) );
 
+  layerOptions.insert( "OGR_XLSX_HEADERS", new SetOption(
+                         QObject::tr( "By default, the driver will read the first lines of each sheet to detect "
+                                      "if the first line might be the name of columns. If set to FORCE, the "
+                                      "driver will consider the first default" ),
+                         QStringList()
+                         << "FORCE"
+                         << "DISABLE"
+                         << "AUTO",
+                         "AUTO", // Default value
+                         false // Allow None
+                       ) );
+
   driverMetadata.insert( "XLSX",
                          MetaData(
                            "MS Office Open XML spreadsheet",
@@ -1823,6 +1892,18 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
                          false // Allow None
                        ) );
 
+  layerOptions.insert( "OGR_ODS_HEADERS", new SetOption(
+                         QObject::tr( "By default, the driver will read the first lines of each sheet to detect "
+                                      "if the first line might be the name of columns. If set to FORCE, the "
+                                      "driver will consider the first default" ),
+                         QStringList()
+                         << "FORCE"
+                         << "DISABLE"
+                         << "AUTO",
+                         "AUTO", // Default value
+                         false // Allow None
+                       ) );
+
   driverMetadata.insert( "ODS",
                          MetaData(
                            "Open Document Spreadsheet",
diff --git a/src/core/qgsvectorlayercache.cpp b/src/core/qgsvectorlayercache.cpp
index 3eea570..af597b7 100644
--- a/src/core/qgsvectorlayercache.cpp
+++ b/src/core/qgsvectorlayercache.cpp
@@ -22,6 +22,7 @@
 QgsVectorLayerCache::QgsVectorLayerCache( QgsVectorLayer* layer, int cacheSize, QObject* parent )
     : QObject( parent )
     , mLayer( layer )
+    , mCacheGeometry( true )
     , mFullCache( false )
 {
   mCache.setMaxCost( cacheSize );
diff --git a/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp b/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp
index f5dc616..971053b 100644
--- a/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp
+++ b/src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp
@@ -507,6 +507,14 @@ bool QgsInvertedPolygonRenderer::willRenderFeature( QgsFeature& feat, QgsRenderC
   return mSubRenderer->willRenderFeature( feat, context );
 }
 
+QgsLegendSymbolListV2 QgsInvertedPolygonRenderer::legendSymbolItemsV2() const
+{
+  if ( !mSubRenderer )
+    return QgsFeatureRendererV2::legendSymbolItemsV2();
+
+  return mSubRenderer->legendSymbolItemsV2();
+}
+
 QgsInvertedPolygonRenderer* QgsInvertedPolygonRenderer::convertFromRenderer( const QgsFeatureRendererV2 *renderer )
 {
   if ( renderer->type() == "invertedPolygonRenderer" )
diff --git a/src/core/symbology-ng/qgsinvertedpolygonrenderer.h b/src/core/symbology-ng/qgsinvertedpolygonrenderer.h
index ad68773..947981b 100644
--- a/src/core/symbology-ng/qgsinvertedpolygonrenderer.h
+++ b/src/core/symbology-ng/qgsinvertedpolygonrenderer.h
@@ -109,6 +109,8 @@ class CORE_EXPORT QgsInvertedPolygonRenderer : public QgsFeatureRendererV2
      */
     virtual bool willRenderFeature( QgsFeature& feat, QgsRenderContext& context ) override;
 
+    virtual QgsLegendSymbolListV2 legendSymbolItemsV2() const override;
+
     /** Creates a renderer out of an XML, for loading*/
     static QgsFeatureRendererV2* create( QDomElement& element );
 
diff --git a/src/customwidgets/CMakeLists.txt b/src/customwidgets/CMakeLists.txt
index f0af869..0d71a36 100644
--- a/src/customwidgets/CMakeLists.txt
+++ b/src/customwidgets/CMakeLists.txt
@@ -114,6 +114,7 @@ INCLUDE_DIRECTORIES(
 )
 INCLUDE_DIRECTORIES(SYSTEM
   ${GEOS_INCLUDE_DIR}
+  ${QSCINTILLA_INCLUDE_DIR}
   ${Qt5UiPlugin_INCLUDE_DIRS} # For Qt5
   ${Qt5Designer_INCLUDE_DIRS} # For Qt5
   ${QT_QTDESIGNER_INCLUDE_DIR} # For Qt4
diff --git a/src/gui/editorwidgets/core/qgseditorwidgetwrapper.h b/src/gui/editorwidgets/core/qgseditorwidgetwrapper.h
index ce3a347..b4ddda0 100644
--- a/src/gui/editorwidgets/core/qgseditorwidgetwrapper.h
+++ b/src/gui/editorwidgets/core/qgseditorwidgetwrapper.h
@@ -103,7 +103,7 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
      *
      * @param enabled  Enable or Disable?
      */
-    void setEnabled( bool enabled ) override;
+    virtual void setEnabled( bool enabled ) override;
 
     /** Sets the widget to display in an indeterminate "mixed value" state.
      * @note added in QGIS 2.16
diff --git a/src/gui/editorwidgets/qgsrelationreferencewidget.cpp b/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
index d4eab9d..0d91c98 100644
--- a/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
+++ b/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
@@ -521,7 +521,7 @@ void QgsRelationReferenceWidget::init()
       attributes << mReferencedLayer->fieldNameIndex( attr );
 
     layerCache->setCacheSubsetOfAttributes( attributes );
-    mMasterModel = new QgsAttributeTableModel( layerCache );
+    mMasterModel = new QgsAttributeTableModel( layerCache, this );
     mMasterModel->setRequest( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( requestedAttrs.toList(), mReferencedLayer->fields() ) );
     mFilterModel = new QgsAttributeTableFilterModel( mCanvas, mMasterModel, mMasterModel );
     mFeatureListModel = new QgsFeatureListModel( mFilterModel, this );
diff --git a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp
index e5bc484..a1b42f2 100644
--- a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp
@@ -43,6 +43,7 @@ QgsValueRelationWidgetWrapper::QgsValueRelationWidgetWrapper( QgsVectorLayer* vl
     , mListWidget( nullptr )
     , mLineEdit( nullptr )
     , mLayer( nullptr )
+    , mUpdating( false )
 {
 }
 
@@ -248,3 +249,26 @@ void QgsValueRelationWidgetWrapper::showIndeterminateState()
     whileBlocking( mLineEdit )->clear();
   }
 }
+
+void QgsValueRelationWidgetWrapper::setEnabled( bool enabled )
+{
+  if ( mUpdating )
+    return;
+
+  if ( mListWidget )
+  {
+    mUpdating = true;
+    for ( int i = 0; i < mListWidget->count(); ++i )
+    {
+      QListWidgetItem *item = mListWidget->item( i );
+
+      if ( enabled )
+        item->setFlags( item->flags() | Qt::ItemIsEnabled );
+      else
+        item->setFlags( item->flags() & ~Qt::ItemIsEnabled );
+    }
+    mUpdating = false;
+  }
+  else
+    QgsEditorWidgetWrapper::setEnabled( enabled );
+}
diff --git a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.h b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.h
index 9c40566..e5f2e0e 100644
--- a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.h
+++ b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.h
@@ -68,6 +68,8 @@ class GUI_EXPORT QgsValueRelationWidgetWrapper : public QgsEditorWidgetWrapper
     static ValueRelationCache createCache( const QgsEditorWidgetConfig& config );
     void showIndeterminateState() override;
 
+    void setEnabled( bool enabled ) override;
+
   protected:
     QWidget* createWidget( QWidget* parent ) override;
     void initWidget( QWidget* editor ) override;
@@ -84,7 +86,10 @@ class GUI_EXPORT QgsValueRelationWidgetWrapper : public QgsEditorWidgetWrapper
     ValueRelationCache mCache;
     QgsVectorLayer* mLayer;
 
+    bool mUpdating;
+
     friend class QgsValueRelationWidgetFactory;
+    friend class TestQgsValueRelationWidgetWrapper;
 };
 
 Q_DECLARE_METATYPE( QgsValueRelationWidgetWrapper::ValueRelationCache )
diff --git a/src/providers/oracle/qgsoracleprovider.cpp b/src/providers/oracle/qgsoracleprovider.cpp
index e77e09f..f9270db 100644
--- a/src/providers/oracle/qgsoracleprovider.cpp
+++ b/src/providers/oracle/qgsoracleprovider.cpp
@@ -1226,7 +1226,7 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist )
     return false;
 
   bool returnvalue = true;
-
+  bool fetchNewFid = getWorkspace().isEmpty() || getWorkspace().toUpper() == "LIVE";
 
   QSqlDatabase db( *mConnection );
 
@@ -1394,26 +1394,29 @@ bool QgsOracleProvider::addFeatures( QgsFeatureList &flist )
       if ( !ins.exec() )
         throw OracleException( tr( "Could not insert feature %1" ).arg( features->id() ), ins );
 
-      if ( mPrimaryKeyType == pktRowId )
-      {
-        features->setFeatureId( mShared->lookupFid( QList<QVariant>() << QVariant( ins.lastInsertId() ) ) );
-        QgsDebugMsgLevel( QString( "new fid=%1" ).arg( features->id() ), 4 );
-      }
-      else if ( mPrimaryKeyType == pktInt || mPrimaryKeyType == pktFidMap )
+      if ( fetchNewFid )
       {
-        getfid.addBindValue( QVariant( ins.lastInsertId() ) );
-        if ( !getfid.exec() || !getfid.next() )
-          throw OracleException( tr( "Could not retrieve feature id %1" ).arg( features->id() ), getfid );
-
-        int col = 0;
-        Q_FOREACH ( int idx, mPrimaryKeyAttrs )
+        if ( mPrimaryKeyType == pktRowId )
         {
-          const QgsField &fld = field( idx );
+          features->setFeatureId( mShared->lookupFid( QList<QVariant>() << QVariant( ins.lastInsertId() ) ) );
+          QgsDebugMsgLevel( QString( "new fid=%1" ).arg( features->id() ), 4 );
+        }
+        else if ( mPrimaryKeyType == pktInt || mPrimaryKeyType == pktFidMap )
+        {
+          getfid.addBindValue( QVariant( ins.lastInsertId() ) );
+          if ( !getfid.exec() || !getfid.next() )
+            throw OracleException( tr( "Could not retrieve feature id %1" ).arg( features->id() ), getfid );
 
-          QVariant v = getfid.value( col++ );
-          if ( v.type() != fld.type() )
-            v = QgsVectorDataProvider::convertValue( fld.type(), v.toString() );
-          features->setAttribute( idx, v );
+          int col = 0;
+          Q_FOREACH ( int idx, mPrimaryKeyAttrs )
+          {
+            const QgsField &fld = field( idx );
+
+            QVariant v = getfid.value( col++ );
+            if ( v.type() != fld.type() )
+              v = QgsVectorDataProvider::convertValue( fld.type(), v.toString() );
+            features->setAttribute( idx, v );
+          }
         }
       }
     }
diff --git a/src/server/qgswfsserver.cpp b/src/server/qgswfsserver.cpp
index 1544407..8a78d85 100644
--- a/src/server/qgswfsserver.cpp
+++ b/src/server/qgswfsserver.cpp
@@ -445,7 +445,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
     QDomElement queryElem;
     for ( int i = 0; i < queryNodes.size(); i++ )
     {
-      queryElem = queryNodes.at( 0 ).toElement();
+      queryElem = queryNodes.at( i ).toElement();
       mTypeName = queryElem.attribute( "typeName", "" );
       if ( mTypeName.contains( ":" ) )
       {
@@ -455,7 +455,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
     }
     for ( int i = 0; i < queryNodes.size(); i++ )
     {
-      queryElem = queryNodes.at( 0 ).toElement();
+      queryElem = queryNodes.at( i ).toElement();
       mTypeName = queryElem.attribute( "typeName", "" );
       if ( mTypeName.contains( ":" ) )
       {
diff --git a/src/server/qgswmsserver.cpp b/src/server/qgswmsserver.cpp
index 705a149..1c5c8ca 100644
--- a/src/server/qgswmsserver.cpp
+++ b/src/server/qgswmsserver.cpp
@@ -2362,6 +2362,8 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,
       break;
     }
 
+    renderContext.expressionContext().setFeature( feature );
+
     if ( layer->wkbType() != QGis::WKBNoGeometry && ! searchRect.isEmpty() )
     {
       if ( !r2 )
@@ -2369,9 +2371,6 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,
         continue;
       }
 
-      renderContext.expressionContext().setFeature( feature );
-
-
       //check if feature is rendered at all
       bool render = r2->willRenderFeature( feature, renderContext );
       if ( !render )
diff --git a/tests/src/app/testqgisappclipboard.cpp b/tests/src/app/testqgisappclipboard.cpp
index ca286c3..cf87a9b 100644
--- a/tests/src/app/testqgisappclipboard.cpp
+++ b/tests/src/app/testqgisappclipboard.cpp
@@ -215,6 +215,31 @@ void TestQgisAppClipboard::pasteWkt()
   point = dynamic_cast< QgsPointV2* >( features.at( 1 ).constGeometry()->geometry() );
   QCOMPARE( point->x(), 111.0 );
   QCOMPARE( point->y(), 30.0 );
+
+  // be sure parsing does not consider attached parameters that
+  // can change geometryType as in https://issues.qgis.org/issues/16870
+  mQgisApp->clipboard()->setText( "POINT (111 30)\t GoodFieldValue\nPOINT (125 10)\t(WrongFieldValue)" );
+
+  features = mQgisApp->clipboard()->copyOf();
+  QCOMPARE( features.length(), 2 );
+
+  QVERIFY( features.at( 0 ).constGeometry() && !features.at( 0 ).constGeometry()->isEmpty() );
+  QCOMPARE( features.at( 0 ).constGeometry()->geometry()->wkbType(), QgsWKBTypes::Point );
+  const QgsGeometry *featureGeom = features.at( 0 ).constGeometry();
+  point = dynamic_cast< QgsPointV2 * >( featureGeom->geometry() );
+  QCOMPARE( point->x(), 111.0 );
+  QCOMPARE( point->y(), 30.0 );
+
+  QVERIFY( features.at( 1 ).constGeometry() && !features.at( 1 ).constGeometry()->isEmpty() );
+  QCOMPARE( features.at( 1 ).constGeometry()->geometry()->wkbType(), QgsWKBTypes::Point );
+  point = dynamic_cast< QgsPointV2 * >( features.at( 1 ).constGeometry()->geometry() );
+  QCOMPARE( point->x(), 125.0 );
+  QCOMPARE( point->y(), 10.0 );
+
+  // only fields => no geom so no feature list is returned
+  mQgisApp->clipboard()->setText( "MNL\t11\t282\tkm\t\nMNL\t11\t347.80000000000001\tkm\t" );
+  features = mQgisApp->clipboard()->copyOf();
+  QCOMPARE( features.length(), 0 );
 }
 
 void TestQgisAppClipboard::pasteGeoJson()
diff --git a/tests/src/core/testqgsinvertedpolygonrenderer.cpp b/tests/src/core/testqgsinvertedpolygonrenderer.cpp
index c253e82..62ffba9 100644
--- a/tests/src/core/testqgsinvertedpolygonrenderer.cpp
+++ b/tests/src/core/testqgsinvertedpolygonrenderer.cpp
@@ -28,6 +28,8 @@
 #include <qgsapplication.h>
 #include <qgsproviderregistry.h>
 #include <qgsmaplayerregistry.h>
+#include "qgsrendererv2.h"
+
 //qgis test includes
 #include "qgsmultirenderchecker.h"
 
@@ -49,6 +51,7 @@ class TestQgsInvertedPolygon : public QObject
 
     void singleSubRenderer();
     void graduatedSubRenderer();
+    void checkSymbolItem();
     void preprocess();
     void projectionTest();
 #if defined(GDAL_VERSION_NUM) && GDAL_VERSION_MAJOR >= 2
@@ -130,6 +133,15 @@ void TestQgsInvertedPolygon::graduatedSubRenderer()
   QVERIFY( imageCheck( "inverted_polys_graduated" ) );
 }
 
+void TestQgsInvertedPolygon::checkSymbolItem()
+{
+  QVERIFY( setQml( mpPolysLayer, "inverted_polys_rule.qml" ) );
+  QString firstRuleKey = mpPolysLayer->rendererV2()->legendSymbolItemsV2().first().ruleKey();
+  QVERIFY( mpPolysLayer->rendererV2()->legendSymbolItemChecked( firstRuleKey ) );
+  mpPolysLayer->rendererV2()->checkLegendSymbolItem( firstRuleKey, false );
+  QVERIFY( !mpPolysLayer->rendererV2()->legendSymbolItemChecked( firstRuleKey ) );
+}
+
 void TestQgsInvertedPolygon::preprocess()
 {
   // FIXME will have to find some overlapping polygons
diff --git a/tests/src/gui/CMakeLists.txt b/tests/src/gui/CMakeLists.txt
index e66aba6..9e5ac2f 100644
--- a/tests/src/gui/CMakeLists.txt
+++ b/tests/src/gui/CMakeLists.txt
@@ -144,4 +144,4 @@ ADD_QGIS_TEST(spinbox testqgsspinbox.cpp)
 ADD_QGIS_TEST(sqlcomposerdialog testqgssqlcomposerdialog.cpp)
 ADD_QGIS_TEST(filedownloader testqgsfiledownloader.cpp)
 ADD_QGIS_TEST(composergui testqgscomposergui.cpp)
-
+ADD_QGIS_TEST(valuerelationwidgetwrapper testqgsvaluerelationwidgetwrapper.cpp)
diff --git a/tests/src/gui/testqgsvaluerelationwidgetwrapper.cpp b/tests/src/gui/testqgsvaluerelationwidgetwrapper.cpp
new file mode 100644
index 0000000..faaa904
--- /dev/null
+++ b/tests/src/gui/testqgsvaluerelationwidgetwrapper.cpp
@@ -0,0 +1,107 @@
+/***************************************************************************
+    testqgsvaluerelationwidgetwrapper.cpp
+     --------------------------------------
+    Date                 : 21 07 2017
+    Copyright            : (C) 2017 Paul Blottiere
+    Email                : paul dot blottiere at oslandia dot com
+ ***************************************************************************
+ *                                                                         *
+ *   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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#include <QtTest/QtTest>
+#include <QScrollBar>
+
+#include <editorwidgets/core/qgseditorwidgetregistry.h>
+#include <qgsapplication.h>
+#include <qgsproject.h>
+#include <qgsvectorlayer.h>
+#include "qgseditorwidgetwrapper.h"
+#include <editorwidgets/qgsvaluerelationwidgetwrapper.h>
+
+class TestQgsValueRelationWidgetWrapper : public QObject
+{
+    Q_OBJECT
+  public:
+    TestQgsValueRelationWidgetWrapper() {}
+
+  private slots:
+    void initTestCase(); // will be called before the first testfunction is executed.
+    void cleanupTestCase(); // will be called after the last testfunction was executed.
+    void init(); // will be called before each testfunction is executed.
+    void cleanup(); // will be called after every testfunction.
+
+    void testScrollBarUnlocked();
+};
+
+void TestQgsValueRelationWidgetWrapper::initTestCase()
+{
+  QgsApplication::init();
+  QgsApplication::initQgis();
+  QgsEditorWidgetRegistry::initEditors();
+}
+
+void TestQgsValueRelationWidgetWrapper::cleanupTestCase()
+{
+  QgsApplication::exitQgis();
+}
+
+void TestQgsValueRelationWidgetWrapper::init()
+{
+}
+
+void TestQgsValueRelationWidgetWrapper::cleanup()
+{
+}
+
+void TestQgsValueRelationWidgetWrapper::testScrollBarUnlocked()
+{
+  // create a vector layer
+  QgsVectorLayer vl1( QString( "LineString?crs=epsg:3111&field=pk:int&field=fk|:int" ), QString( "vl1" ), QString( "memory" ) );
+
+  // build a value relation widget wrapper
+  QListWidget lw;
+  QWidget editor;
+  QgsValueRelationWidgetWrapper w( &vl1, 0, &editor, nullptr );
+  w.setEnabled( true );
+  w.initWidget( &lw );
+
+  // add an item virtually
+  QListWidgetItem item;
+  item.setText( "MyText" );
+  w.mListWidget->addItem( &item );
+  QCOMPARE( w.mListWidget->item( 0 )->text(), QString( "MyText" ) );
+
+  // when the widget wrapper is enabled, the container should be enabled
+  // as well as items
+  w.setEnabled( true );
+
+  QCOMPARE( w.widget()->isEnabled(), true );
+
+  bool itemEnabled = w.mListWidget->item( 0 )->flags() & Qt::ItemIsEnabled;
+  QCOMPARE( itemEnabled, true );
+
+  // when the widget wrapper is disabled, the container should still be enabled
+  // to keep the scrollbar available but items should be disabled to avoid
+  // edition
+  w.setEnabled( false );
+
+  itemEnabled = w.mListWidget->item( 0 )->flags() & Qt::ItemIsEnabled;
+  QCOMPARE( itemEnabled, false );
+
+  QCOMPARE( w.widget()->isEnabled(), true );
+
+  // recheck after re-enabled
+  w.setEnabled( true );
+
+  QCOMPARE( w.widget()->isEnabled(), true );
+  itemEnabled = w.mListWidget->item( 0 )->flags() & Qt::ItemIsEnabled;
+  QCOMPARE( itemEnabled, true );
+}
+
+QTEST_MAIN( TestQgsValueRelationWidgetWrapper )
+#include "testqgsvaluerelationwidgetwrapper.moc"
diff --git a/tests/src/python/CMakeLists.txt b/tests/src/python/CMakeLists.txt
index 770455b..6b3d443 100644
--- a/tests/src/python/CMakeLists.txt
+++ b/tests/src/python/CMakeLists.txt
@@ -152,6 +152,7 @@ ENDIF (WITH_APIDOC)
 
 IF (WITH_SERVER)
   ADD_PYTHON_TEST(PyQgsServer test_qgsserver.py)
+  ADD_PYTHON_TEST(PyQgsServerTwoLayer test_qgsserver_two_layers.py)
   ADD_PYTHON_TEST(PyQgsServerAccessControl test_qgsserver_accesscontrol.py)
   ADD_PYTHON_TEST(PyQgsServerWFST test_qgsserver_wfst.py)
   ADD_PYTHON_TEST(PyQgsOfflineEditingWFS test_offline_editing_wfs.py)
diff --git a/tests/src/python/test_qgsserver_two_layers.py b/tests/src/python/test_qgsserver_two_layers.py
new file mode 100644
index 0000000..f41b2dd
--- /dev/null
+++ b/tests/src/python/test_qgsserver_two_layers.py
@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+"""QGIS Unit tests for QgsServer.
+
+.. note:: 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.
+
+"""
+__copyright__ = 'Copyright 2017, The QGIS Project'
+# This will get replaced with a git SHA1 when you do a git archive
+__revision__ = '$Format:%H$'
+
+import os
+import re
+import urllib
+from mimetools import Message
+from StringIO import StringIO
+from qgis.server import QgsServer
+from qgis.testing import unittest
+from utilities import unitTestDataPath
+
+# Strip path and content length because path may vary
+RE_STRIP_PATH = r'MAP=[^&]+|Content-Length: \d+|<Attribute typeName="[^>]+'
+
+
+class TestQgsServerTwoLayer(unittest.TestCase):
+
+    def setUp(self):
+        """Create the server instance"""
+        self.testdata_path = unitTestDataPath('qgis_server')
+
+        env_vars = ['QUERY_STRING', 'QGIS_PROJECT_FILE']
+        for ev in env_vars:
+            try:
+                del os.environ[ev]
+            except KeyError:
+                pass
+        self.server = QgsServer()
+
+    def assert_headers(self, header, body):
+        headers = Message(StringIO(header))
+        if 'content-length' in headers:
+            content_length = int(headers['content-length'])
+            body_length = len(body)
+            self.assertEqual(content_length, body_length, msg="Header reported content-length: %d Actual body length was: %d" % (content_length, body_length))
+
+    # WFS tests
+    def result_compare(self, file_name, error_msg_header, header, body):
+        self.assert_headers(header, body)
+        response = header + body
+        f = open(os.path.join(self.testdata_path, file_name))
+        expected = f.read()
+        f.close()
+        # Store the output for debug or to regenerate the reference documents:
+        """
+        f = open(os.path.dirname(__file__) + '/wfs_getfeature_' +  requestid + '_expected.txt', 'w+')
+        f.write(expected)
+        f.close()
+        f = open(os.path.dirname(__file__) + '/wfs_getfeature_' +  requestid + '_response.txt', 'w+')
+        f.write(response)
+        f.close()
+        """
+        response = re.sub(RE_STRIP_PATH, '', response)
+        expected = re.sub(RE_STRIP_PATH, '', expected)
+        self.assertEqual(response, expected, msg=u"%s\n Expected:\n%s\n\n Response:\n%s"
+                                                 % (error_msg_header,
+                                                    unicode(expected, errors='replace'),
+                                                    unicode(response, errors='replace')))
+
+    def wfs_getfeature_post_compare(self, requestid, request):
+        project = os.path.join(self.testdata_path, "test_project_two_layers.qgs")
+        self.assertTrue(os.path.exists(project), msg=u"Project file not found: %s" % (project))
+
+        query_string = 'MAP={}'.format(urllib.quote(project))
+        self.server.putenv("REQUEST_METHOD", "POST")
+        self.server.putenv("REQUEST_BODY", request)
+        header, body = self.server.handleRequest(query_string)
+        self.server.putenv("REQUEST_METHOD", '')
+        self.server.putenv("REQUEST_BODY", '')
+
+        self.result_compare(
+            'wfs_getfeature_{}.txt'.format(requestid),
+            "GetFeature in POST for '{}' failed.".format(requestid),
+            header, body,
+        )
+
+    def test_getfeature_post_multiple_layer(self):
+        template = """<?xml version="1.0" encoding="UTF-8"?>
+<wfs:GetFeature service="WFS" version="1.1.0">
+ <wfs:Query typeName="secondlayer" xmlns:feature="http://www.qgis.org/gml">
+    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+      <ogc:BBOX>
+        <ogc:PropertyName>geometry</ogc:PropertyName>
+        <gml:Envelope xmlns:gml="http://www.opengis.net/gml">
+          <gml:lowerCorner>8 44</gml:lowerCorner>
+          <gml:upperCorner>9 45</gml:upperCorner>
+        </gml:Envelope>
+      </ogc:BBOX>
+    </ogc:Filter>
+  </wfs:Query>
+ <wfs:Query typeName="testlayer" xmlns:feature="http://www.qgis.org/gml">
+    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+      <ogc:BBOX>
+        <ogc:PropertyName>geometry</ogc:PropertyName>
+        <gml:Envelope xmlns:gml="http://www.opengis.net/gml">
+          <gml:lowerCorner>8 44</gml:lowerCorner>
+          <gml:upperCorner>9 45</gml:upperCorner>
+        </gml:Envelope>
+      </ogc:BBOX>
+    </ogc:Filter>
+  </wfs:Query>
+</wfs:GetFeature>
+"""
+        self.wfs_getfeature_post_compare('multiple', template)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tests/testdata/inverted_polys_rule.qml b/tests/testdata/inverted_polys_rule.qml
new file mode 100644
index 0000000..7c91a92
--- /dev/null
+++ b/tests/testdata/inverted_polys_rule.qml
@@ -0,0 +1,297 @@
+<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
+<qgis version="2.18.9" simplifyAlgorithm="0" minimumScale="0" maximumScale="1e+08" simplifyDrawingHints="1" minLabelScale="0" maxLabelScale="1e+08" simplifyDrawingTol="1" readOnly="0" simplifyMaxScale="1" hasScaleBasedVisibilityFlag="0" simplifyLocal="1" scaleBasedLabelVisibilityFlag="0">
+  <edittypes>
+    <edittype widgetv2type="TextEdit" name="Name">
+      <widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
+    </edittype>
+    <edittype widgetv2type="TextEdit" name="Value">
+      <widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
+    </edittype>
+  </edittypes>
+  <renderer-v2 forceraster="0" preprocessing="0" type="invertedPolygonRenderer" enableorderby="0">
+    <renderer-v2 forceraster="0" symbollevels="0" type="RuleRenderer" enableorderby="0">
+      <rules key="{7c47ddbb-77ed-4795-a788-47dfd5a912e4}">
+        <rule filter="Value = 7" key="{579517cb-b8c8-49a1-8580-00241734f728}" symbol="0" label="Seven"/>
+        <rule filter="Value = 10" key="{937affbb-2809-4f1a-868b-d5fa8e995494}" symbol="1" label="Ten"/>
+      </rules>
+      <symbols>
+        <symbol alpha="1" clip_to_extent="1" type="fill" name="0">
+          <layer pass="0" class="SimpleFill" locked="0">
+            <prop k="border_width_map_unit_scale" v="0,0,0,0,0,0"/>
+            <prop k="color" v="163,163,163,255"/>
+            <prop k="joinstyle" v="bevel"/>
+            <prop k="offset" v="0,0"/>
+            <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+            <prop k="offset_unit" v="MM"/>
+            <prop k="outline_color" v="163,163,163,255"/>
+            <prop k="outline_style" v="solid"/>
+            <prop k="outline_width" v="0.26"/>
+            <prop k="outline_width_unit" v="MM"/>
+            <prop k="style" v="solid"/>
+          </layer>
+        </symbol>
+        <symbol alpha="1" clip_to_extent="1" type="fill" name="1">
+          <layer pass="0" class="SimpleFill" locked="0">
+            <prop k="border_width_map_unit_scale" v="0,0,0,0,0,0"/>
+            <prop k="color" v="255,255,255,255"/>
+            <prop k="joinstyle" v="bevel"/>
+            <prop k="offset" v="0,0"/>
+            <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+            <prop k="offset_unit" v="MM"/>
+            <prop k="outline_color" v="255,255,255,255"/>
+            <prop k="outline_style" v="solid"/>
+            <prop k="outline_width" v="0.26"/>
+            <prop k="outline_width_unit" v="MM"/>
+            <prop k="style" v="solid"/>
+          </layer>
+        </symbol>
+      </symbols>
+    </renderer-v2>
+  </renderer-v2>
+  <labeling type="simple"/>
+  <customproperties>
+    <property key="embeddedWidgets/count" value="0"/>
+    <property key="labeling" value="pal"/>
+    <property key="labeling/addDirectionSymbol" value="false"/>
+    <property key="labeling/angleOffset" value="0"/>
+    <property key="labeling/blendMode" value="0"/>
+    <property key="labeling/bufferBlendMode" value="0"/>
+    <property key="labeling/bufferColorA" value="255"/>
+    <property key="labeling/bufferColorB" value="255"/>
+    <property key="labeling/bufferColorG" value="255"/>
+    <property key="labeling/bufferColorR" value="255"/>
+    <property key="labeling/bufferDraw" value="false"/>
+    <property key="labeling/bufferJoinStyle" value="128"/>
+    <property key="labeling/bufferNoFill" value="false"/>
+    <property key="labeling/bufferSize" value="1"/>
+    <property key="labeling/bufferSizeInMapUnits" value="false"/>
+    <property key="labeling/bufferSizeMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/bufferTransp" value="0"/>
+    <property key="labeling/centroidInside" value="false"/>
+    <property key="labeling/centroidWhole" value="false"/>
+    <property key="labeling/decimals" value="3"/>
+    <property key="labeling/displayAll" value="false"/>
+    <property key="labeling/dist" value="0"/>
+    <property key="labeling/distInMapUnits" value="false"/>
+    <property key="labeling/distMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/drawLabels" value="false"/>
+    <property key="labeling/enabled" value="false"/>
+    <property key="labeling/fieldName" value=""/>
+    <property key="labeling/fitInPolygonOnly" value="false"/>
+    <property key="labeling/fontCapitals" value="0"/>
+    <property key="labeling/fontFamily" value="Cantarell"/>
+    <property key="labeling/fontItalic" value="false"/>
+    <property key="labeling/fontLetterSpacing" value="0"/>
+    <property key="labeling/fontLimitPixelSize" value="false"/>
+    <property key="labeling/fontMaxPixelSize" value="10000"/>
+    <property key="labeling/fontMinPixelSize" value="3"/>
+    <property key="labeling/fontSize" value="11"/>
+    <property key="labeling/fontSizeInMapUnits" value="false"/>
+    <property key="labeling/fontSizeMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/fontStrikeout" value="false"/>
+    <property key="labeling/fontUnderline" value="false"/>
+    <property key="labeling/fontWeight" value="50"/>
+    <property key="labeling/fontWordSpacing" value="0"/>
+    <property key="labeling/formatNumbers" value="false"/>
+    <property key="labeling/isExpression" value="true"/>
+    <property key="labeling/labelOffsetInMapUnits" value="true"/>
+    <property key="labeling/labelOffsetMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/labelPerPart" value="false"/>
+    <property key="labeling/leftDirectionSymbol" value="<"/>
+    <property key="labeling/limitNumLabels" value="false"/>
+    <property key="labeling/maxCurvedCharAngleIn" value="25"/>
+    <property key="labeling/maxCurvedCharAngleOut" value="-25"/>
+    <property key="labeling/maxNumLabels" value="2000"/>
+    <property key="labeling/mergeLines" value="false"/>
+    <property key="labeling/minFeatureSize" value="0"/>
+    <property key="labeling/multilineAlign" value="4294967295"/>
+    <property key="labeling/multilineHeight" value="1"/>
+    <property key="labeling/namedStyle" value="Regular"/>
+    <property key="labeling/obstacle" value="true"/>
+    <property key="labeling/obstacleFactor" value="1"/>
+    <property key="labeling/obstacleType" value="0"/>
+    <property key="labeling/offsetType" value="0"/>
+    <property key="labeling/placeDirectionSymbol" value="0"/>
+    <property key="labeling/placement" value="1"/>
+    <property key="labeling/placementFlags" value="10"/>
+    <property key="labeling/plussign" value="false"/>
+    <property key="labeling/predefinedPositionOrder" value="TR,TL,BR,BL,R,L,TSR,BSR"/>
+    <property key="labeling/preserveRotation" value="true"/>
+    <property key="labeling/previewBkgrdColor" value="#ffffff"/>
+    <property key="labeling/priority" value="5"/>
+    <property key="labeling/quadOffset" value="4"/>
+    <property key="labeling/repeatDistance" value="0"/>
+    <property key="labeling/repeatDistanceMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/repeatDistanceUnit" value="1"/>
+    <property key="labeling/reverseDirectionSymbol" value="false"/>
+    <property key="labeling/rightDirectionSymbol" value=">"/>
+    <property key="labeling/scaleMax" value="10000000"/>
+    <property key="labeling/scaleMin" value="1"/>
+    <property key="labeling/scaleVisibility" value="false"/>
+    <property key="labeling/shadowBlendMode" value="6"/>
+    <property key="labeling/shadowColorB" value="0"/>
+    <property key="labeling/shadowColorG" value="0"/>
+    <property key="labeling/shadowColorR" value="0"/>
+    <property key="labeling/shadowDraw" value="false"/>
+    <property key="labeling/shadowOffsetAngle" value="135"/>
+    <property key="labeling/shadowOffsetDist" value="1"/>
+    <property key="labeling/shadowOffsetGlobal" value="true"/>
+    <property key="labeling/shadowOffsetMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/shadowOffsetUnits" value="1"/>
+    <property key="labeling/shadowRadius" value="1.5"/>
+    <property key="labeling/shadowRadiusAlphaOnly" value="false"/>
+    <property key="labeling/shadowRadiusMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/shadowRadiusUnits" value="1"/>
+    <property key="labeling/shadowScale" value="100"/>
+    <property key="labeling/shadowTransparency" value="30"/>
+    <property key="labeling/shadowUnder" value="0"/>
+    <property key="labeling/shapeBlendMode" value="0"/>
+    <property key="labeling/shapeBorderColorA" value="255"/>
+    <property key="labeling/shapeBorderColorB" value="128"/>
+    <property key="labeling/shapeBorderColorG" value="128"/>
+    <property key="labeling/shapeBorderColorR" value="128"/>
+    <property key="labeling/shapeBorderWidth" value="0"/>
+    <property key="labeling/shapeBorderWidthMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/shapeBorderWidthUnits" value="1"/>
+    <property key="labeling/shapeDraw" value="false"/>
+    <property key="labeling/shapeFillColorA" value="255"/>
+    <property key="labeling/shapeFillColorB" value="255"/>
+    <property key="labeling/shapeFillColorG" value="255"/>
+    <property key="labeling/shapeFillColorR" value="255"/>
+    <property key="labeling/shapeJoinStyle" value="64"/>
+    <property key="labeling/shapeOffsetMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/shapeOffsetUnits" value="1"/>
+    <property key="labeling/shapeOffsetX" value="0"/>
+    <property key="labeling/shapeOffsetY" value="0"/>
+    <property key="labeling/shapeRadiiMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/shapeRadiiUnits" value="1"/>
+    <property key="labeling/shapeRadiiX" value="0"/>
+    <property key="labeling/shapeRadiiY" value="0"/>
+    <property key="labeling/shapeRotation" value="0"/>
+    <property key="labeling/shapeRotationType" value="0"/>
+    <property key="labeling/shapeSVGFile" value=""/>
+    <property key="labeling/shapeSizeMapUnitScale" value="0,0,0,0,0,0"/>
+    <property key="labeling/shapeSizeType" value="0"/>
+    <property key="labeling/shapeSizeUnits" value="1"/>
+    <property key="labeling/shapeSizeX" value="0"/>
+    <property key="labeling/shapeSizeY" value="0"/>
+    <property key="labeling/shapeTransparency" value="0"/>
+    <property key="labeling/shapeType" value="0"/>
+    <property key="labeling/substitutions" value="<substitutions/>"/>
+    <property key="labeling/textColorA" value="255"/>
+    <property key="labeling/textColorB" value="0"/>
+    <property key="labeling/textColorG" value="0"/>
+    <property key="labeling/textColorR" value="0"/>
+    <property key="labeling/textTransp" value="0"/>
+    <property key="labeling/upsidedownLabels" value="0"/>
+    <property key="labeling/useSubstitutions" value="false"/>
+    <property key="labeling/wrapChar" value=""/>
+    <property key="labeling/xOffset" value="0"/>
+    <property key="labeling/yOffset" value="0"/>
+    <property key="labeling/zIndex" value="0"/>
+    <property key="variableNames"/>
+    <property key="variableValues"/>
+  </customproperties>
+  <blendMode>0</blendMode>
+  <featureBlendMode>0</featureBlendMode>
+  <layerTransparency>0</layerTransparency>
+  <displayfield>Name</displayfield>
+  <label>0</label>
+  <labelattributes>
+    <label fieldname="" text="Label"/>
+    <family fieldname="" name="Cantarell"/>
+    <size fieldname="" units="pt" value="12"/>
+    <bold fieldname="" on="0"/>
+    <italic fieldname="" on="0"/>
+    <underline fieldname="" on="0"/>
+    <strikeout fieldname="" on="0"/>
+    <color fieldname="" red="0" blue="0" green="0"/>
+    <x fieldname=""/>
+    <y fieldname=""/>
+    <offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
+    <angle fieldname="" value="0" auto="0"/>
+    <alignment fieldname="" value="center"/>
+    <buffercolor fieldname="" red="255" blue="255" green="255"/>
+    <buffersize fieldname="" units="pt" value="1"/>
+    <bufferenabled fieldname="" on=""/>
+    <multilineenabled fieldname="" on=""/>
+    <selectedonly on=""/>
+  </labelattributes>
+  <SingleCategoryDiagramRenderer diagramType="Histogram" sizeLegend="0" attributeLegend="1">
+    <DiagramCategory penColor="#000000" labelPlacementMethod="XHeight" penWidth="0" diagramOrientation="Up" sizeScale="0,0,0,0,0,0" minimumSize="0" barWidth="5" penAlpha="255" maxScaleDenominator="1e+08" backgroundColor="#ffffff" transparency="0" width="15" scaleDependency="Area" backgroundAlpha="255" angleOffset="1440" scaleBasedVisibility="0" enabled="0" height="15" lineSizeScale="0,0,0,0,0,0" sizeType="MM" lineSizeType="MM" minScaleDenominator="inf">
+      <fontProperties description="Cantarell,11,-1,5,50,0,0,0,0,0" style=""/>
+    </DiagramCategory>
+    <symbol alpha="1" clip_to_extent="1" type="marker" name="sizeSymbol">
+      <layer pass="0" class="SimpleMarker" locked="0">
+        <prop k="angle" v="0"/>
+        <prop k="color" v="255,0,0,255"/>
+        <prop k="horizontal_anchor_point" v="1"/>
+        <prop k="joinstyle" v="bevel"/>
+        <prop k="name" v="circle"/>
+        <prop k="offset" v="0,0"/>
+        <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+        <prop k="offset_unit" v="MM"/>
+        <prop k="outline_color" v="0,0,0,255"/>
+        <prop k="outline_style" v="solid"/>
+        <prop k="outline_width" v="0"/>
+        <prop k="outline_width_map_unit_scale" v="0,0,0,0,0,0"/>
+        <prop k="outline_width_unit" v="MM"/>
+        <prop k="scale_method" v="diameter"/>
+        <prop k="size" v="2"/>
+        <prop k="size_map_unit_scale" v="0,0,0,0,0,0"/>
+        <prop k="size_unit" v="MM"/>
+        <prop k="vertical_anchor_point" v="1"/>
+      </layer>
+    </symbol>
+  </SingleCategoryDiagramRenderer>
+  <DiagramLayerSettings yPosColumn="-1" showColumn="-1" linePlacementFlags="10" placement="0" dist="0" xPosColumn="-1" priority="0" obstacle="0" zIndex="0" showAll="1"/>
+  <annotationform></annotationform>
+  <aliases>
+    <alias field="Name" index="0" name=""/>
+    <alias field="Value" index="1" name=""/>
+  </aliases>
+  <excludeAttributesWMS/>
+  <excludeAttributesWFS/>
+  <attributeactions default="-1"/>
+  <attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="1664710748">
+    <columns>
+      <column width="-1" hidden="0" type="field" name="Name"/>
+      <column width="-1" hidden="0" type="field" name="Value"/>
+      <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>
+  <widgets/>
+  <conditionalstyles>
+    <rowstyles/>
+    <fieldstyles/>
+  </conditionalstyles>
+  <defaults>
+    <default field="Name" expression=""/>
+    <default field="Value" expression=""/>
+  </defaults>
+  <previewExpression></previewExpression>
+  <layerGeometryType>2</layerGeometryType>
+</qgis>
diff --git a/tests/testdata/qgis_server/secondlayer.cpg b/tests/testdata/qgis_server/secondlayer.cpg
new file mode 100644
index 0000000..3ad133c
--- /dev/null
+++ b/tests/testdata/qgis_server/secondlayer.cpg
@@ -0,0 +1 @@
+UTF-8
\ No newline at end of file
diff --git a/tests/testdata/qgis_server/secondlayer.dbf b/tests/testdata/qgis_server/secondlayer.dbf
new file mode 100644
index 0000000..5bbdbe0
Binary files /dev/null and b/tests/testdata/qgis_server/secondlayer.dbf differ
diff --git a/tests/testdata/qgis_server/secondlayer.prj b/tests/testdata/qgis_server/secondlayer.prj
new file mode 100644
index 0000000..a30c00a
--- /dev/null
+++ b/tests/testdata/qgis_server/secondlayer.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/tests/testdata/qgis_server/secondlayer.qpj b/tests/testdata/qgis_server/secondlayer.qpj
new file mode 100644
index 0000000..5fbc831
--- /dev/null
+++ b/tests/testdata/qgis_server/secondlayer.qpj
@@ -0,0 +1 @@
+GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
diff --git a/tests/testdata/qgis_server/secondlayer.shp b/tests/testdata/qgis_server/secondlayer.shp
new file mode 100644
index 0000000..1d4c6f5
Binary files /dev/null and b/tests/testdata/qgis_server/secondlayer.shp differ
diff --git a/tests/testdata/qgis_server/secondlayer.shx b/tests/testdata/qgis_server/secondlayer.shx
new file mode 100644
index 0000000..e90ad05
Binary files /dev/null and b/tests/testdata/qgis_server/secondlayer.shx differ
diff --git a/tests/testdata/qgis_server/test_project_two_layers.qgs b/tests/testdata/qgis_server/test_project_two_layers.qgs
new file mode 100644
index 0000000..5bac44c
--- /dev/null
+++ b/tests/testdata/qgis_server/test_project_two_layers.qgs
@@ -0,0 +1,669 @@
+<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
+<qgis projectname="QGIS Test Project" version="2.18.10">
+  <title>QGIS Test Project</title>
+  <autotransaction active="0"/>
+  <evaluateDefaultValues active="0"/>
+  <layer-tree-group expanded="1" checked="Qt::Checked" name="">
+    <customproperties/>
+    <layer-tree-layer expanded="1" providerKey="ogr" checked="Qt::Checked" id="testlayer20150528120452665" source="/home/cmangeat/sources/QGIS/tests/testdata/qgis_server/testlayer.shp" name="testlayer">
+      <customproperties>
+        <property key="expandedLegendNodes"/>
+      </customproperties>
+    </layer-tree-layer>
+    <layer-tree-layer expanded="1" providerKey="ogr" checked="Qt::Checked" id="secondlayer20170720141616586" source="/home/cmangeat/sources/QGIS/tests/testdata/qgis_server/secondlayer.shp" name="secondlayer">
+      <customproperties/>
+    </layer-tree-layer>
+  </layer-tree-group>
+  <relations/>
+  <mapcanvas>
+    <units>degrees</units>
+    <extent>
+      <xmin>8.20339035499803515</xmin>
+      <ymin>44.90138892949983074</ymin>
+      <xmax>8.20354946347372405</xmax>
+      <ymax>44.90145229128218318</ymax>
+    </extent>
+    <rotation>0</rotation>
+    <projections>1</projections>
+    <destinationsrs>
+      <spatialrefsys>
+        <proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
+        <srsid>3452</srsid>
+        <srid>4326</srid>
+        <authid>EPSG:4326</authid>
+        <description>WGS 84</description>
+        <projectionacronym>longlat</projectionacronym>
+        <ellipsoidacronym>WGS84</ellipsoidacronym>
+        <geographicflag>true</geographicflag>
+      </spatialrefsys>
+    </destinationsrs>
+    <rendermaptile>0</rendermaptile>
+    <layer_coordinate_transform_info>
+      <layer_coordinate_transform destAuthId="EPSG:4326" srcAuthId="EPSG:4326" srcDatumTransform="-1" destDatumTransform="-1" layerid="secondlayer20170720141011864"/>
+      <layer_coordinate_transform destAuthId="EPSG:4326" srcAuthId="EPSG:4326" srcDatumTransform="-1" destDatumTransform="-1" layerid="secondlayer20170720141616586"/>
+      <layer_coordinate_transform destAuthId="EPSG:4326" srcAuthId="EPSG:4326" srcDatumTransform="-1" destDatumTransform="-1" layerid="testlayer_copy20170720140930584"/>
+      <layer_coordinate_transform destAuthId="EPSG:4326" srcAuthId="EPSG:4326" srcDatumTransform="-1" destDatumTransform="-1" layerid="secondlayer20170720135939874"/>
+      <layer_coordinate_transform destAuthId="EPSG:4326" srcAuthId="EPSG:4326" srcDatumTransform="-1" destDatumTransform="-1" layerid="testlayer20150528120452665"/>
+      <layer_coordinate_transform destAuthId="EPSG:4326" srcAuthId="EPSG:4326" srcDatumTransform="-1" destDatumTransform="-1" layerid="secondlayer120170720135640422"/>
+      <layer_coordinate_transform destAuthId="EPSG:4326" srcAuthId="EPSG:4326" srcDatumTransform="-1" destDatumTransform="-1" layerid="secondlayer20170720110942139"/>
+    </layer_coordinate_transform_info>
+  </mapcanvas>
+  <layer-tree-canvas>
+    <custom-order enabled="0">
+      <item>testlayer20150528120452665</item>
+      <item>secondlayer20170720141616586</item>
+    </custom-order>
+  </layer-tree-canvas>
+  <legend updateDrawingOrder="true">
+    <legendlayer drawingOrder="-1" open="true" checked="Qt::Checked" name="testlayer" showFeatureCount="0">
+      <filegroup open="true" hidden="false">
+        <legendlayerfile isInOverview="0" layerid="testlayer20150528120452665" visible="1"/>
+      </filegroup>
+    </legendlayer>
+    <legendlayer drawingOrder="-1" open="true" checked="Qt::Checked" name="secondlayer" showFeatureCount="0">
+      <filegroup open="true" hidden="false">
+        <legendlayerfile isInOverview="0" layerid="secondlayer20170720141616586" visible="1"/>
+      </filegroup>
+    </legendlayer>
+  </legend>
+  <projectlayers>
+    <maplayer simplifyAlgorithm="0" minimumScale="0" maximumScale="1e+08" simplifyDrawingHints="1" minLabelScale="0" maxLabelScale="1e+08" simplifyDrawingTol="1" readOnly="0" geometry="Polygon" simplifyMaxScale="1" type="vector" hasScaleBasedVisibilityFlag="0" simplifyLocal="1" scaleBasedLabelVisibilityFlag="0">
+      <id>secondlayer20170720141616586</id>
+      <datasource>./secondlayer.shp</datasource>
+      <keywordList>
+        <value></value>
+      </keywordList>
+      <layername>secondlayer</layername>
+      <srs>
+        <spatialrefsys>
+          <proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
+          <srsid>3452</srsid>
+          <srid>4326</srid>
+          <authid>EPSG:4326</authid>
+          <description>WGS 84</description>
+          <projectionacronym>longlat</projectionacronym>
+          <ellipsoidacronym>WGS84</ellipsoidacronym>
+          <geographicflag>true</geographicflag>
+        </spatialrefsys>
+      </srs>
+      <provider encoding="UTF-8">ogr</provider>
+      <vectorjoins/>
+      <layerDependencies/>
+      <expressionfields/>
+      <map-layer-style-manager current="">
+        <map-layer-style name=""/>
+      </map-layer-style-manager>
+      <edittypes>
+        <edittype widgetv2type="TextEdit" name="id">
+          <widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
+        </edittype>
+      </edittypes>
+      <renderer-v2 forceraster="0" symbollevels="0" type="singleSymbol" enableorderby="0">
+        <symbols>
+          <symbol alpha="1" clip_to_extent="1" type="fill" name="0">
+            <layer pass="0" class="SimpleFill" locked="0">
+              <prop k="border_width_map_unit_scale" v="0,0,0,0,0,0"/>
+              <prop k="color" v="152,186,17,255"/>
+              <prop k="joinstyle" v="bevel"/>
+              <prop k="offset" v="0,0"/>
+              <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+              <prop k="offset_unit" v="MM"/>
+              <prop k="outline_color" v="0,0,0,255"/>
+              <prop k="outline_style" v="solid"/>
+              <prop k="outline_width" v="0.26"/>
+              <prop k="outline_width_unit" v="MM"/>
+              <prop k="style" v="solid"/>
+            </layer>
+          </symbol>
+        </symbols>
+        <rotation/>
+        <sizescale scalemethod="diameter"/>
+      </renderer-v2>
+      <labeling type="simple"/>
+      <customproperties/>
+      <blendMode>0</blendMode>
+      <featureBlendMode>0</featureBlendMode>
+      <layerTransparency>0</layerTransparency>
+      <displayfield>id</displayfield>
+      <label>0</label>
+      <labelattributes>
+        <label fieldname="" text="Label"/>
+        <family fieldname="" name="Ubuntu"/>
+        <size fieldname="" units="pt" value="12"/>
+        <bold fieldname="" on="0"/>
+        <italic fieldname="" on="0"/>
+        <underline fieldname="" on="0"/>
+        <strikeout fieldname="" on="0"/>
+        <color fieldname="" red="0" blue="0" green="0"/>
+        <x fieldname=""/>
+        <y fieldname=""/>
+        <offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
+        <angle fieldname="" value="0" auto="0"/>
+        <alignment fieldname="" value="center"/>
+        <buffercolor fieldname="" red="255" blue="255" green="255"/>
+        <buffersize fieldname="" units="pt" value="1"/>
+        <bufferenabled fieldname="" on=""/>
+        <multilineenabled fieldname="" on=""/>
+        <selectedonly on=""/>
+      </labelattributes>
+      <annotationform></annotationform>
+      <aliases>
+        <alias field="id" index="0" name=""/>
+      </aliases>
+      <excludeAttributesWMS/>
+      <excludeAttributesWFS/>
+      <attributeactions default="-1"/>
+      <attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="31675904">
+        <columns/>
+      </attributetableconfig>
+      <editform></editform>
+      <editforminit/>
+      <editforminitcodesource>0</editforminitcodesource>
+      <editforminitfilepath></editforminitfilepath>
+      <editforminitcode><![CDATA[]]></editforminitcode>
+      <featformsuppress>0</featformsuppress>
+      <editorlayout>generatedlayout</editorlayout>
+      <widgets/>
+      <conditionalstyles>
+        <rowstyles/>
+        <fieldstyles/>
+      </conditionalstyles>
+      <defaults>
+        <default field="id" expression=""/>
+      </defaults>
+      <previewExpression></previewExpression>
+    </maplayer>
+    <maplayer simplifyAlgorithm="0" minimumScale="0" maximumScale="1e+08" simplifyDrawingHints="0" minLabelScale="0" maxLabelScale="1e+08" simplifyDrawingTol="1" readOnly="0" geometry="Point" simplifyMaxScale="1" type="vector" hasScaleBasedVisibilityFlag="0" simplifyLocal="1" scaleBasedLabelVisibilityFlag="0">
+      <extent>
+        <xmin>8.20345930703634352</xmin>
+        <ymin>44.90139483904469131</ymin>
+        <xmax>8.20354699399348775</xmax>
+        <ymax>44.90148252600183554</ymax>
+      </extent>
+      <id>testlayer20150528120452665</id>
+      <datasource>./testlayer.shp</datasource>
+      <title>A test vector layer</title>
+      <abstract>A test vector layer with unicode òà</abstract>
+      <keywordList>
+        <value></value>
+      </keywordList>
+      <layername>testlayer</layername>
+      <srs>
+        <spatialrefsys>
+          <proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
+          <srsid>3452</srsid>
+          <srid>4326</srid>
+          <authid>EPSG:4326</authid>
+          <description>WGS 84</description>
+          <projectionacronym>longlat</projectionacronym>
+          <ellipsoidacronym>WGS84</ellipsoidacronym>
+          <geographicflag>true</geographicflag>
+        </spatialrefsys>
+      </srs>
+      <provider encoding="UTF-8">ogr</provider>
+      <vectorjoins/>
+      <layerDependencies/>
+      <expressionfields/>
+      <map-layer-style-manager current="">
+        <map-layer-style name=""/>
+      </map-layer-style-manager>
+      <edittypes>
+        <edittype widgetv2type="TextEdit" name="id">
+          <widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
+        </edittype>
+        <edittype widgetv2type="TextEdit" name="name">
+          <widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
+        </edittype>
+        <edittype widgetv2type="TextEdit" name="utf8nameè">
+          <widgetv2config IsMultiline="0" fieldEditable="1" constraint="" UseHtml="0" labelOnTop="0" constraintDescription="" notNull="0"/>
+        </edittype>
+      </edittypes>
+      <renderer-v2 forceraster="0" symbollevels="0" type="singleSymbol" enableorderby="0">
+        <symbols>
+          <symbol alpha="1" clip_to_extent="1" type="marker" name="0">
+            <layer pass="0" class="SimpleMarker" locked="0">
+              <prop k="angle" v="0"/>
+              <prop k="color" v="102,164,67,255"/>
+              <prop k="horizontal_anchor_point" v="1"/>
+              <prop k="joinstyle" v="bevel"/>
+              <prop k="name" v="circle"/>
+              <prop k="offset" v="0,0"/>
+              <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+              <prop k="offset_unit" v="MM"/>
+              <prop k="outline_color" v="0,0,0,255"/>
+              <prop k="outline_style" v="solid"/>
+              <prop k="outline_width" v="0"/>
+              <prop k="outline_width_map_unit_scale" v="0,0,0,0,0,0"/>
+              <prop k="outline_width_unit" v="MM"/>
+              <prop k="scale_method" v="area"/>
+              <prop k="size" v="2"/>
+              <prop k="size_map_unit_scale" v="0,0,0,0,0,0"/>
+              <prop k="size_unit" v="MM"/>
+              <prop k="vertical_anchor_point" v="1"/>
+              <effect enabled="0" type="effectStack">
+                <effect type="drawSource">
+                  <prop k="blend_mode" v="0"/>
+                  <prop k="draw_mode" v="2"/>
+                  <prop k="enabled" v="1"/>
+                  <prop k="transparency" v="0"/>
+                </effect>
+              </effect>
+            </layer>
+          </symbol>
+        </symbols>
+        <rotation/>
+        <sizescale scalemethod="diameter"/>
+        <effect enabled="0" type="effectStack">
+          <effect type="drawSource">
+            <prop k="blend_mode" v="0"/>
+            <prop k="draw_mode" v="2"/>
+            <prop k="enabled" v="1"/>
+            <prop k="transparency" v="0"/>
+          </effect>
+        </effect>
+      </renderer-v2>
+      <labeling type="simple"/>
+      <customproperties>
+        <property key="embeddedWidgets/count" value="0"/>
+        <property key="labeling" value="pal"/>
+        <property key="labeling/addDirectionSymbol" value="false"/>
+        <property key="labeling/angleOffset" value="0"/>
+        <property key="labeling/blendMode" value="0"/>
+        <property key="labeling/bufferBlendMode" value="0"/>
+        <property key="labeling/bufferColorA" value="255"/>
+        <property key="labeling/bufferColorB" value="255"/>
+        <property key="labeling/bufferColorG" value="255"/>
+        <property key="labeling/bufferColorR" value="255"/>
+        <property key="labeling/bufferDraw" value="false"/>
+        <property key="labeling/bufferJoinStyle" value="64"/>
+        <property key="labeling/bufferNoFill" value="false"/>
+        <property key="labeling/bufferSize" value="1"/>
+        <property key="labeling/bufferSizeInMapUnits" value="false"/>
+        <property key="labeling/bufferSizeMapUnitMaxScale" value="0"/>
+        <property key="labeling/bufferSizeMapUnitMinScale" value="0"/>
+        <property key="labeling/bufferSizeMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/bufferTransp" value="0"/>
+        <property key="labeling/centroidInside" value="false"/>
+        <property key="labeling/centroidWhole" value="false"/>
+        <property key="labeling/decimals" value="3"/>
+        <property key="labeling/displayAll" value="false"/>
+        <property key="labeling/dist" value="0"/>
+        <property key="labeling/distInMapUnits" value="false"/>
+        <property key="labeling/distMapUnitMaxScale" value="0"/>
+        <property key="labeling/distMapUnitMinScale" value="0"/>
+        <property key="labeling/distMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/drawLabels" value="false"/>
+        <property key="labeling/enabled" value="false"/>
+        <property key="labeling/fieldName" value=""/>
+        <property key="labeling/fitInPolygonOnly" value="false"/>
+        <property key="labeling/fontBold" value="false"/>
+        <property key="labeling/fontCapitals" value="0"/>
+        <property key="labeling/fontFamily" value="Ubuntu"/>
+        <property key="labeling/fontItalic" value="false"/>
+        <property key="labeling/fontLetterSpacing" value="0"/>
+        <property key="labeling/fontLimitPixelSize" value="false"/>
+        <property key="labeling/fontMaxPixelSize" value="10000"/>
+        <property key="labeling/fontMinPixelSize" value="3"/>
+        <property key="labeling/fontSize" value="9"/>
+        <property key="labeling/fontSizeInMapUnits" value="false"/>
+        <property key="labeling/fontSizeMapUnitMaxScale" value="0"/>
+        <property key="labeling/fontSizeMapUnitMinScale" value="0"/>
+        <property key="labeling/fontSizeMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/fontStrikeout" value="false"/>
+        <property key="labeling/fontUnderline" value="false"/>
+        <property key="labeling/fontWeight" value="63"/>
+        <property key="labeling/fontWordSpacing" value="0"/>
+        <property key="labeling/formatNumbers" value="false"/>
+        <property key="labeling/isExpression" value="true"/>
+        <property key="labeling/labelOffsetInMapUnits" value="true"/>
+        <property key="labeling/labelOffsetMapUnitMaxScale" value="0"/>
+        <property key="labeling/labelOffsetMapUnitMinScale" value="0"/>
+        <property key="labeling/labelOffsetMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/labelPerPart" value="false"/>
+        <property key="labeling/leftDirectionSymbol" value="<"/>
+        <property key="labeling/limitNumLabels" value="false"/>
+        <property key="labeling/maxCurvedCharAngleIn" value="20"/>
+        <property key="labeling/maxCurvedCharAngleOut" value="-20"/>
+        <property key="labeling/maxNumLabels" value="2000"/>
+        <property key="labeling/mergeLines" value="false"/>
+        <property key="labeling/minFeatureSize" value="0"/>
+        <property key="labeling/multilineAlign" value="0"/>
+        <property key="labeling/multilineHeight" value="1"/>
+        <property key="labeling/namedStyle" value="Medium"/>
+        <property key="labeling/obstacle" value="true"/>
+        <property key="labeling/obstacleFactor" value="1"/>
+        <property key="labeling/obstacleType" value="0"/>
+        <property key="labeling/offsetType" value="0"/>
+        <property key="labeling/placeDirectionSymbol" value="0"/>
+        <property key="labeling/placement" value="0"/>
+        <property key="labeling/placementFlags" value="0"/>
+        <property key="labeling/plussign" value="false"/>
+        <property key="labeling/predefinedPositionOrder" value="TR,TL,BR,BL,R,L,TSR,BSR"/>
+        <property key="labeling/preserveRotation" value="true"/>
+        <property key="labeling/previewBkgrdColor" value="#ffffff"/>
+        <property key="labeling/priority" value="5"/>
+        <property key="labeling/quadOffset" value="4"/>
+        <property key="labeling/repeatDistance" value="0"/>
+        <property key="labeling/repeatDistanceMapUnitMaxScale" value="0"/>
+        <property key="labeling/repeatDistanceMapUnitMinScale" value="0"/>
+        <property key="labeling/repeatDistanceMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/repeatDistanceUnit" value="1"/>
+        <property key="labeling/reverseDirectionSymbol" value="false"/>
+        <property key="labeling/rightDirectionSymbol" value=">"/>
+        <property key="labeling/scaleMax" value="10000000"/>
+        <property key="labeling/scaleMin" value="1"/>
+        <property key="labeling/scaleVisibility" value="false"/>
+        <property key="labeling/shadowBlendMode" value="6"/>
+        <property key="labeling/shadowColorB" value="0"/>
+        <property key="labeling/shadowColorG" value="0"/>
+        <property key="labeling/shadowColorR" value="0"/>
+        <property key="labeling/shadowDraw" value="false"/>
+        <property key="labeling/shadowOffsetAngle" value="135"/>
+        <property key="labeling/shadowOffsetDist" value="1"/>
+        <property key="labeling/shadowOffsetGlobal" value="true"/>
+        <property key="labeling/shadowOffsetMapUnitMaxScale" value="0"/>
+        <property key="labeling/shadowOffsetMapUnitMinScale" value="0"/>
+        <property key="labeling/shadowOffsetMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/shadowOffsetUnits" value="1"/>
+        <property key="labeling/shadowRadius" value="1.5"/>
+        <property key="labeling/shadowRadiusAlphaOnly" value="false"/>
+        <property key="labeling/shadowRadiusMapUnitMaxScale" value="0"/>
+        <property key="labeling/shadowRadiusMapUnitMinScale" value="0"/>
+        <property key="labeling/shadowRadiusMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/shadowRadiusUnits" value="1"/>
+        <property key="labeling/shadowScale" value="100"/>
+        <property key="labeling/shadowTransparency" value="30"/>
+        <property key="labeling/shadowUnder" value="0"/>
+        <property key="labeling/shapeBlendMode" value="0"/>
+        <property key="labeling/shapeBorderColorA" value="255"/>
+        <property key="labeling/shapeBorderColorB" value="128"/>
+        <property key="labeling/shapeBorderColorG" value="128"/>
+        <property key="labeling/shapeBorderColorR" value="128"/>
+        <property key="labeling/shapeBorderWidth" value="0"/>
+        <property key="labeling/shapeBorderWidthMapUnitMaxScale" value="0"/>
+        <property key="labeling/shapeBorderWidthMapUnitMinScale" value="0"/>
+        <property key="labeling/shapeBorderWidthMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/shapeBorderWidthUnits" value="1"/>
+        <property key="labeling/shapeDraw" value="false"/>
+        <property key="labeling/shapeFillColorA" value="255"/>
+        <property key="labeling/shapeFillColorB" value="255"/>
+        <property key="labeling/shapeFillColorG" value="255"/>
+        <property key="labeling/shapeFillColorR" value="255"/>
+        <property key="labeling/shapeJoinStyle" value="64"/>
+        <property key="labeling/shapeOffsetMapUnitMaxScale" value="0"/>
+        <property key="labeling/shapeOffsetMapUnitMinScale" value="0"/>
+        <property key="labeling/shapeOffsetMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/shapeOffsetUnits" value="1"/>
+        <property key="labeling/shapeOffsetX" value="0"/>
+        <property key="labeling/shapeOffsetY" value="0"/>
+        <property key="labeling/shapeRadiiMapUnitMaxScale" value="0"/>
+        <property key="labeling/shapeRadiiMapUnitMinScale" value="0"/>
+        <property key="labeling/shapeRadiiMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/shapeRadiiUnits" value="1"/>
+        <property key="labeling/shapeRadiiX" value="0"/>
+        <property key="labeling/shapeRadiiY" value="0"/>
+        <property key="labeling/shapeRotation" value="0"/>
+        <property key="labeling/shapeRotationType" value="0"/>
+        <property key="labeling/shapeSVGFile" value=""/>
+        <property key="labeling/shapeSizeMapUnitMaxScale" value="0"/>
+        <property key="labeling/shapeSizeMapUnitMinScale" value="0"/>
+        <property key="labeling/shapeSizeMapUnitScale" value="0,0,0,0,0,0"/>
+        <property key="labeling/shapeSizeType" value="0"/>
+        <property key="labeling/shapeSizeUnits" value="1"/>
+        <property key="labeling/shapeSizeX" value="0"/>
+        <property key="labeling/shapeSizeY" value="0"/>
+        <property key="labeling/shapeTransparency" value="0"/>
+        <property key="labeling/shapeType" value="0"/>
+        <property key="labeling/substitutions" value="<substitutions/>"/>
+        <property key="labeling/textColorA" value="255"/>
+        <property key="labeling/textColorB" value="0"/>
+        <property key="labeling/textColorG" value="0"/>
+        <property key="labeling/textColorR" value="0"/>
+        <property key="labeling/textTransp" value="0"/>
+        <property key="labeling/upsidedownLabels" value="0"/>
+        <property key="labeling/useSubstitutions" value="false"/>
+        <property key="labeling/wrapChar" value=""/>
+        <property key="labeling/xOffset" value="0"/>
+        <property key="labeling/yOffset" value="0"/>
+        <property key="labeling/zIndex" value="0"/>
+        <property key="variableNames"/>
+        <property key="variableValues"/>
+      </customproperties>
+      <blendMode>0</blendMode>
+      <featureBlendMode>0</featureBlendMode>
+      <layerTransparency>0</layerTransparency>
+      <displayfield>name</displayfield>
+      <label>0</label>
+      <labelattributes>
+        <label fieldname="" text="Label"/>
+        <family fieldname="" name="Ubuntu"/>
+        <size fieldname="" units="pt" value="12"/>
+        <bold fieldname="" on="0"/>
+        <italic fieldname="" on="0"/>
+        <underline fieldname="" on="0"/>
+        <strikeout fieldname="" on="0"/>
+        <color fieldname="" red="0" blue="0" green="0"/>
+        <x fieldname=""/>
+        <y fieldname=""/>
+        <offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
+        <angle fieldname="" value="0" auto="0"/>
+        <alignment fieldname="" value="center"/>
+        <buffercolor fieldname="" red="255" blue="255" green="255"/>
+        <buffersize fieldname="" units="pt" value="1"/>
+        <bufferenabled fieldname="" on=""/>
+        <multilineenabled fieldname="" on=""/>
+        <selectedonly on=""/>
+      </labelattributes>
+      <SingleCategoryDiagramRenderer diagramType="Pie" sizeLegend="0" attributeLegend="1">
+        <DiagramCategory penColor="#000000" labelPlacementMethod="XHeight" penWidth="0" diagramOrientation="Up" sizeScale="0,0,0,0,0,0" minimumSize="0" barWidth="5" penAlpha="255" maxScaleDenominator="1e+08" backgroundColor="#ffffff" transparency="0" width="15" scaleDependency="Area" backgroundAlpha="255" angleOffset="1440" scaleBasedVisibility="0" enabled="0" height="15" lineSizeScale="0,0,0,0,0,0" sizeType="MM" lineSizeType="MM" minScaleDenominator="inf">
+          <fontProperties description="Ubuntu,9,-1,5,50,0,0,0,0,0" style=""/>
+          <attribute field="" color="#000000" label=""/>
+        </DiagramCategory>
+        <symbol alpha="1" clip_to_extent="1" type="marker" name="sizeSymbol">
+          <layer pass="0" class="SimpleMarker" locked="0">
+            <prop k="angle" v="0"/>
+            <prop k="color" v="255,0,0,255"/>
+            <prop k="horizontal_anchor_point" v="1"/>
+            <prop k="joinstyle" v="bevel"/>
+            <prop k="name" v="circle"/>
+            <prop k="offset" v="0,0"/>
+            <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+            <prop k="offset_unit" v="MM"/>
+            <prop k="outline_color" v="0,0,0,255"/>
+            <prop k="outline_style" v="solid"/>
+            <prop k="outline_width" v="0"/>
+            <prop k="outline_width_map_unit_scale" v="0,0,0,0,0,0"/>
+            <prop k="outline_width_unit" v="MM"/>
+            <prop k="scale_method" v="diameter"/>
+            <prop k="size" v="2"/>
+            <prop k="size_map_unit_scale" v="0,0,0,0,0,0"/>
+            <prop k="size_unit" v="MM"/>
+            <prop k="vertical_anchor_point" v="1"/>
+          </layer>
+        </symbol>
+      </SingleCategoryDiagramRenderer>
+      <DiagramLayerSettings yPosColumn="-1" showColumn="0" linePlacementFlags="10" placement="0" dist="0" xPosColumn="-1" priority="0" obstacle="0" zIndex="0" showAll="1"/>
+      <annotationform>.</annotationform>
+      <aliases>
+        <alias field="id" index="0" name=""/>
+        <alias field="name" index="1" name=""/>
+        <alias field="utf8nameè" index="2" name=""/>
+      </aliases>
+      <excludeAttributesWMS/>
+      <excludeAttributesWFS/>
+      <attributeactions default="-1"/>
+      <attributetableconfig actionWidgetStyle="dropDown" sortExpression="" sortOrder="0">
+        <columns>
+          <column width="-1" hidden="0" type="field" name="id"/>
+          <column width="-1" hidden="0" type="field" name="name"/>
+          <column width="-1" hidden="0" type="field" name="utf8nameè"/>
+          <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>
+      <widgets>
+        <widget name="utf8name">
+          <config>
+            <option key="IsMultiline" value="false"/>
+            <option key="UseHtml" value="false"/>
+          </config>
+        </widget>
+      </widgets>
+      <conditionalstyles>
+        <rowstyles/>
+        <fieldstyles/>
+      </conditionalstyles>
+      <defaults>
+        <default field="id" expression=""/>
+        <default field="name" expression=""/>
+        <default field="utf8nameè" expression=""/>
+      </defaults>
+      <previewExpression>COALESCE( "name", '<NULL>' )</previewExpression>
+    </maplayer>
+  </projectlayers>
+  <properties>
+    <WMSUrl type="QString"></WMSUrl>
+    <SpatialRefSys>
+      <ProjectCRSProj4String type="QString">+proj=longlat +datum=WGS84 +no_defs</ProjectCRSProj4String>
+      <ProjectCrs type="QString">EPSG:4326</ProjectCrs>
+      <ProjectCRSID type="int">3452</ProjectCRSID>
+      <ProjectionsEnabled type="int">1</ProjectionsEnabled>
+    </SpatialRefSys>
+    <Measurement>
+      <DistanceUnits type="QString">meters</DistanceUnits>
+      <AreaUnits type="QString">m2</AreaUnits>
+    </Measurement>
+    <Legend>
+      <filterByMap type="bool">false</filterByMap>
+    </Legend>
+    <WMSExtent type="QStringList">
+      <value>8.20315414376310059</value>
+      <value>44.901236559338642</value>
+      <value>8.204164917965862</value>
+      <value>44.90159838674664172</value>
+    </WMSExtent>
+    <DefaultStyles>
+      <Fill type="QString"></Fill>
+      <Line type="QString"></Line>
+      <Marker type="QString"></Marker>
+      <RandomColors type="bool">true</RandomColors>
+      <AlphaInt type="int">255</AlphaInt>
+      <ColorRamp type="QString"></ColorRamp>
+    </DefaultStyles>
+    <WMSAccessConstraints type="QString">None</WMSAccessConstraints>
+    <WMSSegmentizeFeatureInfoGeometry type="bool">false</WMSSegmentizeFeatureInfoGeometry>
+    <WMSContactMail type="QString">elpaso at itopen.it</WMSContactMail>
+    <WMSImageQuality type="int">90</WMSImageQuality>
+    <WFSLayersPrecision>
+      <secondlayer20170720141011864 type="int">8</secondlayer20170720141011864>
+      <secondlayer20170720141616586 type="int">8</secondlayer20170720141616586>
+      <secondlayer20170720135939874 type="int">8</secondlayer20170720135939874>
+      <testlayer20150528120452665 type="int">8</testlayer20150528120452665>
+      <secondlayer20170720110942139 type="int">8</secondlayer20170720110942139>
+    </WFSLayersPrecision>
+    <WMSRestrictedComposers type="QStringList"/>
+    <WMSServiceTitle type="QString">QGIS TestProject</WMSServiceTitle>
+    <WMSContactPhone type="QString"></WMSContactPhone>
+    <WFSTLayers>
+      <Insert type="QStringList"/>
+      <Update type="QStringList"/>
+      <Delete type="QStringList"/>
+    </WFSTLayers>
+    <WCSLayers type="QStringList"/>
+    <WMSRestrictedLayers type="QStringList"/>
+    <WMSFees type="QString">conditions unknown</WMSFees>
+    <Macros>
+      <pythonCode type="QString"></pythonCode>
+    </Macros>
+    <WMSAddWktGeometry type="bool">true</WMSAddWktGeometry>
+    <WCSUrl type="QString"></WCSUrl>
+    <WMSOnlineResource type="QString"></WMSOnlineResource>
+    <WMSPrecision type="QString">4</WMSPrecision>
+    <Digitizing>
+      <DefaultSnapToleranceUnit type="int">2</DefaultSnapToleranceUnit>
+      <LayerSnappingList type="QStringList">
+        <value>testlayer20150528120452665</value>
+      </LayerSnappingList>
+      <LayerSnappingEnabledList type="QStringList">
+        <value>disabled</value>
+      </LayerSnappingEnabledList>
+      <SnappingMode type="QString">current_layer</SnappingMode>
+      <AvoidIntersectionsList type="QStringList"/>
+      <LayerSnappingToleranceUnitList type="QStringList">
+        <value>2</value>
+      </LayerSnappingToleranceUnitList>
+      <LayerSnapToList type="QStringList">
+        <value>to_vertex_and_segment</value>
+      </LayerSnapToList>
+      <DefaultSnapType type="QString">off</DefaultSnapType>
+      <DefaultSnapTolerance type="double">0</DefaultSnapTolerance>
+      <LayerSnappingToleranceList type="QStringList">
+        <value>0.000000</value>
+      </LayerSnappingToleranceList>
+    </Digitizing>
+    <Identify>
+      <disabledLayers type="QStringList"/>
+    </Identify>
+    <WMSContactPerson type="QString">Alessandro Pasotti</WMSContactPerson>
+    <WMSContactOrganization type="QString">QGIS dev team</WMSContactOrganization>
+    <WMSKeywordList type="QStringList">
+      <value></value>
+    </WMSKeywordList>
+    <Variables>
+      <variableNames type="QStringList"/>
+      <variableValues type="QStringList"/>
+    </Variables>
+    <Paths>
+      <Absolute type="bool">false</Absolute>
+    </Paths>
+    <WMSContactPosition type="QString"></WMSContactPosition>
+    <PositionPrecision>
+      <DecimalPlaces type="int">2</DecimalPlaces>
+      <Automatic type="bool">true</Automatic>
+      <DegreeFormat type="QString">D</DegreeFormat>
+    </PositionPrecision>
+    <Gui>
+      <SelectionColorBluePart type="int">0</SelectionColorBluePart>
+      <CanvasColorGreenPart type="int">255</CanvasColorGreenPart>
+      <CanvasColorRedPart type="int">255</CanvasColorRedPart>
+      <SelectionColorRedPart type="int">255</SelectionColorRedPart>
+      <SelectionColorAlphaPart type="int">255</SelectionColorAlphaPart>
+      <SelectionColorGreenPart type="int">255</SelectionColorGreenPart>
+      <CanvasColorBluePart type="int">255</CanvasColorBluePart>
+    </Gui>
+    <Measure>
+      <Ellipsoid type="QString">WGS84</Ellipsoid>
+    </Measure>
+    <WMSServiceAbstract type="QString">Some UTF8 text èòù</WMSServiceAbstract>
+    <WFSLayers type="QStringList">
+      <value>secondlayer20170720141616586</value>
+      <value>testlayer20150528120452665</value>
+    </WFSLayers>
+    <WFSUrl type="QString"></WFSUrl>
+    <WMSServiceCapabilities type="bool">true</WMSServiceCapabilities>
+    <WMSUseLayerIDs type="bool">false</WMSUseLayerIDs>
+  </properties>
+  <visibility-presets/>
+</qgis>
diff --git a/tests/testdata/qgis_server/wfs_getfeature_multiple.txt b/tests/testdata/qgis_server/wfs_getfeature_multiple.txt
new file mode 100644
index 0000000..231ce51
--- /dev/null
+++ b/tests/testdata/qgis_server/wfs_getfeature_multiple.txt
@@ -0,0 +1,97 @@
+Content-Type: text/xml; charset=utf-8
+
+<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:ows="http://www.opengis.net/ows" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:qgs="http://www.qgis.org/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd http://www.qgis.org/gml http:?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureT [...]
+ <gml:Box srsName="EPSG:4326">
+  <gml:coordinates cs="," ts=" ">8.20345816,44.90140323 8.2035369,44.9014747</gml:coordinates>
+ </gml:Box>
+</gml:boundedBy>
+<gml:featureMember>
+ <qgs:secondlayer fid="secondlayer.0">
+  <gml:boundedBy>
+   <gml:Box srsName="EPSG:4326">
+    <gml:coordinates cs="," ts=" ">8.20345817,44.9014216 8.20350448,44.90147469</gml:coordinates>
+   </gml:Box>
+  </gml:boundedBy>
+  <qgs:geometry>
+   <Polygon xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
+    <outerBoundaryIs xmlns="http://www.opengis.net/gml">
+     <LinearRing xmlns="http://www.opengis.net/gml">
+      <coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20348959,44.90147469 8.20350448,44.90142541 8.20346478,44.9014216 8.20345817,44.90145485 8.20347768,44.90144674 8.20350018,44.90146576 8.20348959,44.90147469</coordinates>
+     </LinearRing>
+    </outerBoundaryIs>
+   </Polygon>
+  </qgs:geometry>
+  <qgs:id>42</qgs:id>
+ </qgs:secondlayer>
+</gml:featureMember>
+<gml:featureMember>
+ <qgs:secondlayer fid="secondlayer.1">
+  <gml:boundedBy>
+   <gml:Box srsName="EPSG:4326">
+    <gml:coordinates cs="," ts=" ">8.20348728,44.90140324 8.20353689,44.90143798</gml:coordinates>
+   </gml:Box>
+  </gml:boundedBy>
+  <qgs:geometry>
+   <Polygon xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
+    <outerBoundaryIs xmlns="http://www.opengis.net/gml">
+     <LinearRing xmlns="http://www.opengis.net/gml">
+      <coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20348728,44.90140523 8.20352664,44.90143798 8.20353689,44.90142011 8.20349885,44.90140324 8.20348728,44.90140523</coordinates>
+     </LinearRing>
+    </outerBoundaryIs>
+   </Polygon>
+  </qgs:geometry>
+  <qgs:id>43</qgs:id>
+ </qgs:secondlayer>
+</gml:featureMember>
+<gml:featureMember>
+ <qgs:testlayer fid="testlayer.0">
+  <gml:boundedBy>
+   <gml:Box srsName="EPSG:4326">
+    <gml:coordinates cs="," ts=" ">8.20349634,44.90148253 8.20349634,44.90148253</gml:coordinates>
+   </gml:Box>
+  </gml:boundedBy>
+  <qgs:geometry>
+   <Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
+    <coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20349634,44.90148253</coordinates>
+   </Point>
+  </qgs:geometry>
+  <qgs:id>1</qgs:id>
+  <qgs:name>one</qgs:name>
+  <qgs:utf8nameè>one èé</qgs:utf8nameè>
+ </qgs:testlayer>
+</gml:featureMember>
+<gml:featureMember>
+ <qgs:testlayer fid="testlayer.1">
+  <gml:boundedBy>
+   <gml:Box srsName="EPSG:4326">
+    <gml:coordinates cs="," ts=" ">8.20354699,44.90143568 8.20354699,44.90143568</gml:coordinates>
+   </gml:Box>
+  </gml:boundedBy>
+  <qgs:geometry>
+   <Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
+    <coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20354699,44.90143568</coordinates>
+   </Point>
+  </qgs:geometry>
+  <qgs:id>2</qgs:id>
+  <qgs:name>two</qgs:name>
+  <qgs:utf8nameè>two àò</qgs:utf8nameè>
+ </qgs:testlayer>
+</gml:featureMember>
+<gml:featureMember>
+ <qgs:testlayer fid="testlayer.2">
+  <gml:boundedBy>
+   <gml:Box srsName="EPSG:4326">
+    <gml:coordinates cs="," ts=" ">8.20345931,44.90139484 8.20345931,44.90139484</gml:coordinates>
+   </gml:Box>
+  </gml:boundedBy>
+  <qgs:geometry>
+   <Point xmlns="http://www.opengis.net/gml" srsName="EPSG:4326">
+    <coordinates xmlns="http://www.opengis.net/gml" cs="," ts=" ">8.20345931,44.90139484</coordinates>
+   </Point>
+  </qgs:geometry>
+  <qgs:id>3</qgs:id>
+  <qgs:name>three</qgs:name>
+  <qgs:utf8nameè>three èé↓</qgs:utf8nameè>
+ </qgs:testlayer>
+</gml:featureMember>
+</wfs:FeatureCollection>

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