[qgis] 01/01: Imported Upstream version 2.12.1+dfsg

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Tue Dec 1 22:37:01 UTC 2015


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

sebastic pushed a commit to branch upstream
in repository qgis.

commit 956f1813793e7b1f81a6be7a6e91825f633a8053
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Dec 1 21:20:31 2015 +0100

    Imported Upstream version 2.12.1+dfsg
---
 CMakeLists.txt                                     |   2 +-
 ChangeLog                                          | 448 +++++++++++++++++++++
 ci/travis/linux/before_install.sh                  |   2 -
 ci/travis/linux/install.sh                         |   1 -
 debian/changelog                                   |  10 +-
 images/svg/shopping/shopping_diy.svg               | 226 +++++++----
 images/svg/shopping/shopping_estateagent.svg       | 117 ++++--
 images/svg/shopping/shopping_estateagent2.svg      |  87 ++--
 images/svg/shopping/shopping_gift.svg              | 219 +++++-----
 images/svg/shopping/shopping_hairdresser.svg       | 143 ++++---
 images/svg/shopping/shopping_hifi.svg              | 163 ++++----
 images/svg/shopping/shopping_jewelry.svg           | 129 ++++--
 images/svg/shopping/shopping_mobile_phone.svg      | 165 ++++----
 images/svg/shopping/shopping_music.svg             | 234 ++++++-----
 images/svg/shopping/shopping_pet.svg               | 152 +++----
 images/svg/shopping/shopping_pet2.svg              | 320 +++++++--------
 images/svg/shopping/shopping_photo.svg             | 163 ++++----
 images/svg/shopping/shopping_supermarket.svg       |  95 +++--
 images/svg/shopping/shopping_tackle.svg            | 168 ++++----
 images/svg/shopping/shopping_video_rental.svg      | 146 ++++---
 ms-windows/osgeo4w/package-nightly.cmd             |   8 +-
 ms-windows/osgeo4w/package.cmd                     |   9 +-
 python/core/symbology-ng/qgsfillsymbollayerv2.sip  |  10 +-
 python/core/symbology-ng/qgslinesymbollayerv2.sip  |   2 +-
 python/core/symbology-ng/qgssymbolv2.sip           |   5 +
 .../plugins/db_manager/db_plugins/oracle/TODO.md   |   4 -
 python/plugins/db_manager/dlg_sql_window.py        |   2 +-
 python/plugins/fTools/tools/doGeoprocessing.py     |  38 +-
 python/plugins/processing/algs/qgis/Clip.py        |   4 +-
 .../plugins/processing/algs/qgis/Intersection.py   |   4 +-
 python/plugins/processing/algs/qgis/Union.py       |  38 +-
 scripts/generate_test_mask_image.py                | 191 ++++-----
 scripts/tsstat.pl                                  |   2 +-
 src/app/nodetool/qgsmaptoolnodetool.cpp            |  17 +-
 src/app/qgsfieldcalculator.cpp                     |  18 +-
 src/app/qgsprojectproperties.cpp                   |   5 +-
 src/core/auth/qgsauthcertutils.h                   |   4 +-
 src/core/auth/qgsauthmanager.cpp                   |   4 +
 src/core/geometry/qgscircularstringv2.cpp          |   8 +-
 src/core/geometry/qgscurvepolygonv2.cpp            |   6 +
 src/core/geometry/qgsgeometryutils.cpp             |   4 +-
 src/core/geometry/qgsgeos.cpp                      |  22 +-
 src/core/geometry/qgslinestringv2.cpp              |  24 +-
 src/core/geometry/qgsmultipointv2.cpp              |  13 +-
 src/core/geometry/qgspointv2.cpp                   |  16 +-
 src/core/geometry/qgspointv2.h                     |   4 +-
 src/core/layertree/qgslayertreegroup.cpp           |   6 +-
 src/core/pal/labelposition.cpp                     |  41 +-
 src/core/pal/pointset.cpp                          |   4 +-
 src/core/qgsexpression.cpp                         |   2 +-
 src/core/qgsmaplayer.cpp                           |   1 +
 src/core/qgsmaptopixelgeometrysimplifier.cpp       |  11 +-
 src/core/qgsvectorfilewriter.cpp                   |   7 +-
 src/core/qgsvectorlayer.cpp                        |  19 +-
 src/core/qgsvectorlayereditutils.cpp               |   7 +
 src/core/qgsvectorlayerfeatureiterator.cpp         |  11 +
 src/core/qgsvectorlayerrenderer.cpp                |  40 +-
 src/core/symbology-ng/qgsellipsesymbollayerv2.cpp  |  17 +-
 src/core/symbology-ng/qgsellipsesymbollayerv2.h    |   5 +-
 src/core/symbology-ng/qgsfillsymbollayerv2.cpp     |  27 +-
 src/core/symbology-ng/qgsfillsymbollayerv2.h       |   3 +-
 src/core/symbology-ng/qgslinesymbollayerv2.cpp     |  23 +-
 src/core/symbology-ng/qgsrulebasedrendererv2.cpp   |  11 +-
 src/core/symbology-ng/qgssymbollayerv2.cpp         |  15 +-
 src/core/symbology-ng/qgssymbollayerv2utils.cpp    |   6 +-
 src/core/symbology-ng/qgssymbolv2.cpp              |  10 +
 src/core/symbology-ng/qgssymbolv2.h                |   5 +
 .../qgsdefaultsearchwidgetwrapper.cpp              |   6 +-
 .../editorwidgets/qgsrelationreferencewidget.cpp   |   2 +-
 .../qgsvaluemapsearchwidgetwrapper.cpp             |  31 +-
 .../editorwidgets/qgsvaluemapsearchwidgetwrapper.h |  17 +-
 .../qgsvaluerelationsearchwidgetwrapper.cpp        |  42 +-
 .../qgsvaluerelationsearchwidgetwrapper.h          |  30 +-
 src/plugins/geometry_checker/CMakeLists.txt        |   2 +
 .../geometry_checker/checks/qgsgeometrycheck.h     |   2 +
 .../geometry_checker/qgsgeometrycheckerplugin.cpp  |  64 +++
 .../geometry_checker/qgsgeometrycheckerplugin.h    |  66 +--
 src/plugins/geometry_snapper/CMakeLists.txt        |   1 +
 .../geometry_snapper/qgsgeometrysnapperplugin.cpp  |  64 +++
 .../geometry_snapper/qgsgeometrysnapperplugin.h    |  67 +--
 .../delimitedtext/qgsdelimitedtextprovider.cpp     |  11 +-
 src/providers/grass/qgis.r.in.cpp                  |   5 +
 src/providers/grass/qgis.v.in.cpp                  |   2 +-
 src/providers/grass/qgsgrassimport.cpp             |  10 +
 src/providers/grass/qgsgrassvectormaplayer.cpp     |  35 +-
 .../postgres/qgspostgresexpressioncompiler.cpp     |   2 +-
 src/providers/postgres/qgspostgresprovider.cpp     |  34 +-
 .../spatialite/qgsspatialitefeatureiterator.cpp    |  27 +-
 src/providers/wms/qgswmscapabilities.cpp           |   5 +
 src/server/qgswfsserver.cpp                        |  21 +-
 src/server/qgswmsconfigparser.cpp                  |  16 +-
 src/server/qgswmsprojectparser.cpp                 |   1 +
 tests/src/core/CMakeLists.txt                      |   3 +
 tests/src/core/testqgsauthmanager.cpp              |   6 +-
 tests/src/core/testqgsexpression.cpp               | 108 ++++-
 tests/src/core/testqgsgeometry.cpp                 |  47 +++
 tests/src/core/testqgslinefillsymbol.cpp           | 185 +++++++++
 tests/src/core/testqgsmarkerlinesymbol.cpp         | 154 +++++++
 tests/src/core/testqgspointpatternfillsymbol.cpp   | 185 +++++++++
 tests/src/providers/grass/testqgsgrassprovider.cpp |   5 +-
 tests/src/python/test_qgsdelimitedtextprovider.py  |  18 +-
 .../python/test_qgsdelimitedtextprovider_wanted.py |  83 ++++
 tests/src/python/test_qgsgeometry.py               |   6 +-
 tests/src/python/test_qgsvectorlayer.py            |  35 +-
 .../expected_rulebased_disabled_else_mask.png      | Bin 0 -> 1229 bytes
 .../expected_rulebased_else_mask.png               | Bin 0 -> 1257 bytes
 .../expected_lines-parallel-label+45_mask.png      | Bin 2751 -> 3061 bytes
 .../expected_line_offset/expected_line_offset.png  | Bin 0 -> 40258 bytes
 .../expected_line_offset_mask.png                  | Bin 0 -> 464 bytes
 .../expected_datadefined_subsymbol.png             | Bin 0 -> 7552 bytes
 .../expected_datadefined_subsymbol_mask.png        | Bin 0 -> 2055 bytes
 .../expected_symbol_linefill.png                   | Bin 0 -> 7701 bytes
 .../expected_symbol_linefill_mask.png              | Bin 0 -> 2048 bytes
 .../expected_datadefined_subsymbol.png             | Bin 0 -> 641536 bytes
 .../expected_datadefined_subsymbol_mask.png        | Bin 0 -> 1801 bytes
 .../expected_symbol_pointfill.png                  | Bin 0 -> 641536 bytes
 tests/testdata/delimitedtext/test13749.csv         |   5 +
 tests/testdata/geom_data.csv                       |   3 +
 tests/testdata/marker_line_offset.qml              | 284 +++++++++++++
 119 files changed, 3750 insertions(+), 1663 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 02985a8..bdc1925 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 SET(CPACK_PACKAGE_VERSION_MAJOR "2")
 SET(CPACK_PACKAGE_VERSION_MINOR "12")
-SET(CPACK_PACKAGE_VERSION_PATCH "0")
+SET(CPACK_PACKAGE_VERSION_PATCH "1")
 SET(COMPLETE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
 SET(RELEASE_NAME "Lyon")
 IF (POLICY CMP0048) # in CMake 3.0.0+
diff --git a/ChangeLog b/ChangeLog
index 5c5f7d2..2ebdaec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,451 @@
+Matthias Kuhn <matthias at opengis.ch>	2015-11-26
+
+    Disable grass7 tests
+
+    Packages are unavailable (at the moment?)
+
+rldhont <rldhont at gmail.com>	2015-11-26
+
+    [QGIS-Server] Enhance store project keyword list
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-26
+
+    Update test mask images
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-26
+
+    Make symbol line fill tests more robust
+
+    (cherry-picked from 711c38dfaf6d04aa30c1247d91723d37d025a5ed)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-26
+
+    Fix build
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-26
+
+    Fix crash in QgsLineStringV2::append if non z/m line appended
+    to a LineString with z/m
+
+    (cherry-picked from ff3657)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-26
+
+    QgsPointV2 fixes
+
+    -Fix bounding box was not invalidated for some QgsPointV2 routines
+    -If WKT type is PointZ/M/ZM and not enough coordinates specified,
+    initialise extra coordinated to 0
+
+    (cherry-picked from 8c0fe47)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-26
+
+    Fix incorrect point types when segmentizing circular strings
+
+    (cherry-picked from e1c3b4)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-21
+
+    Followup c6460a3, avoid rendering issues
+
+    (cherry picked from commit 0a2773ff4b2ee7f5011cc6bbc606043814255c92)
+
+Juergen E. Fischer <jef at norbit.de>	2015-11-20
+
+    render polylines with drawPath too (followup 08185c9; fixes #13343)
+
+    (cherry picked from commit c6460a3d7de23e655c5fa68309b8224555b0b77f)
+
+Matthias Kuhn <matthias at opengis.ch>	2015-11-24
+
+    Followup 436c30f, Also fix processing
+
+    And some code fixes
+
+Marco Hugentobler <marco.hugentobler at sourcepole.ch>	2015-11-24
+
+    Fix ftools geometry collection handling
+
+Juergen E. Fischer <jef at norbit.de>	2015-11-23
+
+    fix local simplification for ZM geometries
+
+    (cherry picked from commit 09e7102fdaaec8b38f5d8f3d6cbbd69d4e170029)
+
+rldhont <rldhont at gmail.com>	2015-11-20
+
+    Clean [BUGFIX] Multipoint asJSON
+
+rldhont <rldhont at gmail.com>	2015-11-20
+
+    [BUGFIX] Multipoint asJSON
+
+    Fixes #13855
+    Multipoint asJSON made MultiPoint as Multilinestring with only 1 point by linestring.
+
+    This bugfix adds tests.
+
+Matthias Kuhn <matthias at opengis.ch>	2015-11-19
+
+    Fix crash in relation reference widget
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-28
+
+    fix qgsauthmanager test on windows
+
+    (cherry picked from commit 0799e09a67dec3d1a26910d9c91fb88e268506b2)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Bracket ops to avoid precedence issues when compiling expressions
+
+    (cherry-picked from 26b3685757923e80631dd13bf8c47f6bfc3dda30)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Add missing /Transfer/s to setSubSymbol
+
+    (cherry-picked from dc0639c7944320ceeca40413d5dc2147f5c2d328)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fix endpoint swap on negative marker line offset
+
+    Fixes #13811
+    Includes testcase
+
+    (cherry-picked from 824fd7bf32a45e278f2ec2fe9fa1c7228c9fb27f)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Followup b81933e fix other symbols with paths out of viewport
+
+    (cherry-picked from 709b47e11c4fd67c341be841593946d0f55663b6)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Followup f9fa9793, avoid expensive intersection calculation when
+    testing label candidates against polygon obstacles
+
+    Fix #13556
+
+    (cherry-picked from b384f18a3dc38305dcfe4673f9c5353e80104053)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    More robust GEOS pointOnSurface calculation (fix #13787)
+
+    (cherry-picked from 5c9873c7949e183b2834c6a6f82b0477441038b6)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fix crash with malformed WKT
+
+    (cherry-picked from 18744b4123b1803e33928e9c34b6e56cba190779)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fix crash on malformed WKT strings
+
+    (cherry-picked from fccf54b2d781d4eb87ddc19dd71dad5a0625aa6f)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fix delimited text layers set to unknown geometry type if first row has
+    null geometry (fix #13749)
+
+    (cherry-picked from 743964393450178289e6717d67cdba04c6206e23)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Much faster zoom to selection on large PostGIS layers
+
+    (cherry-picked from 6772ffb97d9985b8e17aacb13dab6ce0812312b0)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Also use FilterFids when field calculator is only updating selected
+    features. Results in similar speed improvements when updating
+    only selected features from a large PostGIS layer
+
+    (cherry-picked from 33fe0e2d4984be37ff8c4b0619860522f5e7b8f7)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Use a FilterFids request for vector file writer rather than fetching
+    all features and then testing the feature id when saving selected
+    features
+
+    For providers such as Postgres this is orders of magnitude faster.
+    Eg, saving 6 selected features from a 800k PostGIS table now
+    takes < 1 second as opposed to ~33 seconds
+
+    Fix #8334
+
+    (cherry-picked from f0d31b03a9bbc1d43e1b51ccd4acf64cf2616a63)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Use IN (...) for postgres FilterFids requests when the primary
+    key is a simple (non compound) type
+
+    IN (...) is much faster than chained ...OR... clauses
+
+    Additionally, trying to filter by a large number of feature Ids
+    (eg > 30k ) fails when using the ...OR... approach, but works
+    using IN
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Followup 2ac5933 with more data defined fixes
+
+    2ac5933 fixed the regression in 2.12, but there were more underlying
+    issues from <2.8 causing sub symbols with data defined properties
+    to be ignored.
+
+    Add some tests.
+
+    (refs #13707)
+
+    (cherry-picked from 9e84fcafd8597846367a7417ce0ce77f7a4ca587)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fix data defined overrides for sub symbols in line and marker fill
+    are not being applied (fix #13707)
+
+    (cherry-picked from 2ac59332130186d891635f01c6c7677685716863)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fixes #13747
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fix expression get_feature function was not fetching feature's
+    geometry
+
+    Fix #13695
+
+    (cherry-picked from c445ac1eef0a2f94d1e334b1439d593e706f1395)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Add test for filter expression on non provider fields
+
+    (cherry-picked from 353c0db74567f0331c58516813a84c04825eadcf)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    When deleting nodes from the end of a linestring, select the
+    final node following a delete rather than reverting to the first
+    node.
+
+    Improves workflow when deleting sequential nodes from end of
+    lines.
+
+    (cherry-picked from bcb7e44174b599f307022265eeae5dc622f859ce)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fix crash when deleting last node in a geometry (fix #13674)
+
+    (cherry-picked from ba1de8b5aa82f26c9127d12897ce42f49a265cb2)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Add some missing Q_OBJECT macros
+
+    (cherry-picked from ce5ed44dc50748c106bf3c67cea328cc829e0b2d)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fix ellipse symbol layer with graduated/categorised renderer
+
+    (cherry-picked from 5a6bfbb260d4054fa5d075510423f7374ce1af78)
+
+Nyall Dawson <nyall.dawson at gmail.com>	2015-11-18
+
+    Fix FilterExpression feature requests will ignore expression if
+    using virtual fields or other complex filters
+
+    refs #13695
+
+    (cherry-picked from dddd043491deefe1e4c9606a87a771d22736ff05)
+
+Sebastian Dietrich <SebDieBln at users.noreply.github.com>	2015-11-17
+
+    replaced 'LIMIT 0' by 'WHERE 0=1' (fixes #13731)
+
+Juergen E. Fischer <jef at norbit.de>	2015-11-16
+
+    [auth] fix detection of root CAs on Linux (fixes #13640)
+
+    (cherry picked from commit 08ec25b and a6a2982)
+
+Denis Rouzaud <denis.rouzaud at gmail.com>	2015-11-13
+
+    QgsValueMapSearchW inherits QgsSearchW
+
+    and not QgsDefaultSearchW anymore
+    fixes expression creation
+
+Denis Rouzaud <denis.rouzaud at gmail.com>	2015-11-12
+
+    QgsValueRelationSearchW inherits QgsSearchW
+
+    and not QgsDefaultSearchW
+    also handles properly the (no selection) case
+
+Denis Rouzaud <denis.rouzaud at gmail.com>	2015-11-12
+
+    fix value relation search widget
+
+    currently, changing the entr doesn't do anything in the attribute table since no signal is emitted
+
+    should be backported to 2.12
+
+Radim Blazek <radim.blazek at gmail.com>	2015-11-12
+
+    [GRASS] fixed cat shift when importing vectors via browser, fixes #13815
+
+    (cherry picked from commit fd9f0b52682f42eed9484159c8bd152144b7d4b3)
+
+rldhont <rldhont at gmail.com>	2015-11-12
+
+    Update [BUGFIX] 13118 QGIS Server - WFS - GeoJSON and escaping line breaks
+
+    Enhance replace, thanks to @nyalldawson
+    Enhance format, thanks to @jef-n
+
+    fixes #13118
+
+Juergen E. Fischer <jef at norbit.de>	2015-11-12
+
+    fix windows build (followup 2175e7a)
+
+    (cherry picked from commit 6e1df491f64bff1b778502d7d53f37256afcd6f6)
+
+rldhont <rldhont at gmail.com>	2015-11-11
+
+    [BUGFIX] 13118 QGIS Server - WFS - GeoJSON and escaping line breaks
+
+    Line breaks are not properly handled in GeoJSON results when making GetFeature requests.
+    Line breaks should be replaced by \\n.
+
+rldhont <rldhont at gmail.com>	2015-11-10
+
+    [QGIS-Server] Use layer precision in searchRect
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-29
+
+    'fix' PyQgsRulebasedRenderer test (followup 08185c9a)
+
+    (cherry picked from commit d9c8e73fa260c13f61fbca1915ac412459dcc011)
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-31
+
+    layer group node: copy properties of mutually exclusive groups (fixes #13723)
+
+    (cherry picked from commit d3ee16ffd1531d22d42692e5ef253f5db8eb961f)
+
+Juergen E. Fischer <jef at norbit.de>	2015-11-01
+
+    postgres provider: quote compound key columns in uri (fixes #13710)
+
+    (cherry picked from commit daa6510970e9afbc4d41d28e0c94b4f238eb372d)
+
+Radim Blazek <radim.blazek at gmail.com>	2015-11-01
+
+    [GRASS] fixed new line attributes lost, fixes #13726
+
+    (cherry picked from commit 0ceeb512fb486ebf6f1006b39cbea428fc524057)
+
+Radim Blazek <radim.blazek at gmail.com>	2015-11-01
+
+    [GRASS] fixed test
+
+    (cherry picked from commit 968e55cb110ce809447f43d40bc8c6a6d04dc052)
+
+Radim Blazek <radim.blazek at gmail.com>	2015-11-01
+
+    [GRASS] set proj/zone on imported rasters, fixes #13725
+
+    (cherry picked from commit 24960da08a566b6c2e15b60c80cad637f800a3e3)
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-24
+
+    render polygons with outline using drawPath (fixes #13343)
+
+    (cherry picked from commit 08185c9af47dcf113c0cb95faa858ec48e48dab2)
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-28
+
+    fix fetching of redirected wms capabilities (followup e95bf6d)
+
+    (cherry picked from commit 6a4544fc4cf7b4d3952d6109682af29db39dde7d)
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-27
+
+    osgeo4w: fetch grass7 path from grass
+
+    (cherry picked from commit f0930cacc1c3937745a5656b1aa31458aa05d026)
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-26
+
+    osgeo4w: include themes
+
+rldhont <rldhont at gmail.com>	2015-10-26
+
+    [BUGFIX][QGIS Server] Laye order from group in GetPrint
+
+    Since QGIS 2.8, QGIS Server rendered layers form group in reverted order.
+
+Werner Macho <werner.macho at gmail.com>	2015-10-25
+
+    update frechn translators
+
+    Signed-off-by: Werner Macho <werner.macho at gmail.com>
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-23
+
+    fix phantom labels for (actually not) rendered feature (refs #13631)
+
+    (cherry picked from commit d6f66e & b36cd1f)
+
+rldhont <rldhont at gmail.com>	2015-10-23
+
+    [BUGFIX] Set default units to mm in GetStyles
+
+    The default units in QgsMapRenderer is Millimeters. The default units in SLD
+     is Pixel but exportSld does not convert all millimeters in pixels.
+
+    We notes this bug by comparing default QGS Server rendering and rendering with
+     the SLD generated by QGIS.
+
+    To resolve it, we just have to add units to the document element.
+
+rldhont <rldhont at gmail.com>	2015-10-23
+
+    [BUGFIX] Set default units to mm in exportSld
+
+    The default units in QgsMapRenderer is Millimeters. The default units in SLD
+     is Pixel but exportSld does not convert all millimeters in pixels.
+
+    We notes this bug by comparing default QGS Server rendering and rendering with
+     the SLD generated by QGIS.
+
+    To resolve it, we just have to add units to the document element.
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-23
+
+    Release of 2.12 (Lyon)
+
+Juergen E. Fischer <jef at norbit.de>	2015-10-23
+
+    changelog update for 2.12
+
 Juergen E. Fischer <jef at norbit.de>	2015-10-23
 
     translation update for 2.12 from transifex
diff --git a/ci/travis/linux/before_install.sh b/ci/travis/linux/before_install.sh
index e910f56..f363a3e 100755
--- a/ci/travis/linux/before_install.sh
+++ b/ci/travis/linux/before_install.sh
@@ -1,7 +1,6 @@
 export DEBIAN_FRONTEND=noninteractive
 sudo add-apt-repository ppa:ubuntugis/ppa -y
 sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable -y # For postgresql-9.1-postgis-2.1
-sudo add-apt-repository ppa:grass/grass-stable -y
 sudo add-apt-repository ppa:smspillaz/cmake-3.0.2 -y
 sudo add-apt-repository ppa:kedazo/doxygen-updates-precise -y # For doxygen 1.8.8
 sudo apt-get update -qq
@@ -14,7 +13,6 @@ sudo apt-get install --force-yes --no-install-recommends --no-install-suggests \
         git \
         graphviz \
         grass-dev \
-        grass7-dev \
         libexpat1-dev \
         libfcgi-dev \
         libgdal1-dev \
diff --git a/ci/travis/linux/install.sh b/ci/travis/linux/install.sh
index c4b4712..8d5957d 100755
--- a/ci/travis/linux/install.sh
+++ b/ci/travis/linux/install.sh
@@ -3,7 +3,6 @@ cd build
 cmake -DWITH_SERVER=ON \
       -DWITH_STAGED_PLUGINS=OFF \
       -DWITH_GRASS=ON \
-      -DWITH_GRASS7=ON \
       -DSUPPRESS_QT_WARNINGS=ON \
       -DENABLE_MODELTEST=ON \
       -DENABLE_PGTEST=ON \
diff --git a/debian/changelog b/debian/changelog
index c2f387c..e4c40f6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,14 @@
-qgis (2.12.0) UNRELEASED; urgency=medium
+qgis (2.12.1) UNRELEASED; urgency=medium
+
+  * Release of 2.12.1
+
+ -- Jürgen E. Fischer <jef at norbit.de>  Fri, 27 Nov 2015 13:00:38 +0100
+
+qgis (2.12.0) unstable; urgency=medium
 
   * Release of 2.12.0
 
- -- Jürgen E. Fischer <jef at norbit.de>  Fri, 23 Oct 2015 14:10:38 +0200
+ -- Jürgen E. Fischer <jef at norbit.de>  Fri, 27 Nov 2015 13:00:38 +0100
 
 qgis (2.11.0) unstable; urgency=medium
 
diff --git a/images/svg/shopping/shopping_diy.svg b/images/svg/shopping/shopping_diy.svg
index 62e0478..6b5d9e3 100644
--- a/images/svg/shopping/shopping_diy.svg
+++ b/images/svg/shopping/shopping_diy.svg
@@ -1,76 +1,152 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docbase="s:\Data\FacilityIcons" sodipodi:docname="shopping_diy.svg" inkscape:version="0.46" sodipodi [...]
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="279.75046" inkscape:cx="850.77138" inkscape:zoom="0.46083856" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:current-layer="svg2" inkscape:window-y="1" inkscape:window-x="1" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1014" inkscape:window-height="711">
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="32 : 16 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 16 : 1" sodipodi:type="inkscape:persp3d" id="perspective4904" inkscape:persp3d-origin="16 : 10.666667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="32 : 16 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 16 : 1" sodipodi:type="inkscape:persp3d" id="perspective5233" inkscape:persp3d-origin="16 : 10.666667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="500 : 250 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 250 : 1" sodipodi:type="inkscape:persp3d" id="perspective5412" inkscape:persp3d-origin="250 : 166.66667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="405.71429 : 204.28572 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 204.28572 : 1" sodipodi:type="inkscape:persp3d" id="perspective5571" inkscape:persp3d-origin="202.85715 : 136.19048 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="128 : 64 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 64 : 1" sodipodi:type="inkscape:persp3d" id="perspective6552" inkscape:persp3d-origin="64 : 42.666667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="477 : 171.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 171.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective8761" inkscape:persp3d-origin="238.5 : 114.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="105.66 : 50.309502 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 50.309502 : 1" sodipodi:type="inkscape:persp3d" id="perspective10479" inkscape:persp3d-origin="52.830002 : 33.539668 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="447.94901 : 230.3335 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 230.3335 : 1" sodipodi:type="inkscape:persp3d" id="perspective10853" inkscape:persp3d-origin="223.9745 : 153.55566 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="128 : 64 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 64 : 1" sodipodi:type="inkscape:persp3d" id="perspective4693" inkscape:persp3d-origin="64 : 42.666667 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M-17.116,893.866c-2.765,0-5.428,1.211-7.725,3.524l-61.188,65.15
-	l-16.927-3.22c-0.458-0.087-0.919,0.104-1.184,0.484l-6.178,8.903l-8.784,12.335c-0.265,0.372-0.276,0.848-0.07,1.231
-	c0.055,0.179,0.137,0.35,0.276,0.489l5.86,5.86c0.439,0.439,1.22,0.439,1.659,0l12.473-12.473l7.488,2.133l2.132,7.486
-	l-12.472,12.463c-0.458,0.458-0.458,1.201-0.001,1.659l2.361,2.364l4.007,4.034c0.227,0.229,0.529,0.347,0.833,0.347
-	c0.029,0,0.057-0.01,0.086-0.013c0.021,0.001,0.042,0.013,0.063,0.013c0.234,0,0.471-0.07,0.674-0.214l1.88-1.322l17.147-11.173
-	l2.854-1.839c0.114-0.073,0.208-0.167,0.288-0.271c0.235-0.277,0.335-0.654,0.25-1.021l-1.429-6.153l-2.462-10.907l65.353-61.81
-	c3.19-2.935,4.179-7.034,2.646-10.967C-8.833,896.784-12.909,893.866-17.116,893.866z M-13.698,904.055
-	c0,0.835-0.325,1.619-0.916,2.21c-0.872,0.872-2.218,1.096-3.34,0.681c-0.086-0.07-0.182-0.132-0.261-0.211
-	c-1.106-1.106-1.361-3.572-0.654-5.025c0.57-0.492,1.282-0.773,2.044-0.773c0.835,0,1.622,0.324,2.21,0.909
-	C-14.023,902.436-13.698,903.22-13.698,904.055z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M443.127,67.153c-0.076-10.965-9.608-19.554-21.7-19.554
-	l-0.179,0.001c-10.191,0-18.79,6.488-20.891,15.586c-14.36-0.915-21.136-3.602-28.298-6.441c-8.834-3.503-17.969-7.125-41.421-8.282
-	l-77.79-0.72c-48.224,0.538-87.208,28.48-115.871,83.049c-0.269,0.512-0.158,1.14,0.27,1.527c0.428,0.389,1.063,0.438,1.546,0.123
-	l2.563-1.678c0.188-0.123,0.34-0.293,0.44-0.494c9.638-19.316,45.785-36.26,77.355-36.26c20.795,0,35.284,7.488,40.815,21.088
-	c1.526,7.885,9.78,15.345,18.753,17.111l0.232,136.159c-8.047,0.854-16.265,9.484-16.429,17.656l-4.264,224.286
-	c-0.129,6.844,1.612,12.169,5.175,15.83c5.975,6.138,15.568,6.214,21.3,6.259c0.004,0,0.008,0,0.012,0l41.061-0.062
-	c6.554-0.03,15.794-2.78,21.66-8.855c4.101-4.246,6.084-9.527,5.896-15.693l-6.164-221.815c-0.216-8.035-8.456-16.616-16.454-17.507
-	l-0.179-136.605c12.057-0.934,20.348-6.056,26.027-16.053c4.234-7.45,10.999-10.773,21.935-10.773c4.717,0,9.758,0.598,14.633,1.176
-	c2.118,0.251,4.297,0.51,6.422,0.715l-0.037,5.658c0.075,10.813,9.862,19.609,21.854,19.609
-	c12.018-0.019,21.782-8.835,21.767-19.652L443.127,67.153z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_diy.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata26"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="-154.241"
+     inkscape:cx="93.45628"
+     inkscape:zoom="0.46083856"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="34"
+     inkscape:window-x="75"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1014"
+     inkscape:window-height="711"
+     inkscape:window-maximized="0" /><defs
+     id="defs4"><inkscape:perspective
+       inkscape:vp_z="580 : 290 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 290 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective2441"
+       inkscape:persp3d-origin="290 : 193.33333 : 1" /><inkscape:perspective
+       inkscape:vp_z="60 : 30 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 30 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective3452"
+       inkscape:persp3d-origin="30 : 20 : 1" /><inkscape:perspective
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective4471"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1" /><inkscape:perspective
+       inkscape:vp_z="12 : 6 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 6 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective4668"
+       inkscape:persp3d-origin="6 : 4 : 1" /><inkscape:perspective
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 16 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective4904"
+       inkscape:persp3d-origin="16 : 10.666667 : 1" /><inkscape:perspective
+       inkscape:vp_z="32 : 16 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 16 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective5233"
+       inkscape:persp3d-origin="16 : 10.666667 : 1" /><inkscape:perspective
+       inkscape:vp_z="500 : 250 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 250 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective5412"
+       inkscape:persp3d-origin="250 : 166.66667 : 1" /><inkscape:perspective
+       inkscape:vp_z="405.71429 : 204.28572 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 204.28572 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective5571"
+       inkscape:persp3d-origin="202.85715 : 136.19048 : 1" /><inkscape:perspective
+       inkscape:vp_z="128 : 64 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 64 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective6552"
+       inkscape:persp3d-origin="64 : 42.666667 : 1" /><inkscape:perspective
+       inkscape:vp_z="477 : 171.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 171.5 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective8761"
+       inkscape:persp3d-origin="238.5 : 114.33333 : 1" /><inkscape:perspective
+       inkscape:vp_z="105.66 : 50.309502 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 50.309502 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective10479"
+       inkscape:persp3d-origin="52.830002 : 33.539668 : 1" /><inkscape:perspective
+       inkscape:vp_z="447.94901 : 230.3335 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 230.3335 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective10853"
+       inkscape:persp3d-origin="223.9745 : 153.55566 : 1" /><inkscape:perspective
+       inkscape:vp_z="128 : 64 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 64 : 1"
+       sodipodi:type="inkscape:persp3d"
+       id="perspective4693"
+       inkscape:persp3d-origin="64 : 42.666667 : 1" /></defs><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M443.127,67.153c-0.076-10.965-9.608-19.554-21.7-19.554  l-0.179,0.001c-10.191,0-18.79,6.488-20.891,15.586c-14.36-0.915-21.136-3.602-28.298-6.441c-8.834-3.503-17.969-7.125-41.421-8.282  l-77.79-0.72c-48.224,0.538-87.208,28.48-115.871,83.049c-0.269,0.512-0.158,1.14,0.27,1.527c0.428,0.389,1.063,0.438,1.546,0.123  l2.563-1.678c0.188-0.123,0.34-0.293,0.44-0.494c9.638-19.316,45.785-36.26,77.355-36.26c20.795,0,35.284,7.488,40.815,21.088  c1.526,7.885,9.78,15.345,18.753,17.111l0.232,136. [...]
+     id="path24" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_estateagent.svg b/images/svg/shopping/shopping_estateagent.svg
index 33f1b01..c05ecdb 100644
--- a/images/svg/shopping/shopping_estateagent.svg
+++ b/images/svg/shopping/shopping_estateagent.svg
@@ -1,42 +1,77 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docbase="s:\Data\FacilityIcons" sodipodi:docname="shopping_estateagent.svg" inkscape:version="0.46"  [...]
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="267.20002" inkscape:cx="655.90544" inkscape:zoom="0.92167712" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="-4" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1400" inkscape:window-height="978">
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M152.863-175.071c1.811,0,3.606-0.545,5.137-1.606
-	c2.475-1.716,3.93-4.554,3.878-7.565l-0.986-56.982c-0.074-4.234-3.083-7.847-7.235-8.682l-111.59-22.465
-	c-3.13-0.629-6.361,0.443-8.493,2.821l-13.045,14.555c-2.655,2.962-3.055,7.313-0.984,10.709l12.306,20.187
-	c1.022,1.676,2.563,2.973,4.389,3.694L149.555-175.7C150.624-175.278,151.746-175.071,152.863-175.071z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M472.381,71.762H172.698V48.36c0-5.523-4.477-10-10-10H149.09
-	c-5.523,0-10,4.477-10,10v498.346c0,5.522,4.477,10,10,10h13.608c5.523,0,10-4.478,10-10V299.054h299.683c5.522,0,10-4.478,10-10
-	V81.762C482.381,76.239,477.903,71.762,472.381,71.762z M404.255,184.423v94.631H251.969v-94.8c0-0.299-0.242-0.542-0.542-0.542
-	l-18.69-0.032l29.686-29.258c0.104-0.102,0.162-0.241,0.162-0.387v-41.989h26.32v14.992c0,0.219,0.131,0.416,0.333,0.5
-	c0.2,0.084,0.435,0.04,0.59-0.114l35.877-35.34l78.034,76.38c0.102,0.1,0.238,0.155,0.38,0.155h0.136v0.102
-	c0,0.146,0.059,0.286,0.163,0.388l15.123,14.804l-14.742-0.031h-0.001c-0.144,0-0.281,0.057-0.384,0.158
-	C404.313,184.141,404.255,184.279,404.255,184.423z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_estateagent.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata18"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="282.467"
+     inkscape:cx="310.7355"
+     inkscape:zoom="1.1710325"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776"
+     inkscape:window-maximized="1"
+     showguides="false" /><defs
+     id="defs4" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M472.381,71.762H172.698V48.36c0-5.523-4.477-10-10-10H149.09  c-5.523,0-10,4.477-10,10v498.346c0,5.522,4.477,10,10,10h13.608c5.523,0,10-4.478,10-10V299.054h299.683c5.522,0,10-4.478,10-10  V81.762C482.381,76.239,477.903,71.762,472.381,71.762z M404.255,184.423v94.631H251.969v-94.8c0-0.299-0.242-0.542-0.542-0.542  l-18.69-0.032l29.686-29.258c0.104-0.102,0.162-0.241,0.162-0.387v-41.989h26.32v14.992c0,0.219,0.131,0.416,0.333,0.5  c0.2,0.084,0.435,0.04,0.59-0.114l35.877-35.34l78.034,76. [...]
+     id="path16" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_estateagent2.svg b/images/svg/shopping/shopping_estateagent2.svg
index facc79f..7136a83 100644
--- a/images/svg/shopping/shopping_estateagent2.svg
+++ b/images/svg/shopping/shopping_estateagent2.svg
@@ -1,30 +1,59 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="shopping_estateagent2.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective4211" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-</defs>
-<sodipodi:namedview  showgrid="false" inkscape:cy="267.20002" inkscape:cx="288.10481" inkscape:zoom="0.92167712" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="0" inkscape:current-layer="svg2" inkscape:window-y="45" inkscape:window-x="0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1400" inkscape:window-height="978">
-	</sodipodi:namedview>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M152.863-175.071c1.811,0,3.606-0.545,5.137-1.606
-	c2.475-1.716,3.93-4.554,3.878-7.565l-0.986-56.982c-0.074-4.234-3.083-7.847-7.235-8.682l-111.59-22.465
-	c-3.13-0.629-6.361,0.443-8.493,2.821l-13.045,14.555c-2.655,2.962-3.055,7.313-0.984,10.709l12.306,20.187
-	c1.022,1.676,2.563,2.973,4.389,3.694L149.555-175.7C150.624-175.278,151.746-175.071,152.863-175.071z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M547.251,309.481H411.87v-11.15c0-2.137-1.731-3.868-3.868-3.868
-	h-6.119c-2.137,0-3.868,1.731-3.868,3.868v224.082c0,2.137,1.731,3.868,3.868,3.868h6.119c2.137,0,3.868-1.731,3.868-3.868V410.427
-	h135.381c2.137,0,3.868-1.731,3.868-3.868v-93.21C551.119,311.212,549.388,309.481,547.251,309.481z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M401.867,251.775c0.411,0,0.783-0.248,0.94-0.628
-	c0.158-0.38,0.071-0.819-0.22-1.11L223.963,71.232c-0.194-0.194-0.482-0.293-0.732-0.299c-0.274,0.003-0.536,0.117-0.725,0.315
-	l-60.295,63.192v-26.612c0-0.563-0.456-1.019-1.019-1.019h-57.436c-0.563,0-1.019,0.456-1.019,1.019v81.421l-57.204,60.361
-	c-0.28,0.295-0.357,0.729-0.197,1.103c0.161,0.374,0.528,0.616,0.935,0.617l42.541,0.062v190.211c0,0.563,0.456,1.019,1.019,1.019
-	h265.862c0.563,0,1.019-0.456,1.019-1.019v-189.89L401.867,251.775L401.867,251.775z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_estateagent2.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata14"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+     id="defs3" /><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="453.13351"
+     inkscape:cx="287.30497"
+     inkscape:zoom="0.75986222"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776" /><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M547.251,309.481H411.87v-11.15c0-2.137-1.731-3.868-3.868-3.868  h-6.119c-2.137,0-3.868,1.731-3.868,3.868v224.082c0,2.137,1.731,3.868,3.868,3.868h6.119c2.137,0,3.868-1.731,3.868-3.868V410.427  h135.381c2.137,0,3.868-1.731,3.868-3.868v-93.21C551.119,311.212,549.388,309.481,547.251,309.481z"
+     id="path10" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M401.867,251.775c0.411,0,0.783-0.248,0.94-0.628  c0.158-0.38,0.071-0.819-0.22-1.11L223.963,71.232c-0.194-0.194-0.482-0.293-0.732-0.299c-0.274,0.003-0.536,0.117-0.725,0.315  l-60.295,63.192v-26.612c0-0.563-0.456-1.019-1.019-1.019h-57.436c-0.563,0-1.019,0.456-1.019,1.019v81.421l-57.204,60.361  c-0.28,0.295-0.357,0.729-0.197,1.103c0.161,0.374,0.528,0.616,0.935,0.617l42.541,0.062v190.211c0,0.563,0.456,1.019,1.019,1.019  h265.862c0.563,0,1.019-0.456,1.019-1.019v-189.89L401.867,251.775 [...]
+     id="path12" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_gift.svg b/images/svg/shopping/shopping_gift.svg
index c4b7862..5ef95ec 100644
--- a/images/svg/shopping/shopping_gift.svg
+++ b/images/svg/shopping/shopping_gift.svg
@@ -1,98 +1,123 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="shopping_gift.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="407.56604" inkscape:cx="184.46062" inkscape:zoom="0.92167712" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="1" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="-4" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1280" inkscape:window-height="1005" inkscape:guide-bbox="true [...]
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="6.1230318e-14 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3826" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3855" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3909" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3950" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3972" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3994" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4016" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4837" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4971" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M152.863-175.071c1.811,0,3.606-0.545,5.137-1.606
-	c2.475-1.716,3.93-4.554,3.878-7.565l-0.986-56.982c-0.074-4.234-3.083-7.847-7.235-8.682l-111.59-22.465
-	c-3.13-0.629-6.361,0.443-8.493,2.821l-13.045,14.555c-2.655,2.962-3.055,7.313-0.984,10.709l12.306,20.187
-	c1.022,1.676,2.563,2.973,4.389,3.694L149.555-175.7C150.624-175.278,151.746-175.071,152.863-175.071z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M488.001,226.381H341.664c-0.792,0-1.539,0.368-2.022,0.996
-	c-0.063,0.083-0.123,0.168-0.192,0.272c-1.401,1.8-2.874,3.45-4.501,5.044c-0.039,0.038-0.077,0.078-0.114,0.118
-	c-1.61,1.796-3.357,3.478-5.192,4.999c-1.815,1.506-3.746,2.889-5.737,4.109c-1.904,1.167-3.937,2.221-6.216,3.223
-	c-0.844,0.371-1.738,0.679-2.686,1.005c-0.338,0.117-0.677,0.233-1.014,0.353c-1.017,0.361-1.696,1.324-1.696,2.403v254.505h-42.021
-	V247.274c0-1.032-0.622-1.961-1.574-2.356c-2.14-0.886-4.171-1.849-6.037-2.861c-2.206-1.197-4.176-2.412-6.024-3.715
-	c-1.913-1.35-3.778-2.847-5.543-4.45c-1.792-1.628-3.383-3.27-4.864-5.019c-0.192-0.227-0.363-0.475-0.537-0.721
-	c-0.192-0.271-0.384-0.541-0.587-0.798c-0.484-0.614-1.222-0.973-2.004-0.973H87.511c-10.778,0-19.547,8.769-19.547,19.548v242.943
-	c0,10.779,8.769,19.548,19.547,19.548h153.178v0.089h101.897v-0.089h145.414c10.778,0,19.548-8.769,19.548-19.548V245.929
-	C507.549,235.15,498.779,226.381,488.001,226.381z M502.449,393.833H317.393v-48.707h185.057V393.833z M73.064,345.126h192.108
-	v48.707H73.064V345.126z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M292.344,224.417c21.587,0,39.148-17.562,39.148-39.149
-	c0-21.586-17.562-39.148-39.148-39.148c-21.586,0-39.148,17.562-39.148,39.148C253.195,206.855,270.757,224.417,292.344,224.417z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M376.68,162.215c3.785,0,7.887-0.166,12.19-0.494l0.192-0.014
-	l0.162-0.105c34.725-22.464,87.28-45.131,126.416-45.131c3.621,0,7.081,0.207,10.282,0.614l0.418,0.053l0.266-0.326
-	c3.163-3.881,4.473-8.168,3.892-12.74c-0.784-6.178-5.03-11.808-8.833-14.601c-2.636-2.356-7.407-3.581-14.183-3.64l-0.548-0.002
-	c-18.909,0-50.53,8.254-82.522,21.541c-34.876,14.484-63.143,32.008-77.55,48.078l-0.645,0.719l0.851,0.456
-	C353.995,160.334,363.958,162.215,376.68,162.215z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M528.239,93.269C525.189,89.523,524.108,88.955,528.239,93.269
-	L528.239,93.269z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M528.239,93.269c1.295,1.59,2.938,3.747,4.691,6.35
-	c-0.991-1.998-2.437-4.008-4.383-6.028C528.438,93.477,528.343,93.377,528.239,93.269z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M532.931,99.619c20.549,41.427-156.088,77.024-184.66,59.881
-	c9.614,15.123,9.124,30.246,1.815,45.368c-3.17,2.264,145.71-3.459,186.458-50.194C552.772,136.061,541.581,112.467,532.931,99.619z
-	"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M80.013,84.198c-6.775,0.059-11.546,1.283-14.125,3.594
-	c-3.859,2.839-8.105,8.468-8.89,14.646c-0.581,4.573,0.729,8.859,3.892,12.741l0.266,0.326l0.417-0.053
-	c3.202-0.408,6.661-0.614,10.282-0.614c39.137,0,91.692,22.667,126.416,45.131l0.162,0.105l0.192,0.014
-	c4.304,0.328,8.406,0.494,12.19,0.494c12.722,0,22.685-1.882,29.611-5.592l0.851-0.456l-0.645-0.719
-	c-14.408-16.07-42.673-33.594-77.55-48.078C131.091,92.449,99.47,84.195,80.56,84.195L80.013,84.198z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M58.948,91.957c-1.946,2.019-3.391,4.03-4.382,6.027
-	c1.752-2.602,3.395-4.758,4.689-6.348C59.152,91.744,59.058,91.843,58.948,91.957z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M237.41,203.234c-7.309-15.123-7.799-30.246,1.814-45.368
-	c-28.572,17.143-205.211-18.455-184.659-59.882c-8.65,12.848-19.843,36.443-3.614,55.056
-	C91.7,199.775,240.579,205.499,237.41,203.234z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M59.255,91.636C63.388,87.321,62.306,87.889,59.255,91.636
-	L59.255,91.636z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_gift.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata45"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="462.01951"
+     inkscape:cx="284.09378"
+     inkscape:zoom="0.77715196"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776"
+     inkscape:guide-bbox="true"
+     showguides="true" /><defs
+     id="defs4" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M488.001,226.381H341.664c-0.792,0-1.539,0.368-2.022,0.996  c-0.063,0.083-0.123,0.168-0.192,0.272c-1.401,1.8-2.874,3.45-4.501,5.044c-0.039,0.038-0.077,0.078-0.114,0.118  c-1.61,1.796-3.357,3.478-5.192,4.999c-1.815,1.506-3.746,2.889-5.737,4.109c-1.904,1.167-3.937,2.221-6.216,3.223  c-0.844,0.371-1.738,0.679-2.686,1.005c-0.338,0.117-0.677,0.233-1.014,0.353c-1.017,0.361-1.696,1.324-1.696,2.403v254.505h-42.021  V247.274c0-1.032-0.622-1.961-1.574-2.356c-2.14-0.886-4.171-1.849-6.037-2.8 [...]
+     id="path25" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M292.344,224.417c21.587,0,39.148-17.562,39.148-39.149  c0-21.586-17.562-39.148-39.148-39.148c-21.586,0-39.148,17.562-39.148,39.148C253.195,206.855,270.757,224.417,292.344,224.417z"
+     id="path27" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M376.68,162.215c3.785,0,7.887-0.166,12.19-0.494l0.192-0.014  l0.162-0.105c34.725-22.464,87.28-45.131,126.416-45.131c3.621,0,7.081,0.207,10.282,0.614l0.418,0.053l0.266-0.326  c3.163-3.881,4.473-8.168,3.892-12.74c-0.784-6.178-5.03-11.808-8.833-14.601c-2.636-2.356-7.407-3.581-14.183-3.64l-0.548-0.002  c-18.909,0-50.53,8.254-82.522,21.541c-34.876,14.484-63.143,32.008-77.55,48.078l-0.645,0.719l0.851,0.456  C353.995,160.334,363.958,162.215,376.68,162.215z"
+     id="path29" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M528.239,93.269C525.189,89.523,524.108,88.955,528.239,93.269  L528.239,93.269z"
+     id="path31" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M528.239,93.269c1.295,1.59,2.938,3.747,4.691,6.35  c-0.991-1.998-2.437-4.008-4.383-6.028C528.438,93.477,528.343,93.377,528.239,93.269z"
+     id="path33" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M532.931,99.619c20.549,41.427-156.088,77.024-184.66,59.881  c9.614,15.123,9.124,30.246,1.815,45.368c-3.17,2.264,145.71-3.459,186.458-50.194C552.772,136.061,541.581,112.467,532.931,99.619z  "
+     id="path35" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M80.013,84.198c-6.775,0.059-11.546,1.283-14.125,3.594  c-3.859,2.839-8.105,8.468-8.89,14.646c-0.581,4.573,0.729,8.859,3.892,12.741l0.266,0.326l0.417-0.053  c3.202-0.408,6.661-0.614,10.282-0.614c39.137,0,91.692,22.667,126.416,45.131l0.162,0.105l0.192,0.014  c4.304,0.328,8.406,0.494,12.19,0.494c12.722,0,22.685-1.882,29.611-5.592l0.851-0.456l-0.645-0.719  c-14.408-16.07-42.673-33.594-77.55-48.078C131.091,92.449,99.47,84.195,80.56,84.195L80.013,84.198z"
+     id="path37" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M58.948,91.957c-1.946,2.019-3.391,4.03-4.382,6.027  c1.752-2.602,3.395-4.758,4.689-6.348C59.152,91.744,59.058,91.843,58.948,91.957z"
+     id="path39" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M237.41,203.234c-7.309-15.123-7.799-30.246,1.814-45.368  c-28.572,17.143-205.211-18.455-184.659-59.882c-8.65,12.848-19.843,36.443-3.614,55.056  C91.7,199.775,240.579,205.499,237.41,203.234z"
+     id="path41" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M59.255,91.636C63.388,87.321,62.306,87.889,59.255,91.636  L59.255,91.636z"
+     id="path43" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_hairdresser.svg b/images/svg/shopping/shopping_hairdresser.svg
index 0ea7e19..098a428 100644
--- a/images/svg/shopping/shopping_hairdresser.svg
+++ b/images/svg/shopping/shopping_hairdresser.svg
@@ -1,66 +1,79 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="shopping_hairdresser.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="373.2098" inkscape:cx="351.80731" inkscape:zoom="0.92167712" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="1" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="-4" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1280" inkscape:window-height="1005">
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective2918" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M36.24-220.405L149.555-175.7c1.069,0.422,2.191,0.629,3.308,0.629
-	c1.811,0,3.606-0.545,5.137-1.606c2.475-1.716,3.93-4.554,3.878-7.565l-0.986-56.982c-0.074-4.234-3.083-7.847-7.235-8.682
-	l-111.59-22.465c-3.13-0.629-6.361,0.443-8.493,2.821l-13.045,14.555c-2.655,2.962-3.055,7.313-0.984,10.709l12.306,20.187
-	C32.873-222.422,34.414-221.125,36.24-220.405z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M172.663,187.091l123.525,36.979l0.829-2.35l0.004,2.469v-2.481
-	l1.053-2.982l-116.603-47.618l6.118-11.1l123.106,36.853l0.829-2.35l0.004,2.469v-2.481l1.053-2.982l-116.204-47.455l6.016-10.916
-	l119.689,35.831l0.829-2.35l0.004,2.469v-2.481l1.053-2.982l-112.955-46.128l5.074-9.207L334.971,145.1
-	c2.185,0.675,4.508-0.493,5.271-2.645c0.762-2.153-0.312-4.524-2.433-5.372c-10.83-4.328-106.378-42.287-126.027-42.287
-	c-0.747,0-1.408,0.046-2.018,0.142c-3.055,0.477-8.168,1.274-46.394,65.63c-26.628,44.831-61.478,107.731-88.783,160.248
-	c-48.793,93.841-46.337,100.693-45.289,103.62c1.274,3.558,4.26,11.889,69.87,33.708c31.562,10.496,62.831,19.155,63.143,19.241
-	c0.378,0.104,0.759,0.154,1.135,0.154c0.063,0,0.126-0.001,0.188-0.004c2.271-0.089,4.085-1.959,4.085-4.252
-	c0-1.869-1.205-3.456-2.88-4.028l-120.184-49.9l5.422-9.838l127.715,38.233l0.829-2.35l0.004,2.469v-2.481l1.053-2.981
-	L59.091,393.161l6.52-11.829l127.835,38.269l0.829-2.35l0.004,2.469v-2.481l1.053-2.981L74.631,364.965L82,351.595l127.634,38.209
-	l0.829-2.35l0.004,2.469v-2.481l1.053-2.981L91.01,335.246l6.739-12.229l127.78,38.253l0.829-2.35l0.004,2.469v-2.481l1.053-2.981
-	l-120.649-49.271l6.488-11.773l126.838,37.971l0.829-2.35l0.004,2.469v-2.481l1.053-2.981l-119.753-48.904l5.399-9.796
-	l126.683,37.924l0.829-2.35l0.004,2.469v-2.481l1.053-2.981l-119.605-48.844l6.432-11.669l127.677,38.222l0.829-2.35l0.004,2.469
-	v-2.481l1.053-2.982l-120.551-49.23l5.569-10.104l128.32,38.415l0.829-2.35l0.004,2.469v-2.481l1.053-2.982l-121.163-49.48
-	L172.663,187.091z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M523.667,400.297c-9.109-6.432-19.119-9.692-29.751-9.692
-	c-13.38,0-24.538,5.158-30.583,8.669l-25.803-94.35c1.729-7.034,3.434-14.063,5.103-21.053c9.842-41.209,11.105-48.818,11.94-53.854
-	c0.736-4.431,1.141-6.872,7.105-29.833c4.422-17.022,11.622-58.357,16.796-91.771c2.911-18.797,5.323-35.997,6.792-48.432
-	c2.694-22.796,1.704-24.208,0.657-25.703c-0.728-1.039-1.854-1.701-3.091-1.818c-0.237-0.022-0.464-0.033-0.678-0.033
-	c-1.858,0-3.425,0.809-4.298,2.219c-0.202,0.326-0.356,0.68-0.458,1.05L420.65,243.203L363.534,34.355
-	c-0.102-0.37-0.256-0.724-0.458-1.05c-0.873-1.411-2.439-2.219-4.297-2.219c-0.216,0-0.443,0.01-0.679,0.033
-	c-1.236,0.117-2.362,0.779-3.091,1.818c-1.047,1.495-2.037,2.906,0.657,25.703c1.469,12.435,3.881,29.635,6.792,48.431
-	c5.174,33.414,12.374,74.749,16.796,91.771c5.965,22.961,6.369,25.402,7.105,29.833c0.835,5.035,2.099,12.645,11.94,53.854
-	c1.781,7.458,3.602,14.961,5.451,22.468l-26.151,95.622c-6.045-3.511-17.204-8.669-30.584-8.669c-10.632,0-20.642,3.261-29.75,9.692
-	c-25.397,17.931-31.711,47.355-18.261,85.093c7.24,20.315,24.637,33.442,44.317,33.441c11.543,0,22.156-4.583,29.885-12.904
-	c10.591-11.402,29.092-68.827,47.44-136.769c18.229,67.355,36.557,124.098,47.077,135.424c7.729,8.322,18.342,12.905,29.885,12.905
-	c19.682,0,37.077-13.127,44.317-33.442C555.379,447.65,549.064,418.227,523.667,400.297z M498.307,407.752l0.058,3.998
-	c15.128,0.038,32.045,18.614,32.039,43.492c-0.027,25.147-17.274,44.652-32.136,44.652c-14.442-0.035-32.739-22.875-32.711-48.494
-	c0.028-24.491,17.021-39.65,32.75-39.65V407.752L498.307,407.752z M342.628,409.097v3.998c15.729,0,32.721,15.159,32.748,39.649
-	c0.029,25.619-18.268,48.46-32.754,48.495c-14.817-0.002-32.064-19.507-32.092-44.727c-0.006-24.805,16.91-43.381,32.039-43.418
-	L342.628,409.097L342.628,409.097z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_hairdresser.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata20"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="560.66364"
+     inkscape:cx="286.13511"
+     inkscape:zoom="0.76571415"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776" /><defs
+     id="defs4" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M172.663,187.091l123.525,36.979l0.829-2.35l0.004,2.469v-2.481  l1.053-2.982l-116.603-47.618l6.118-11.1l123.106,36.853l0.829-2.35l0.004,2.469v-2.481l1.053-2.982l-116.204-47.455l6.016-10.916  l119.689,35.831l0.829-2.35l0.004,2.469v-2.481l1.053-2.982l-112.955-46.128l5.074-9.207L334.971,145.1  c2.185,0.675,4.508-0.493,5.271-2.645c0.762-2.153-0.312-4.524-2.433-5.372c-10.83-4.328-106.378-42.287-126.027-42.287  c-0.747,0-1.408,0.046-2.018,0.142c-3.055,0.477-8.168,1.274-46.394,65.63c-26. [...]
+     id="path16" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M523.667,400.297c-9.109-6.432-19.119-9.692-29.751-9.692  c-13.38,0-24.538,5.158-30.583,8.669l-25.803-94.35c1.729-7.034,3.434-14.063,5.103-21.053c9.842-41.209,11.105-48.818,11.94-53.854  c0.736-4.431,1.141-6.872,7.105-29.833c4.422-17.022,11.622-58.357,16.796-91.771c2.911-18.797,5.323-35.997,6.792-48.432  c2.694-22.796,1.704-24.208,0.657-25.703c-0.728-1.039-1.854-1.701-3.091-1.818c-0.237-0.022-0.464-0.033-0.678-0.033  c-1.858,0-3.425,0.809-4.298,2.219c-0.202,0.326-0.356,0.68-0.458, [...]
+     id="path18" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_hifi.svg b/images/svg/shopping/shopping_hifi.svg
index 4505d10..a14188a 100644
--- a/images/svg/shopping/shopping_hifi.svg
+++ b/images/svg/shopping/shopping_hifi.svg
@@ -1,82 +1,83 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="shopping_hifi.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="198.28305" inkscape:cx="279.80938" inkscape:zoom="0.92167712" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="1" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="-4" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1280" inkscape:window-height="1005" inkscape:guide-bbox="true [...]
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="6.1230318e-14 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3826" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3855" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3909" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3950" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3972" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3994" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4016" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4837" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4971" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M152.863-175.071c1.811,0,3.606-0.545,5.137-1.606
-	c2.475-1.716,3.93-4.554,3.878-7.565l-0.986-56.982c-0.074-4.234-3.083-7.847-7.235-8.682l-111.59-22.465
-	c-3.13-0.629-6.361,0.443-8.493,2.821l-13.045,14.555c-2.655,2.962-3.055,7.313-0.984,10.709l12.306,20.187
-	c1.022,1.676,2.563,2.973,4.389,3.694L149.555-175.7C150.624-175.278,151.746-175.071,152.863-175.071z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M523.943,334.229H64.115c-8.931,0-16.125,7.195-16.125,16.125
-	v55.918c0,8.932,7.195,16.126,16.125,16.126h14.79c-0.56,1.585-0.879,3.282-0.879,5.059c0,8.405,6.814,15.22,15.219,15.22h55.804
-	c8.405,0,15.219-6.814,15.219-15.22c0-1.776-0.32-3.474-0.879-5.059H424.91c-0.559,1.585-0.879,3.282-0.879,5.059
-	c0,8.405,6.813,15.22,15.219,15.22h55.805c8.405,0,15.219-6.814,15.219-15.22c0-1.776-0.32-3.474-0.879-5.059h14.549
-	c8.931,0,16.126-7.194,16.126-16.126v-55.918C540.069,341.424,532.874,334.229,523.943,334.229z M63.205,386.466v-13.772
-	c0-6.385,5.15-11.535,11.535-11.535h67.007c6.385,0,11.497,5.15,11.497,11.535v13.772c0,6.385-5.112,11.534-11.497,11.534H74.739
-	C68.355,398,63.205,392.851,63.205,386.466z M274.66,386.466c0,6.385-5.112,11.534-11.497,11.534h-67.007
-	c-6.385,0-11.535-5.149-11.535-11.534v-13.772c0-6.385,5.15-11.535,11.535-11.535h67.007c6.385,0,11.497,5.15,11.497,11.535V386.466
-	z M396.076,386.466c0,6.385-5.111,11.534-11.496,11.534h-67.007c-6.385,0-11.535-5.149-11.535-11.534v-13.772
-	c0-6.385,5.15-11.535,11.535-11.535h67.007c6.385,0,11.496,5.15,11.496,11.535V386.466z M517.493,386.466
-	c0,6.385-5.111,11.534-11.496,11.534h-67.008c-6.385,0-11.534-5.149-11.534-11.534v-13.772c0-6.385,5.149-11.535,11.534-11.535
-	h67.008c6.385,0,11.496,5.15,11.496,11.535V386.466z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M523.943,150.62H64.115c-8.931,0-16.125,7.195-16.125,16.125v87.881
-	c0,8.931,7.195,16.125,16.125,16.125h14.797c-0.564,1.591-0.887,3.296-0.887,5.081c0,8.406,6.814,15.22,15.219,15.22h55.804
-	c8.405,0,15.219-6.814,15.219-15.22c0-1.784-0.323-3.489-0.887-5.081h261.538c-0.564,1.591-0.888,3.296-0.888,5.081
-	c0,8.406,6.813,15.22,15.219,15.22h55.805c8.405,0,15.219-6.814,15.219-15.22c0-1.784-0.323-3.489-0.888-5.081h14.558
-	c8.931,0,16.126-7.195,16.126-16.125v-87.881C540.069,157.815,532.874,150.62,523.943,150.62z M68.972,199.343V185.57
-	c0-6.385,5.112-11.535,11.497-11.535h67.007c6.385,0,11.535,5.15,11.535,11.535v13.773c0,6.385-5.15,11.535-11.535,11.535H80.469
-	C74.084,210.878,68.972,205.728,68.972,199.343z M466.84,260.469c-25.216,0-45.684-20.429-45.684-45.645
-	c0-25.216,20.468-45.645,45.684-45.645s45.645,20.429,45.645,45.645C512.484,240.04,492.056,260.469,466.84,260.469z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_hifi.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata29"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="494.93551"
+     inkscape:cx="281.50501"
+     inkscape:zoom="0.84868395"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776"
+     inkscape:guide-bbox="true"
+     showguides="true" /><defs
+     id="defs4" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M523.943,334.229H64.115c-8.931,0-16.125,7.195-16.125,16.125  v55.918c0,8.932,7.195,16.126,16.125,16.126h14.79c-0.56,1.585-0.879,3.282-0.879,5.059c0,8.405,6.814,15.22,15.219,15.22h55.804  c8.405,0,15.219-6.814,15.219-15.22c0-1.776-0.32-3.474-0.879-5.059H424.91c-0.559,1.585-0.879,3.282-0.879,5.059  c0,8.405,6.813,15.22,15.219,15.22h55.805c8.405,0,15.219-6.814,15.219-15.22c0-1.776-0.32-3.474-0.879-5.059h14.549  c8.931,0,16.126-7.194,16.126-16.126v-55.918C540.069,341.424,532.874,334. [...]
+     id="path25" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M523.943,150.62H64.115c-8.931,0-16.125,7.195-16.125,16.125v87.881  c0,8.931,7.195,16.125,16.125,16.125h14.797c-0.564,1.591-0.887,3.296-0.887,5.081c0,8.406,6.814,15.22,15.219,15.22h55.804  c8.405,0,15.219-6.814,15.219-15.22c0-1.784-0.323-3.489-0.887-5.081h261.538c-0.564,1.591-0.888,3.296-0.888,5.081  c0,8.406,6.813,15.22,15.219,15.22h55.805c8.405,0,15.219-6.814,15.219-15.22c0-1.784-0.323-3.489-0.888-5.081h14.558  c8.931,0,16.126-7.195,16.126-16.125v-87.881C540.069,157.815,532.874, [...]
+     id="path27" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_jewelry.svg b/images/svg/shopping/shopping_jewelry.svg
index 25a5ead..a24d7e1 100644
--- a/images/svg/shopping/shopping_jewelry.svg
+++ b/images/svg/shopping/shopping_jewelry.svg
@@ -1,43 +1,88 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docbase="s:\Data\FacilityIcons" sodipodi:docname="shopping_jewelry.svg" inkscape:version="0.46" sodi [...]
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<polygon opacity="0.33" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" points="417.956,109.62 341.506,59.524 
-	324.201,59.524 254.912,59.524 249.23,59.524 172.78,109.62 233.673,222.646 295.367,215.243 357.063,222.646 "/>
-<path opacity="0.66" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M362.153,218.065l58.812-109.199l-76.728-50.284
-	l-0.159-1.335H342.2h-93.663h-0.766l-0.049,0.534l-77.949,51.084l58.746,109.079l-1.078,7.786l4.95-0.597l0,0l62.978-7.592
-	l62.978,7.592v0l4.628,0.558L362.153,218.065z M336.531,131.274l8.165,75.905l-48.359-5.83h-0.001l-0.968-0.117l-0.968,0.117h-0.001
-	l-48.037,5.791l10.507-75.866H336.531z M195.362,122.23l45.378,7.471l-8.46,61.08L195.362,122.23z M352.602,129.272l42.773-7.042
-	l-36.284,67.371L352.602,129.272z M388.503,106.952l-37.747,6.214l-4.01-33.58L388.503,106.952z M329.705,73.439l4.973,41.642
-	H258.69l3.849-41.642H329.705z M242.573,113.593l-40.339-6.641l43.587-28.565L242.573,113.593z"/>
-<sodipodi:namedview  showgrid="false" inkscape:cy="442.3878" inkscape:cx="181.98368" inkscape:zoom="1.8433542" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:current-layer="svg2" inkscape:window-y="45" inkscape:window-x="0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1400" inkscape:window-height="978">
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="6.1230318e-14 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M295.114,509.804c-90.733,0-164.551-73.816-164.551-164.55
-	c0-90.734,73.817-164.552,164.551-164.552s164.551,73.817,164.551,164.552C459.665,435.987,385.848,509.804,295.114,509.804z
-	 M295.114,241.089c-57.436,0-104.164,46.728-104.164,104.165c0,57.436,46.728,104.163,104.164,104.163
-	c57.437,0,104.164-46.728,104.164-104.163C399.278,287.817,352.551,241.089,295.114,241.089z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_jewelry.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata20"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><polygon
+     opacity="0.33"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     points="417.956,109.62 341.506,59.524   324.201,59.524 254.912,59.524 249.23,59.524 172.78,109.62 233.673,222.646 295.367,215.243 357.063,222.646 "
+     id="polygon3" /><path
+     opacity="0.66"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M362.153,218.065l58.812-109.199l-76.728-50.284  l-0.159-1.335H342.2h-93.663h-0.766l-0.049,0.534l-77.949,51.084l58.746,109.079l-1.078,7.786l4.95-0.597l0,0l62.978-7.592  l62.978,7.592v0l4.628,0.558L362.153,218.065z M336.531,131.274l8.165,75.905l-48.359-5.83h-0.001l-0.968-0.117l-0.968,0.117h-0.001  l-48.037,5.791l10.507-75.866H336.531z M195.362,122.23l45.378,7.471l-8.46,61.08L195.362,122.23z M352.602,129.272l42.773-7.042  l-36.284,67.371L352.602,129.272z M388.503,106.952l-37.747,6.2 [...]
+     id="path5" /><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="296.4745"
+     inkscape:cx="295.114"
+     inkscape:zoom="1.3412675"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776"
+     inkscape:window-maximized="1" /><defs
+     id="defs8" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M295.114,509.804c-90.733,0-164.551-73.816-164.551-164.55  c0-90.734,73.817-164.552,164.551-164.552s164.551,73.817,164.551,164.552C459.665,435.987,385.848,509.804,295.114,509.804z   M295.114,241.089c-57.436,0-104.164,46.728-104.164,104.165c0,57.436,46.728,104.163,104.164,104.163  c57.437,0,104.164-46.728,104.164-104.163C399.278,287.817,352.551,241.089,295.114,241.089z"
+     id="path18" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_mobile_phone.svg b/images/svg/shopping/shopping_mobile_phone.svg
index 7deae9b..ce168bf 100644
--- a/images/svg/shopping/shopping_mobile_phone.svg
+++ b/images/svg/shopping/shopping_mobile_phone.svg
@@ -1,84 +1,83 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="shopping_mobile_phone.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<path opacity="0.33" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M423.87,83.206L255.122,44.607
-	c-0.363-0.083-0.733-0.187-1.096-0.25c-11.24-1.982-22.112,5.15-24.687,16.406l-51.474,225.042l9.657,2.209l-0.341,3.696
-	l-10.136-2.318l-43.87,191.797c-2.658,11.619,4.569,23.133,16.189,25.791l168.749,38.598c11.619,2.657,23.1-4.577,25.757-16.196
-	l43.87-191.798l-48.874-11.179l-3.155-4.496l52.85,12.089l51.474-225.042C442.691,97.336,435.489,85.863,423.87,83.206z"/>
-<sodipodi:namedview  showgrid="false" inkscape:cy="81.977096" inkscape:cx="-391.0599" inkscape:zoom="0.46083856" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="1" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="-4" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1280" inkscape:window-height="1005">
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="6.1230318e-14 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3826" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3855" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3909" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3950" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3972" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3994" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4016" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<g>
-	<polygon fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" points="151.878,-241.068 40.288,-263.533 27.243,-248.978 
-		39.549,-228.791 152.864,-184.086 	"/>
-	<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M425.321,83.596l10.11-44.203c0.879-3.84-1.522-7.666-5.362-8.543
-		l-24.415-5.585c-3.841-0.878-7.666,1.523-8.544,5.363l-10.098,44.147L255.122,44.607c-0.363-0.083-0.733-0.187-1.096-0.25
-		c-11.24-1.982-22.112,5.15-24.687,16.406L133.175,481.19c-2.658,11.619,4.569,23.133,16.189,25.791l168.749,38.598
-		c11.619,2.657,23.1-4.577,25.757-16.196l96.164-420.426C442.579,97.829,436.079,86.842,425.321,83.596z M184.103,348.533
-		l5.105-22.318c1.458-6.379,7.775-10.314,14.153-8.855l23.613,5.401c6.378,1.458,10.355,7.749,8.896,14.127l-5.105,22.318
-		c-1.458,6.378-7.774,10.313-14.152,8.854l-23.614-5.4C186.621,361.201,182.644,354.911,184.103,348.533z M207.497,460.934
-		l-5.105,22.317c-1.459,6.379-7.775,10.314-14.153,8.855l-23.614-5.401c-6.378-1.458-10.354-7.749-8.896-14.127l5.105-22.318
-		c1.459-6.378,7.775-10.313,14.153-8.854l23.613,5.4C204.979,448.265,208.956,454.555,207.497,460.934z M202.422,430.101
-		l-23.614-5.401c-6.378-1.459-10.347-7.782-8.888-14.16l5.097-22.285c1.459-6.378,7.782-10.348,14.161-8.889l23.613,5.401
-		c6.378,1.459,10.347,7.782,8.889,14.16l-5.098,22.285C215.124,427.59,208.8,431.56,202.422,430.101z M269.437,475.101
-		l-5.105,22.318c-1.458,6.378-7.742,10.321-14.12,8.862l-23.613-5.4c-6.378-1.459-10.355-7.749-8.896-14.128l5.105-22.317
-		c1.458-6.379,7.774-10.314,14.152-8.855l23.614,5.401C266.952,462.44,270.896,468.723,269.437,475.101z M264.395,444.275
-		l-23.613-5.401c-6.378-1.458-10.347-7.782-8.889-14.16l5.098-22.285c1.458-6.378,7.782-10.347,14.16-8.888l23.613,5.4
-		c6.378,1.459,10.314,7.775,8.855,14.153l-5.097,22.285C277.063,441.758,270.773,445.734,264.395,444.275z M246.075,362.708
-		l5.105-22.318c1.459-6.378,7.775-10.313,14.153-8.855l23.614,5.401c6.377,1.459,10.322,7.742,8.863,14.119l-5.104,22.318
-		c-1.459,6.379-7.742,10.322-14.12,8.863l-23.613-5.401C248.594,375.376,244.617,369.086,246.075,362.708z M331.409,489.275
-		l-5.104,22.318c-1.459,6.378-7.741,10.322-14.12,8.863l-23.646-5.409c-6.378-1.459-10.321-7.741-8.863-14.119l5.105-22.318
-		c1.459-6.378,7.741-10.322,14.119-8.863l23.647,5.409C328.925,476.615,332.868,482.898,331.409,489.275z M345.592,427.27
-		l-5.097,22.285c-1.459,6.378-7.749,10.354-14.128,8.896l-23.646-5.408c-6.378-1.459-10.314-7.775-8.855-14.153l5.098-22.285
-		c1.459-6.377,7.749-10.354,14.127-8.896l23.647,5.409C343.115,414.576,347.051,420.892,345.592,427.27z M359.782,365.231
-		l-5.104,22.318c-1.459,6.377-7.742,10.321-14.12,8.862l-23.646-5.409c-6.378-1.458-10.321-7.741-8.863-14.119l5.105-22.318
-		c1.459-6.378,7.741-10.321,14.119-8.862l23.647,5.408C357.298,352.569,361.241,358.852,359.782,365.231z M414.809,127.405
-		l-41.066,179.542c-2.274,9.943-12.134,16.133-22.077,13.858l-134.839-30.842c-9.944-2.274-16.099-12.126-13.825-22.07
-		l41.066-179.542c2.274-9.943,12.101-16.14,22.044-13.866l134.839,30.842C410.895,107.603,417.083,117.462,414.809,127.405z"/>
-</g>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_mobile_phone.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata29"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><path
+     opacity="0.33"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M423.87,83.206L255.122,44.607  c-0.363-0.083-0.733-0.187-1.096-0.25c-11.24-1.982-22.112,5.15-24.687,16.406l-51.474,225.042l9.657,2.209l-0.341,3.696  l-10.136-2.318l-43.87,191.797c-2.658,11.619,4.569,23.133,16.189,25.791l168.749,38.598c11.619,2.657,23.1-4.577,25.757-16.196  l43.87-191.798l-48.874-11.179l-3.155-4.496l52.85,12.089l51.474-225.042C442.691,97.336,435.489,85.863,423.87,83.206z"
+     id="path3" /><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="294.39377"
+     inkscape:cx="286.6053"
+     inkscape:zoom="1.1649677"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776" /><defs
+     id="defs6" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     inkscape:connector-curvature="0"
+     id="path27"
+     d="m 425.321,83.596 10.11,-44.203 c 0.879,-3.84 -1.522,-7.666 -5.362,-8.543 l -24.415,-5.585 c -3.841,-0.878 -7.666,1.523 -8.544,5.363 L 387.012,74.775 255.122,44.607 c -0.363,-0.083 -0.733,-0.187 -1.096,-0.25 -11.24,-1.982 -22.112,5.15 -24.687,16.406 L 133.175,481.19 c -2.658,11.619 4.569,23.133 16.189,25.791 l 168.749,38.598 c 11.619,2.657 23.1,-4.577 25.757,-16.196 l 96.164,-420.426 c 2.545,-11.128 -3.955,-22.115 -14.713,-25.361 z m -241.218,264.937 5.105,-22.318 c 1.458,-6.379 7 [...]
+     stroke-width="param(outline-width)"
+     stroke="param(outline)"
+     fill="param(fill)" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_music.svg b/images/svg/shopping/shopping_music.svg
index b0e3954..84def58 100644
--- a/images/svg/shopping/shopping_music.svg
+++ b/images/svg/shopping/shopping_music.svg
@@ -1,108 +1,128 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="shopping_music.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<path id="path10992" opacity="0.3" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " d="
-	M39.059,156.858h507.77"/>
-<path id="path10994" opacity="0.3" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " d="
-	M39.059,216.858h507.77"/>
-<path id="path10996" opacity="0.3" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " d="
-	M39.059,276.858h507.77"/>
-<path id="path10998" opacity="0.3" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " d="
-	M39.059,336.858h507.77"/>
-<path id="path11000" opacity="0.3" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " d="
-	M39.059,396.858h507.77"/>
-<path id="path11002" opacity="0.3" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " d="
-	M39.059,456.858h507.77"/>
-<path id="path11004" opacity="0.3" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " d="
-	M39.059,516.858h507.77"/>
-<sodipodi:namedview  showgrid="false" inkscape:cy="204.16132" inkscape:cx="491.9285" inkscape:zoom="0.46083856" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="1" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="-4" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1280" inkscape:window-height="1005" inkscape:guide-bbox="true" [...]
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="6.1230318e-14 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3826" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3855" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3909" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3950" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3972" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3994" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4016" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4837" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4971" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective6216" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective6764" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective6817" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective6928" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective10781" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective10806" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective10878" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective10919" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<path id="path10961" sodipodi:type="arc" sodipodi:cx="101.26984" sodipodi:rx="52.169312" sodipodi:cy="408.14816" sodipodi:ry="52.169312" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="
-	M221.013,437.085c0,35.687-28.93,64.616-64.616,64.616c-35.687,0-64.617-28.93-64.617-64.616s28.93-64.616,64.617-64.616
-	C192.084,372.469,221.013,401.398,221.013,437.085z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" stroke-miterlimit="10" d="M455.203,342.154V65.948
-	c0.056-5.984-2.341-11.834-6.579-16.06c-4.163-4.152-9.928-6.534-15.814-6.534l-0.341,0.002c-5.88,0.092-11.603,2.563-15.703,6.779
-	c-0.054,0.055-0.099,0.117-0.151,0.172l-203.461,80.649c-5.016,0.631-9.766,2.961-13.303,6.601
-	c-4.082,4.198-6.388,9.959-6.334,15.814v218.943c-11.144-6.429-23.821-9.844-37.105-9.844c-41.156,0-74.639,33.465-74.639,74.6
-	c0,41.156,33.483,74.64,74.639,74.64c19.015,0,37.475-6.18,51.978-17.401c16.246-12.568,26.372-30.368,29.289-51.479
-	c0.265-1.501,0.347-3.155,0.438-5.004c0.14-2.854,0.203-5.854,0.172-8.25V164.023l172.145-68.235v189.105
-	c-11.144-6.428-23.82-9.843-37.104-9.843c-41.156,0-74.64,33.466-74.64,74.601c0,41.156,33.483,74.639,74.64,74.639
-	c19.015,0,37.474-6.18,51.978-17.401c16.246-12.568,26.372-30.368,29.288-51.479c0.266-1.501,0.347-3.155,0.438-5.004
-	C455.171,347.551,455.233,344.55,455.203,342.154z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_music.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata41"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><path
+     id="path10992"
+     opacity="0.3"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     d="  M39.059,156.858h507.77" /><path
+     id="path10994"
+     opacity="0.3"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     d="  M39.059,216.858h507.77" /><path
+     id="path10996"
+     opacity="0.3"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     d="  M39.059,276.858h507.77" /><path
+     id="path10998"
+     opacity="0.3"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     d="  M39.059,336.858h507.77" /><path
+     id="path11000"
+     opacity="0.3"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     d="  M39.059,396.858h507.77" /><path
+     id="path11002"
+     opacity="0.3"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     d="  M39.059,456.858h507.77" /><path
+     id="path11004"
+     opacity="0.3"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     d="  M39.059,516.858h507.77" /><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="204.16132"
+     inkscape:cx="168.60486"
+     inkscape:zoom="0.46083856"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776"
+     inkscape:guide-bbox="true"
+     showguides="true" /><defs
+     id="defs11" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     stroke-miterlimit="10"
+     d="M455.203,342.154V65.948  c0.056-5.984-2.341-11.834-6.579-16.06c-4.163-4.152-9.928-6.534-15.814-6.534l-0.341,0.002c-5.88,0.092-11.603,2.563-15.703,6.779  c-0.054,0.055-0.099,0.117-0.151,0.172l-203.461,80.649c-5.016,0.631-9.766,2.961-13.303,6.601  c-4.082,4.198-6.388,9.959-6.334,15.814v218.943c-11.144-6.429-23.821-9.844-37.105-9.844c-41.156,0-74.639,33.465-74.639,74.6  c0,41.156,33.483,74.64,74.639,74.64c19.015,0,37.475-6.18,51.978-17.401c16.246-12.568,26.372-30.368,29.289-51.479   [...]
+     id="path39" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_pet.svg b/images/svg/shopping/shopping_pet.svg
index 389c4b1..20178ae 100644
--- a/images/svg/shopping/shopping_pet.svg
+++ b/images/svg/shopping/shopping_pet.svg
@@ -1,76 +1,78 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="shopping_gift.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="270.84322" inkscape:cx="966.93631" inkscape:zoom="0.32586207" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="1" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="-4" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1280" inkscape:window-height="1005" inkscape:guide-bbox="true [...]
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="6.1230318e-14 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3826" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3855" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3909" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3950" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3972" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3994" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4016" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4837" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4971" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective16715" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective16740" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M152.863-175.071c1.811,0,3.606-0.545,5.137-1.606
-	c2.475-1.716,3.93-4.554,3.878-7.565l-0.986-56.982c-0.074-4.234-3.083-7.847-7.235-8.682l-111.59-22.465
-	c-3.13-0.629-6.361,0.443-8.493,2.821l-13.045,14.555c-2.655,2.962-3.055,7.313-0.984,10.709l12.306,20.187
-	c1.022,1.676,2.563,2.973,4.389,3.694L149.555-175.7C150.624-175.278,151.746-175.071,152.863-175.071z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M501.328,159.731c0-28.37,24.993-26.724,20.131-50.246
-	c-3.359-16.249-5.988-29.279-7.946-48.928c-1.39-13.941-1.833-28.801-16.313-28.204c-17.015,0.702-23.47,30.651-49.916,32.798
-	c-26.394,2.143-48.897-22.469-59.112-18.953c-10.129,3.485-6.943,30.963-0.938,50.479c9.438,30.674,30.025,70.56-7.506,76.564
-	c-37.532,6.005-102.086,12.01-148.625,73.562s-44.821,133.787-63.053,156.131c-61.189,74.989-123.892,44.199-123.892,106.59
-	c0,27.932,47.327,48.04,54.833,39.032S35.21,512.709,114.974,481c68.145-27.089,74.228-32.619,95.11-13.512h169.643
-	c0-24.115-1.723-28.898-41.66-28.898c6.38-19.142,32.314-65.45,46.727-65.45c12.75,0,27.961,0.702,27.961,29.795
-	c0,33.027,55.581,86.278,69.058,64.554c20.085-32.375-34.528-22.503-34.528-100.584c0-106.819,62.34-91.612,62.34-151.627
-	C509.623,185.252,501.328,181.197,501.328,159.731z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_pet.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata29"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="288.46592"
+     inkscape:cx="283.12219"
+     inkscape:zoom="1.1709173"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776"
+     inkscape:guide-bbox="true"
+     showguides="true" /><defs
+     id="defs4" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M501.328,159.731c0-28.37,24.993-26.724,20.131-50.246  c-3.359-16.249-5.988-29.279-7.946-48.928c-1.39-13.941-1.833-28.801-16.313-28.204c-17.015,0.702-23.47,30.651-49.916,32.798  c-26.394,2.143-48.897-22.469-59.112-18.953c-10.129,3.485-6.943,30.963-0.938,50.479c9.438,30.674,30.025,70.56-7.506,76.564  c-37.532,6.005-102.086,12.01-148.625,73.562s-44.821,133.787-63.053,156.131c-61.189,74.989-123.892,44.199-123.892,106.59  c0,27.932,47.327,48.04,54.833,39.032S35.21,512.709,114.974,481c [...]
+     id="path27" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_pet2.svg b/images/svg/shopping/shopping_pet2.svg
index e42f29e..e2e7d61 100644
--- a/images/svg/shopping/shopping_pet2.svg
+++ b/images/svg/shopping/shopping_pet2.svg
@@ -1,184 +1,138 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docbase="s:\Data\FacilityIcons" sodipodi:docname="shopping_pet2.svg" inkscape:version="0.46" sodipod [...]
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="30.49576" inkscape:cx="-793.91156" inkscape:zoom="0.45254834" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:current-layer="svg2" inkscape:window-y="20" inkscape:window-x="0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1400" inkscape:window-height="1003">
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective2466" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective3333" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective3401" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective3464" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="450 : 225 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 225 : 1" sodipodi:type="inkscape:persp3d" id="perspective3581" inkscape:persp3d-origin="225 : 150 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="450 : 225 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 225 : 1" sodipodi:type="inkscape:persp3d" id="perspective4312" inkscape:persp3d-origin="225 : 150 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective8860" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective8887" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="32 : 16 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 16 : 1" sodipodi:type="inkscape:persp3d" id="perspective4904" inkscape:persp3d-origin="16 : 10.666667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective9479" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective9690" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective9819" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective9817" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective9805" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective9803" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="32 : 16 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 16 : 1" sodipodi:type="inkscape:persp3d" id="perspective9801" inkscape:persp3d-origin="16 : 10.666667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective9799" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective9797" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="450 : 225 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 225 : 1" sodipodi:type="inkscape:persp3d" id="perspective9795" inkscape:persp3d-origin="225 : 150 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="450 : 225 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 225 : 1" sodipodi:type="inkscape:persp3d" id="perspective9793" inkscape:persp3d-origin="225 : 150 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective9791" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective9789" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective9787" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective9785" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective9783" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<sodipodi:namedview  inkscape:cy="250.37448" inkscape:cx="475.26707" inkscape:zoom="0.61399264" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" id="namedview4258" inkscape:window-y="26" inkscape:window-x="0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1012" inkscape:window-height="739">
-		</sodipodi:namedview>
-	
-		<inkscape:perspective  inkscape:vp_z="200 : 100 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 100 : 1" sodipodi:type="inkscape:persp3d" id="perspective11483" inkscape:persp3d-origin="100 : 66.666667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective34" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective13933" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective13955" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective2446" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="405.71429 : 204.28572 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 204.28572 : 1" sodipodi:type="inkscape:persp3d" id="perspective5571" inkscape:persp3d-origin="202.85715 : 136.19048 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="500 : 250 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 250 : 1" sodipodi:type="inkscape:persp3d" id="perspective5412" inkscape:persp3d-origin="250 : 166.66667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="32 : 16 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 16 : 1" sodipodi:type="inkscape:persp3d" id="perspective5233" inkscape:persp3d-origin="16 : 10.666667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="32 : 16 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 16 : 1" sodipodi:type="inkscape:persp3d" id="perspective14642" inkscape:persp3d-origin="16 : 10.666667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective14640" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective14638" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective14626" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective14624" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective14775" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective14839" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="425.82123 : 199.51877 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 199.51877 : 1" sodipodi:type="inkscape:persp3d" id="perspective2562" inkscape:persp3d-origin="212.91061 : 133.01251 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-1210.2219,-51.870914)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g9828" transform="matrix(48.14969,0,0,48.14969,-1870.5198,102.97115)" inkscape:label="Layout" display="none">
-	<rect id="rect9830" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect9832" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g14695" transform="matrix(48.14969,0,0,48.14969,-1210.2219,-182.06834)" inkscape:label="Layout" display="none">
-	<rect id="rect14697" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect14699" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M354.281,386.411c-4.628-19.655-3.939-39.976-5.118-60
-	c1.158-32.095-25.095-55.263-48.42-73.072c-12.04-6.863-25.009-12.349-38.673-14.932c-23.234-6.225-43.337,9.726-62.045,20.819
-	c-14.716,10.507-32.69,9.249-49.678,7.827c-40.399-2.33-85.791,11.629-107.526,48.073c-15.812,23.484-17.124,54.698-4.513,79.881
-	c11.411,20.597,24.02,41.828,44.38,54.87c20.412,15.414,46.169,18.434,70.114,24.86c26.349,6.167,40.163,31.339,58.956,48.266
-	c28.33,28.29,71.156,38.235,109.796,30.182c37.351-11.979,67.634-49.712,65.478-89.89
-	C382.797,435.52,369.223,409.903,354.281,386.411z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M138.448,245.191c17.746,2.505,36.459-3.841,48.426-17.341
-	c10.819-11.022,16.109-25.873,19.662-40.591c7.84-30.535,9.86-64.589-4.116-93.714c-8.64-14.327-21.37-26.832-36.872-33.525
-	c-21.651-9.416-47.145-1.04-63.656,14.576c-22.74,23.757-30.717,57.689-31.662,89.673c-1.106,14.695,2.799,29.262,9.154,42.419
-	C89.786,229.283,113.386,245.327,138.448,245.191z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M294.346,220.328c32.991-2.147,57.03-41.184,57.03-41.184
-	c27.308-36.739,30.748-69.18,30.748-69.18c6.389-49.375-24.239-67.813-24.239-67.813c-27.461-16.558-60.139-9.386-60.139-9.386
-	c-39.001,9.269-57.249,52.6-57.249,52.6c-17.991,41.701-8.706,84.276-8.706,84.276C245.259,230.379,294.346,220.328,294.346,220.328
-	z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M383.747,290.898c30.167,12.211,74.134-14.422,74.134-14.422
-	c39.323-19.413,57.79-55.404,57.79-55.404c29.763-40.787-1.417-74.42-1.417-74.42c-39.243-44.503-99.411-8.341-99.411-8.341
-	c-45.778,21.281-61.572,83.887-61.572,83.887C347.555,282.235,383.747,290.898,383.747,290.898z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M540.879,311.928c-2.501-3.138-5.403-5.957-8.629-8.344
-	c-15.198-11.308-35.453-11.699-53.297-8.047c-22.897,3.742-42.846,17.022-60.901,30.92c-20.051,14.236-32.294,37.87-34.006,62.242
-	c-0.907,7.212-0.498,14.569,3.648,20.787c8.543,17.883,25.712,32.927,46.205,33.67c28.111-0.689,55.949-10.696,78.258-27.805
-	c14.635-12.07,28.304-26.25,36.329-43.665C557.744,352.5,555.406,327.891,540.879,311.928z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_pet2.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata71"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="286.44837"
+     inkscape:cx="291.89313"
+     inkscape:zoom="1.1569313"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776"
+     inkscape:window-maximized="1" /><defs
+     id="defs4" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-1210.2219,-51.870914)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g9828"
+     transform="matrix(48.14969,0,0,48.14969,-1870.5198,102.97115)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect9830"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect9832"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g14695"
+     transform="matrix(48.14969,0,0,48.14969,-1210.2219,-182.06834)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect14697"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect14699"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M354.281,386.411c-4.628-19.655-3.939-39.976-5.118-60  c1.158-32.095-25.095-55.263-48.42-73.072c-12.04-6.863-25.009-12.349-38.673-14.932c-23.234-6.225-43.337,9.726-62.045,20.819  c-14.716,10.507-32.69,9.249-49.678,7.827c-40.399-2.33-85.791,11.629-107.526,48.073c-15.812,23.484-17.124,54.698-4.513,79.881  c11.411,20.597,24.02,41.828,44.38,54.87c20.412,15.414,46.169,18.434,70.114,24.86c26.349,6.167,40.163,31.339,58.956,48.266  c28.33,28.29,71.156,38.235,109.796,30.182c37.351-11.979,6 [...]
+     id="path61" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M138.448,245.191c17.746,2.505,36.459-3.841,48.426-17.341  c10.819-11.022,16.109-25.873,19.662-40.591c7.84-30.535,9.86-64.589-4.116-93.714c-8.64-14.327-21.37-26.832-36.872-33.525  c-21.651-9.416-47.145-1.04-63.656,14.576c-22.74,23.757-30.717,57.689-31.662,89.673c-1.106,14.695,2.799,29.262,9.154,42.419  C89.786,229.283,113.386,245.327,138.448,245.191z"
+     id="path63" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M294.346,220.328c32.991-2.147,57.03-41.184,57.03-41.184  c27.308-36.739,30.748-69.18,30.748-69.18c6.389-49.375-24.239-67.813-24.239-67.813c-27.461-16.558-60.139-9.386-60.139-9.386  c-39.001,9.269-57.249,52.6-57.249,52.6c-17.991,41.701-8.706,84.276-8.706,84.276C245.259,230.379,294.346,220.328,294.346,220.328  z"
+     id="path65" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M383.747,290.898c30.167,12.211,74.134-14.422,74.134-14.422  c39.323-19.413,57.79-55.404,57.79-55.404c29.763-40.787-1.417-74.42-1.417-74.42c-39.243-44.503-99.411-8.341-99.411-8.341  c-45.778,21.281-61.572,83.887-61.572,83.887C347.555,282.235,383.747,290.898,383.747,290.898z"
+     id="path67" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M540.879,311.928c-2.501-3.138-5.403-5.957-8.629-8.344  c-15.198-11.308-35.453-11.699-53.297-8.047c-22.897,3.742-42.846,17.022-60.901,30.92c-20.051,14.236-32.294,37.87-34.006,62.242  c-0.907,7.212-0.498,14.569,3.648,20.787c8.543,17.883,25.712,32.927,46.205,33.67c28.111-0.689,55.949-10.696,78.258-27.805  c14.635-12.07,28.304-26.25,36.329-43.665C557.744,352.5,555.406,327.891,540.879,311.928z"
+     id="path69" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_photo.svg b/images/svg/shopping/shopping_photo.svg
index 77cbe70..4f8bb13 100644
--- a/images/svg/shopping/shopping_photo.svg
+++ b/images/svg/shopping/shopping_photo.svg
@@ -1,69 +1,96 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="shopping_photo.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="373.10457" inkscape:cx="498.72206" inkscape:zoom="0.65172414" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="1" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="1276" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1280" inkscape:window-height="941">
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="6.1230318e-14 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3826" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3855" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3909" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective11014" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective11066" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective15015" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective15058" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M204.732,139.377h172.625c0.927,0,1.78-0.503,2.23-1.313
-	c0.449-0.811,0.423-1.801-0.067-2.587l-23.313-37.328c-0.466-0.746-1.283-1.199-2.163-1.199H230.306
-	c-0.841,0-1.628,0.415-2.104,1.108l-25.574,37.328c-0.535,0.781-0.594,1.793-0.152,2.63S203.786,139.377,204.732,139.377z
-	 M315.363,106.508v24.146h-46.77v-24.146H315.363z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M428.7,139.131h68.214c0.842,0,1.629-0.415,2.104-1.109
-	c0.475-0.694,0.577-1.579,0.272-2.363l-8.263-21.295c-0.38-0.981-1.324-1.627-2.377-1.627H437.75c-1.022,0-1.947,0.611-2.347,1.553
-	l-9.05,21.295c-0.335,0.788-0.252,1.691,0.22,2.404C427.046,138.702,427.845,139.131,428.7,139.131z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M101.108,138.983h45.886c0.777,0,1.512-0.354,1.996-0.963
-	c0.483-0.608,0.664-1.404,0.488-2.162l-3.197-13.82c-0.268-1.156-1.297-1.975-2.484-1.975h-38.263c-1.109,0-2.09,0.716-2.429,1.772
-	l-4.426,13.82c-0.248,0.776-0.111,1.623,0.369,2.281C99.529,138.595,100.294,138.983,101.108,138.983z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M504.813,148.844H78.25c-24.651,0-44.5,19.849-44.5,44.5v237.813
-	c0,24.651,19.849,44.5,44.5,44.5h426.563c24.651,0,44.5-19.849,44.5-44.5V193.344C549.313,168.692,529.464,148.844,504.813,148.844z
-	 M338.5,428.094c-65.251,0-118.156-52.904-118.156-118.156c0-65.251,52.905-118.125,118.156-118.125
-	c65.251,0,118.156,52.874,118.156,118.125C456.656,375.19,403.751,428.094,338.5,428.094z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M338.475,239.343c-38.981,0.012-70.572,31.623-70.559,70.604
-	c0,0.015,0,0.029,0,0.045c0.012,38.98,31.623,70.572,70.604,70.559c38.981-0.012,70.572-31.623,70.56-70.604c0-0.016,0-0.03,0-0.045
-	C409.067,270.921,377.456,239.33,338.475,239.343z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_photo.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata31"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="293.6965"
+     inkscape:cx="291.5315"
+     inkscape:zoom="1.5109696"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776" /><defs
+     id="defs4" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M204.732,139.377h172.625c0.927,0,1.78-0.503,2.23-1.313  c0.449-0.811,0.423-1.801-0.067-2.587l-23.313-37.328c-0.466-0.746-1.283-1.199-2.163-1.199H230.306  c-0.841,0-1.628,0.415-2.104,1.108l-25.574,37.328c-0.535,0.781-0.594,1.793-0.152,2.63S203.786,139.377,204.732,139.377z   M315.363,106.508v24.146h-46.77v-24.146H315.363z"
+     id="path21" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M428.7,139.131h68.214c0.842,0,1.629-0.415,2.104-1.109  c0.475-0.694,0.577-1.579,0.272-2.363l-8.263-21.295c-0.38-0.981-1.324-1.627-2.377-1.627H437.75c-1.022,0-1.947,0.611-2.347,1.553  l-9.05,21.295c-0.335,0.788-0.252,1.691,0.22,2.404C427.046,138.702,427.845,139.131,428.7,139.131z"
+     id="path23" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M101.108,138.983h45.886c0.777,0,1.512-0.354,1.996-0.963  c0.483-0.608,0.664-1.404,0.488-2.162l-3.197-13.82c-0.268-1.156-1.297-1.975-2.484-1.975h-38.263c-1.109,0-2.09,0.716-2.429,1.772  l-4.426,13.82c-0.248,0.776-0.111,1.623,0.369,2.281C99.529,138.595,100.294,138.983,101.108,138.983z"
+     id="path25" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M504.813,148.844H78.25c-24.651,0-44.5,19.849-44.5,44.5v237.813  c0,24.651,19.849,44.5,44.5,44.5h426.563c24.651,0,44.5-19.849,44.5-44.5V193.344C549.313,168.692,529.464,148.844,504.813,148.844z   M338.5,428.094c-65.251,0-118.156-52.904-118.156-118.156c0-65.251,52.905-118.125,118.156-118.125  c65.251,0,118.156,52.874,118.156,118.125C456.656,375.19,403.751,428.094,338.5,428.094z"
+     id="path27" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M338.475,239.343c-38.981,0.012-70.572,31.623-70.559,70.604  c0,0.015,0,0.029,0,0.045c0.012,38.98,31.623,70.572,70.604,70.559c38.981-0.012,70.572-31.623,70.56-70.604c0-0.016,0-0.03,0-0.045  C409.067,270.921,377.456,239.33,338.475,239.343z"
+     id="path29" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_supermarket.svg b/images/svg/shopping/shopping_supermarket.svg
index 1ba5c2f..f2b6be1 100644
--- a/images/svg/shopping/shopping_supermarket.svg
+++ b/images/svg/shopping/shopping_supermarket.svg
@@ -1,43 +1,52 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docbase="s:\Data\FacilityIcons" sodipodi:docname="supermarket.svg" inkscape:version="0.46" sodipodi: [...]
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="319.23647" inkscape:cx="318.83568" inkscape:zoom="0.46083856" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:current-layer="svg2" inkscape:window-y="88" inkscape:window-x="91" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1103" inkscape:window-height="783">
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective2466" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-</defs>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M551.012,83.98c-3.835-6.77-12.432-9.145-19.2-5.312l-49.409,27.997
-	c-3.418,1.937-5.871,5.211-6.77,9.036l-8.17,34.79H56.196c-4.353,0-8.46,2.012-11.128,5.451c-2.668,3.438-3.598,7.917-2.518,12.133
-	l49.668,193.826c1.419,5.535,6.041,9.666,11.701,10.455l308.017,42.937v16.321h-274.79c-6.052,0-11.199,3.824-13.192,9.183
-	c-4.206,2.108-8.082,4.961-11.469,8.503c-7.77,8.124-12.05,18.894-12.051,30.326c-0.002,23.772,18.688,43.115,41.664,43.118
-	c0.002,0,0.002,0,0.004,0c11.212,0,21.731-4.54,29.617-12.784c7.77-8.124,12.05-18.894,12.051-30.326c0-0.002,0-0.006,0-0.008
-	c-0.001-7.151-1.703-13.895-4.694-19.838h172.065c-3.731,6.552-5.727,14.04-5.728,21.838c-0.001,23.773,18.689,43.115,41.665,43.118
-	c0.002,0,0.003,0,0.005,0c11.212,0,21.73-4.54,29.616-12.784c7.77-8.124,12.05-18.894,12.051-30.326c0-0.002,0-0.006,0-0.008
-	c-0.001-7.966-2.109-15.429-5.766-21.838h3.037c7.78,0,14.087-6.307,14.087-14.087V401.72l52.701-234.048
-	c0.247-1.098,0.352-2.209,0.335-3.313l8.505-36.219L545.7,103.18C552.469,99.345,554.848,90.749,551.012,83.98z M137.46,331.476
-	h68.301v26.63l-69.851-9.737c0.977-1.481,1.549-3.254,1.549-5.161V331.476z M93.241,252.392h25.437v60.302h-9.984L93.241,252.392z
-	 M137.46,252.392h68.301v60.302H137.46V252.392z M427.375,312.694h-22.664v-60.302h38.822l-14.21,60.507
-	C428.694,312.767,428.043,312.694,427.375,312.694z M385.93,312.694h-70.303v-60.302h70.303V312.694z M296.846,312.694h-72.302
-	v-60.302h72.302V312.694z M315.627,233.61v-54.946h70.303v54.946H315.627z M296.846,233.61h-72.302v-54.946h72.302V233.61z
-	 M205.761,233.61H137.46v-54.946h68.301V233.61z M224.543,331.476h72.302v39.326l-72.302-10.078V331.476z M315.627,372.159v-40.684
-	h70.303v51.745l-70.396-9.813C315.589,372.998,315.627,372.583,315.627,372.159z M404.711,385.521v-54.046h20.25L412.31,385.35
-	c-0.117,0.499-0.202,1.004-0.264,1.512l-7.351-1.025C404.698,385.73,404.711,385.628,404.711,385.521z M447.853,233.998
-	c-0.844-0.249-1.735-0.388-2.66-0.388h-40.481v-54.946h56.136L447.853,233.998z M118.678,178.664v54.946h-30.25l-14.08-54.946
-	H118.678z M113.506,331.476h5.172v11.731c0,0.982,0.152,1.929,0.432,2.819l-1.944-0.271L113.506,331.476z M163.771,479.626
-	c0,0.002,0,0.002,0,0.004c0,6.258-2.311,12.119-6.504,16.504c-4.076,4.262-9.461,6.608-15.164,6.608c0,0-0.001,0-0.002,0
-	c-11.948-0.001-21.667-10.371-21.666-23.116c0-6.259,2.31-12.119,6.504-16.504c1.637-1.712,3.493-3.098,5.488-4.164
-	c1.478,0.526,3.062,0.828,4.72,0.828h16.055C159.526,463.827,163.771,471.207,163.771,479.626z M408.752,481.626
-	c0,0.002,0,0.002,0,0.004c-0.001,6.258-2.311,12.119-6.504,16.504c-4.077,4.262-9.462,6.608-15.163,6.608c-0.001,0-0.002,0-0.003,0
-	c-11.948-0.001-21.668-10.371-21.667-23.116c0.001-6.258,2.311-12.119,6.504-16.504c2.338-2.443,5.113-4.233,8.124-5.336h14.117
-	C402.642,462.922,408.751,471.525,408.752,481.626z"/>
-</svg>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_supermarket.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata10"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="279.21013"
+     inkscape:cx="297.47737"
+     inkscape:zoom="1.2926754"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="91"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1103"
+     inkscape:window-height="748"
+     inkscape:window-maximized="0" /><defs
+     id="defs4" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M551.012,83.98c-3.835-6.77-12.432-9.145-19.2-5.312l-49.409,27.997  c-3.418,1.937-5.871,5.211-6.77,9.036l-8.17,34.79H56.196c-4.353,0-8.46,2.012-11.128,5.451c-2.668,3.438-3.598,7.917-2.518,12.133  l49.668,193.826c1.419,5.535,6.041,9.666,11.701,10.455l308.017,42.937v16.321h-274.79c-6.052,0-11.199,3.824-13.192,9.183  c-4.206,2.108-8.082,4.961-11.469,8.503c-7.77,8.124-12.05,18.894-12.051,30.326c-0.002,23.772,18.688,43.115,41.664,43.118  c0.002,0,0.002,0,0.004,0c11.212,0,21.731-4.54,29 [...]
+     id="path8" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_tackle.svg b/images/svg/shopping/shopping_tackle.svg
index 8122293..2a6cfa3 100644
--- a/images/svg/shopping/shopping_tackle.svg
+++ b/images/svg/shopping/shopping_tackle.svg
@@ -1,87 +1,83 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="shopping_tackle.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<sodipodi:namedview  showgrid="false" inkscape:cy="160.53971" inkscape:cx="494.87957" inkscape:zoom="0.65172414" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="1" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="-4" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1280" inkscape:window-height="1005" inkscape:guide-bbox="true [...]
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="6.1230318e-14 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective2441" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="60 : 30 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 30 : 1" sodipodi:type="inkscape:persp3d" id="perspective3452" inkscape:persp3d-origin="30 : 20 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" id="perspective4471" inkscape:persp3d-origin="372.04724 : 350.78739 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="12 : 6 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 6 : 1" sodipodi:type="inkscape:persp3d" id="perspective4668" inkscape:persp3d-origin="6 : 4 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3826" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3855" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3909" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3950" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3972" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective3994" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4016" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4837" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective4971" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective6216" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective6764" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective6817" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective6928" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective10781" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-</defs>
-<g id="layer3" transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)" inkscape:label="Layout" display="none">
-	<rect id="rect4134" x="1" y="1" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="10" height="10"/>
-	<rect id="rect4136" x="2" y="2" display="inline" fill="none" stroke="#757575" stroke-width="0.1" width="8" height="8"/>
-</g>
-<g id="g3338" transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)">
-</g>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M195.026,348.627c-0.995,1.127-1.659,2.587-1.659,4.18
-	c0,2.123,1.194,3.98,2.853,5.041l90.028,42.99c3.914,1.925,5.573,4.445,5.573,8.095c0,4.843-4.047,8.823-8.824,8.823l-99.647-0.133
-	c-1.858,0-3.384,1.526-3.384,3.384c0,0.929,0.266,1.725,0.929,2.322c101.041,81.27,233.13,105.353,359.446,103.495V253.756
-	C304.757,251.633,195.026,348.627,195.026,348.627z M329.105,373.174c-11.743,0-21.363-9.554-21.363-21.297
-	c0-11.742,9.62-21.296,21.363-21.296c11.742,0,21.229,9.554,21.229,21.296C350.335,363.62,340.914,373.174,329.105,373.174z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M541.138,48.822c-20.301-4.246-33.57-5.771-48.895-5.573
-	c-78.085,0.863-154.446,34.167-240.095,104.424c-3.184-0.862-10.217-2.786-10.217-2.786c-13.6,0-24.679,11.013-24.679,24.613
-	c0,0,0.995,4.578,1.525,7.43c-2.653,2.455-69.195,64.95-69.195,64.95l-58.847,55.463c-5.506,5.042-12.671,7.563-20.168,7.23
-	c-7.431-0.331-14.264-3.582-19.24-9.088c-4.843-5.374-7.165-12.075-7.165-18.775c0-7.563,3.052-15.126,9.023-20.633
-	c0,0,4.445-2.455,7.828-4.379c0.73,5.042,2.787,20.434,2.787,20.434l48.032-61.168L58.89,229.01
-	c-13.932,4.776-19.704,11.809-19.903,12.141c-19.372,17.581-20.898,48.364-2.985,68.201c18.045,19.902,48.829,21.296,68.731,3.316
-	l0.531-0.662l55.794-53.142c0,0,68.931-65.148,71.12-67.338c3.317,0.862,9.819,2.521,9.819,2.521
-	c13.534,0,24.547-11.08,24.547-24.68c0,0-0.663-3.583-1.127-6.17c82.862-68.134,155.309-100.51,227.888-101.306
-	c14.928-0.133,26.869,1.791,46.44,5.971l4.047,0.863V49.353L541.138,48.822z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_tackle.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata32"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="294.92273"
+     inkscape:cx="283.62675"
+     inkscape:zoom="1.2549352"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776"
+     inkscape:guide-bbox="true"
+     showguides="true" /><defs
+     id="defs4" /><g
+     id="layer3"
+     transform="matrix(48.14969,0,0,48.14969,-536.27327,-33.306752)"
+     inkscape:label="Layout"
+     display="none"><rect
+       id="rect4134"
+       x="1"
+       y="1"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="10"
+       height="10" /><rect
+       id="rect4136"
+       x="2"
+       y="2"
+       display="inline"
+       fill="none"
+       stroke="#757575"
+       stroke-width="0.1"
+       width="8"
+       height="8" /></g><g
+     id="g3338"
+     transform="matrix(1.3973279,-0.2437849,0.2437849,1.3973279,-185.07402,-56.183307)" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M195.026,348.627c-0.995,1.127-1.659,2.587-1.659,4.18  c0,2.123,1.194,3.98,2.853,5.041l90.028,42.99c3.914,1.925,5.573,4.445,5.573,8.095c0,4.843-4.047,8.823-8.824,8.823l-99.647-0.133  c-1.858,0-3.384,1.526-3.384,3.384c0,0.929,0.266,1.725,0.929,2.322c101.041,81.27,233.13,105.353,359.446,103.495V253.756  C304.757,251.633,195.026,348.627,195.026,348.627z M329.105,373.174c-11.743,0-21.363-9.554-21.363-21.297  c0-11.742,9.62-21.296,21.363-21.296c11.742,0,21.229,9.554,21.229,21.296C350.3 [...]
+     id="path28" /><path
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M541.138,48.822c-20.301-4.246-33.57-5.771-48.895-5.573  c-78.085,0.863-154.446,34.167-240.095,104.424c-3.184-0.862-10.217-2.786-10.217-2.786c-13.6,0-24.679,11.013-24.679,24.613  c0,0,0.995,4.578,1.525,7.43c-2.653,2.455-69.195,64.95-69.195,64.95l-58.847,55.463c-5.506,5.042-12.671,7.563-20.168,7.23  c-7.431-0.331-14.264-3.582-19.24-9.088c-4.843-5.374-7.165-12.075-7.165-18.775c0-7.563,3.052-15.126,9.023-20.633  c0,0,4.445-2.455,7.828-4.379c0.73,5.042,2.787,20.434,2.787,20.434l48.032 [...]
+     id="path30" /></svg>
\ No newline at end of file
diff --git a/images/svg/shopping/shopping_video_rental.svg b/images/svg/shopping/shopping_video_rental.svg
index 0295eef..8d56068 100644
--- a/images/svg/shopping/shopping_video_rental.svg
+++ b/images/svg/shopping/shopping_video_rental.svg
@@ -1,66 +1,82 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1"
-	 id="svg2" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape" sodipodi:docname="tourist_cinema2.svg" inkscape:version="0.47 r22583" sodipodi:version="0.32"
-	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="580px" height="580px"
-	 viewBox="0 0 580 580" enable-background="new 0 0 580 580" xml:space="preserve">
-<path id="rect3445" opacity="0.3317" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " d="
-	M312.377,199.067c-1.793,1.206-3.659,2.287-5.607,3.199c-15.809,7.053-36.242,3.473-51.85,10.093
-	c-15.902,6.547-26.49,22.882-41.229,29.256c-13.962,5.842-30.525,1.798-44.33,7.388l36.183,75.201l135.627-65.273L312.377,199.067z"
-	/>
-<rect id="rect3447" x="235.544" y="297.269" transform="matrix(-0.9011 0.4336 -0.4336 -0.9011 751.0414 567.5414)" opacity="0.3317" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " width="150.514" height="144.295"/>
-<path id="rect3449" opacity="0.3317" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" enable-background="new    " d="
-	M416.076,414.646l-135.627,65.241l30.212,62.8c12.749-3.27,27.175-0.647,39.58-5.838c14.739-6.374,25.359-22.71,41.262-29.256
-	c15.608-6.621,36.041-3.041,51.85-10.094c3.444-1.611,6.583-3.771,9.599-6.2L416.076,414.646z"/>
-<sodipodi:namedview  showgrid="false" inkscape:cy="253.54186" inkscape:cx="60.568354" inkscape:zoom="0.79655172" pagecolor="#ffffff" bordercolor="#666666" guidetolerance="10.0" objecttolerance="10.0" gridtolerance="10.0" borderopacity="1.0" id="base" inkscape:window-maximized="0" inkscape:current-layer="svg2" inkscape:window-y="-4" inkscape:window-x="-4" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-width="1400" inkscape:window-height="1003">
-	</sodipodi:namedview>
-<defs>
-	
-	
-		<inkscape:perspective  inkscape:vp_z="580 : 290 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 290 : 1" sodipodi:type="inkscape:persp3d" id="perspective12" inkscape:persp3d-origin="290 : 193.33333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="32 : 16 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 16 : 1" sodipodi:type="inkscape:persp3d" id="perspective2539" inkscape:persp3d-origin="16 : 10.666667 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective18697" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-	
-		<inkscape:perspective  inkscape:vp_z="1 : 0.5 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 0.5 : 1" sodipodi:type="inkscape:persp3d" id="perspective18782" inkscape:persp3d-origin="0.5 : 0.33333333 : 1">
-		</inkscape:perspective>
-</defs>
-<path id="rect3391" fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M340.247,174.66
-	c-2.757,1.979-5.358,4.195-7.883,6.531l9.137,18.999l-14.579,7.025l-6.86-14.282c-2.475,2.232-4.996,4.326-7.685,6.135
-	l28.794,59.864l-135.627,65.273l-36.183-75.201c-0.626,0.253-1.233,0.53-1.847,0.825c-6.093,2.977-11.612,7.969-16.987,13.292
-	l11.775-5.673l11.346,23.517l-14.579,7.025l-10.852-22.561c-1.934,1.945-3.863,3.921-5.805,5.805l140.278,291.539
-	c2.917-2.932,5.85-5.898,8.839-8.642l-3.562,1.715l-11.346-23.517l14.578-7.025l10.192,21.208c0.881-0.526,1.799-1.009,2.704-1.451
-	c2.123-1.02,4.315-1.765,6.563-2.342l-30.212-62.833l135.627-65.241l36.875,76.653c9.419-7.59,17.432-17.975,28.068-24.111
-	L340.247,174.66z M355.947,230.27l11.313,23.517l-14.546,6.992l-11.313-23.517L355.947,230.27z M347.339,271.795l62.569,130.02
-	l-135.627,65.24l-62.569-130.02L347.339,271.795z M381.74,283.834l11.313,23.518l-14.579,6.992l-11.313-23.518L381.74,283.834z
-	 M188.096,311.012l11.313,23.518l-14.545,7.025l-11.346-23.517L188.096,311.012z M407.5,337.398l11.313,23.518l-14.546,7.025
-	l-11.313-23.55L407.5,337.398z M213.856,364.61l11.346,23.517l-14.579,6.992l-11.313-23.517L213.856,364.61z M433.293,390.964
-	l11.313,23.517l-14.578,7.025l-11.313-23.517L433.293,390.964z M239.648,418.175l11.313,23.518l-14.545,6.992l-11.346-23.518
-	L239.648,418.175z M459.053,444.528l11.313,23.55l-14.546,6.993l-11.313-23.518L459.053,444.528z M265.441,471.739l11.313,23.518
-	l-14.579,7.025l-11.313-23.55L265.441,471.739z"/>
-<path fill="param(fill)" stroke="param(outline)" stroke-width="param(outline-width)" d="M450.357,93.164c-1.843-1.57-3.583-3.053-4.503-4.455
-	c-0.244-0.372-0.537-0.709-0.871-1.004c-1.593-1.406-3.203-3.196-4.908-5.091c-4.932-5.482-11.069-12.305-20.239-12.305
-	c-1.219,0-2.465,0.124-3.712,0.369c-3.89,0.301-8.053,0.441-13.065,0.441c-4.085,0-8.283-0.095-12.343-0.188
-	c-4.124-0.094-8.388-0.191-12.605-0.191c-3.021,0-5.737,0.049-8.303,0.15h-0.892c-9.264,0-18.693,0.055-27.813,0.108
-	c-9.124,0.053-18.558,0.108-27.827,0.108c-22.206,0-39.277-0.33-55.011-1.066c-3.2-3.006-5.974-6.594-8.891-10.368
-	c-5.231-6.768-10.639-13.763-19.117-18.067c-14.107-9.333-31.116-14.259-47.729-13.763l-0.35-0.001
-	c-23.413,0-46.058,11.442-62.129,31.393c-16.1,19.985-22.481,44.598-17.518,67.549c3.186,18.481,13.118,35.831,27.976,48.862
-	c15.117,13.26,33.727,20.562,52.401,20.562c2.306,0,4.635-0.113,6.926-0.335c27.083-1.704,52.583-17.381,66.825-41.016
-	c2.239-1.494,5.04-2.167,8.936-2.167c2.277,0,4.662,0.215,7.186,0.443c2.633,0.238,5.356,0.483,8.084,0.483
-	c4.4,0,10.903-0.562,16.554-5.42c0.117-0.1,0.229-0.206,0.336-0.316c2.121-2.195,4.142-4.558,6.095-6.843
-	c5.101-5.966,9.939-11.625,16.263-14.285c3.201,1.394,5.75,4.225,8.645,7.439c2.706,3.005,5.504,6.112,9.213,8.371
-	c1.633,0.995,3.688,0.971,5.298-0.061c3.272-2.096,5.831-4.986,8.306-7.781c3.698-4.177,6.284-6.914,9.704-7.461
-	c2.713,1.896,5.125,4.418,7.658,7.069c2.882,3.015,5.862,6.132,9.557,8.595c1.653,1.101,3.799,1.12,5.468,0.051
-	c3.383-2.165,6.053-5.17,8.636-8.077c3.956-4.453,6.764-7.339,10.335-7.894c2.275,1.563,4.325,3.763,6.477,6.072
-	c3.396,3.643,6.906,7.409,11.991,9.594c1.796,0.772,3.873,0.426,5.322-0.881c9.676-8.727,21.717-19.587,31.237-31.825
-	c0.688-0.885,1.06-1.975,1.054-3.095C458.979,100.509,454.199,96.437,450.357,93.164z M151.286,89.68
-	c10.214-0.261,17.13,7.901,19.912,14.868c2.803,7.022,3.277,16.92-3.801,23.643c-0.089,0.084-0.175,0.172-0.257,0.263
-	c-3.995,4.396-10.144,6.917-16.87,6.917c-8.847,0-19.06-4.521-21.936-14.619c-0.028-0.099-0.06-0.198-0.094-0.295
-	c-2.383-6.751-1.018-14.967,3.563-21.441c4.251-6.009,10.429-9.456,16.948-9.456c0.632,0,1.275,0.033,1.913,0.096
-	C150.87,89.676,151.076,89.685,151.286,89.68z"/>
-</svg>
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="shopping_video_rental.svg"
+   inkscape:version="0.91 r13725"
+   sodipodi:version="0.32"
+   x="0px"
+   y="0px"
+   width="580px"
+   height="580px"
+   viewBox="0 0 580 580"
+   enable-background="new 0 0 580 580"
+   xml:space="preserve"><metadata
+     id="metadata16"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><path
+     id="rect3445"
+     opacity="0.3317"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     d="  M312.377,199.067c-1.793,1.206-3.659,2.287-5.607,3.199c-15.809,7.053-36.242,3.473-51.85,10.093  c-15.902,6.547-26.49,22.882-41.229,29.256c-13.962,5.842-30.525,1.798-44.33,7.388l36.183,75.201l135.627-65.273L312.377,199.067z" /><rect
+     id="rect3447"
+     x="235.544"
+     y="297.269"
+     transform="matrix(-0.9011 0.4336 -0.4336 -0.9011 751.0414 567.5414)"
+     opacity="0.3317"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     width="150.514"
+     height="144.295" /><path
+     id="rect3449"
+     opacity="0.3317"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     enable-background="new    "
+     d="  M416.076,414.646l-135.627,65.241l30.212,62.8c12.749-3.27,27.175-0.647,39.58-5.838c14.739-6.374,25.359-22.71,41.262-29.256  c15.608-6.621,36.041-3.041,51.85-10.094c3.444-1.611,6.583-3.771,9.599-6.2L416.076,414.646z" /><sodipodi:namedview
+     showgrid="false"
+     inkscape:cy="284.70956"
+     inkscape:cx="290.95055"
+     inkscape:zoom="1.1346534"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     guidetolerance="10.0"
+     objecttolerance="10.0"
+     gridtolerance="10.0"
+     borderopacity="1.0"
+     id="base"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2"
+     inkscape:window-y="24"
+     inkscape:window-x="65"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1215"
+     inkscape:window-height="776" /><defs
+     id="defs7" /><path
+     id="rect3391"
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M340.247,174.66  c-2.757,1.979-5.358,4.195-7.883,6.531l9.137,18.999l-14.579,7.025l-6.86-14.282c-2.475,2.232-4.996,4.326-7.685,6.135  l28.794,59.864l-135.627,65.273l-36.183-75.201c-0.626,0.253-1.233,0.53-1.847,0.825c-6.093,2.977-11.612,7.969-16.987,13.292  l11.775-5.673l11.346,23.517l-14.579,7.025l-10.852-22.561c-1.934,1.945-3.863,3.921-5.805,5.805l140.278,291.539  c2.917-2.932,5.85-5.898,8.839-8.642l-3.562,1.715l-11.346-23.517l14.578-7.025l10.192,21.208c0.881-0.526,1.799-1.009,2. [...]
+     fill="param(fill)"
+     stroke="param(outline)"
+     stroke-width="param(outline-width)"
+     d="M450.357,93.164c-1.843-1.57-3.583-3.053-4.503-4.455  c-0.244-0.372-0.537-0.709-0.871-1.004c-1.593-1.406-3.203-3.196-4.908-5.091c-4.932-5.482-11.069-12.305-20.239-12.305  c-1.219,0-2.465,0.124-3.712,0.369c-3.89,0.301-8.053,0.441-13.065,0.441c-4.085,0-8.283-0.095-12.343-0.188  c-4.124-0.094-8.388-0.191-12.605-0.191c-3.021,0-5.737,0.049-8.303,0.15h-0.892c-9.264,0-18.693,0.055-27.813,0.108  c-9.124,0.053-18.558,0.108-27.827,0.108c-22.206,0-39.277-0.33-55.011-1.066c-3.2-3.006-5.974-6. [...]
+     id="path14" /></svg>
\ No newline at end of file
diff --git a/ms-windows/osgeo4w/package-nightly.cmd b/ms-windows/osgeo4w/package-nightly.cmd
index 1778856..e933845 100644
--- a/ms-windows/osgeo4w/package-nightly.cmd
+++ b/ms-windows/osgeo4w/package-nightly.cmd
@@ -56,7 +56,10 @@ if "%ARCH%"=="x86" goto devenv_x86
 goto devenv_x86_64
 
 :devenv_x86
-set GRASS_VERSIONS=6.4.4 7.0.1
+for /f "usebackq tokens=1" %%a in (`%OSGEO4W_ROOT%\bin\grass70 --config path`) do set GRASS70_PATH=%%a
+for %%i in ("%GRASS70_PATH%") do set GRASS70_VERSION=%%~nxi
+set GRASS70_VERSION=%GRASS70_VERSION:grass-=%
+set GRASS_VERSIONS=6.4.4 %GRASS70_VERSION%
 call "%PF86%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
 if exist "c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" call "c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /x86 /Release
 path %path%;%PF86%\Microsoft Visual Studio 10.0\VC\bin
@@ -69,7 +72,7 @@ set CMAKE_OPT=^
 	-D WITH_GRASS6=TRUE ^
 	-D WITH_GRASS7=TRUE ^
 	-D GRASS_PREFIX=%O4W_ROOT%/apps/grass/grass-6.4.4 ^
-	-D GRASS_PREFIX7=%O4W_ROOT%/apps/grass/grass-7.0.1 ^
+	-D GRASS_PREFIX7=%GRASS70_PATH:\=/% ^
 	-D CMAKE_CXX_FLAGS_RELWITHDEBINFO="/MD /ZI /MP /Od /D NDEBUG /D QGISDEBUG" ^
 	-D CMAKE_PDB_OUTPUT_DIRECTORY_RELWITHDEBINFO=%BUILDDIR%\apps\%PACKAGENAME%\pdb
 goto devenv
@@ -88,6 +91,7 @@ set CMAKE_OPT=^
 	-G "Visual Studio 10 Win64" ^
 	-D SPATIALINDEX_LIBRARY=%O4W_ROOT%/lib/spatialindex-64.lib ^
 	-D WITH_GRASS=TRUE ^
+	-D WITH_GRASS6=TRUE ^
 	-D WITH_GRASS7=FALSE ^
 	-D GRASS_PREFIX=%O4W_ROOT%/apps/grass/grass-6.4.3 ^
 	-D SIP_BINARY_PATH=%O4W_ROOT%/bin/sip.exe ^
diff --git a/ms-windows/osgeo4w/package.cmd b/ms-windows/osgeo4w/package.cmd
index 576050b..0b098c3 100644
--- a/ms-windows/osgeo4w/package.cmd
+++ b/ms-windows/osgeo4w/package.cmd
@@ -56,7 +56,10 @@ if "%ARCH%"=="x86" goto devenv_x86
 goto devenv_x86_64
 
 :devenv_x86
-set GRASS_VERSIONS=6.4.4 7.0.1
+for /f "usebackq tokens=1" %%a in (`%OSGEO4W_ROOT%\bin\grass70 --config path`) do set GRASS70_PATH=%%a
+for %%i in ("%GRASS70_PATH%") do set GRASS70_VERSION=%%~nxi
+set GRASS70_VERSION=%GRASS70_VERSION:grass-=%
+set GRASS_VERSIONS=6.4.4 %GRASS70_VERSION%
 call "%PF86%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
 if exist "c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" call "c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" /x86 /Release
 path %path%;%PF86%\Microsoft Visual Studio 10.0\VC\bin
@@ -69,7 +72,7 @@ set CMAKE_OPT=^
 	-D WITH_GRASS6=TRUE ^
 	-D WITH_GRASS7=TRUE ^
 	-D GRASS_PREFIX=%O4W_ROOT%/apps/grass/grass-6.4.4 ^
-	-D GRASS_PREFIX7=%O4W_ROOT%/apps/grass/grass-7.0.1
+	-D GRASS_PREFIX7=%GRASS70_PATH:\=/%
 goto devenv
 
 :devenv_x86_64
@@ -87,6 +90,7 @@ set CMAKE_OPT=^
 	-D SPATIALINDEX_LIBRARY=%O4W_ROOT%/lib/spatialindex-64.lib ^
 	-D WITH_GRASS=TRUE ^
 	-D WITH_GRASS6=TRUE ^
+	-D WITH_GRASS7=FALSE ^
 	-D GRASS_PREFIX=%O4W_ROOT%/apps/grass/grass-6.4.3 ^
 	-D SIP_BINARY_PATH=%O4W_ROOT%/bin/sip.exe ^
 	-D QWT_LIBRARY=%O4W_ROOT%/lib/qwt5.lib ^
@@ -397,6 +401,7 @@ tar -C %OSGEO4W_ROOT% -cjf %ARCH%/release/qgis/%PACKAGENAME%/%PACKAGENAME%-%VERS
 	"apps/%PACKAGENAME%/qtplugins/designer/" ^
 	"apps/%PACKAGENAME%/python/" ^
 	"apps/%PACKAGENAME%/resources/customization.xml" ^
+	"apps/%PACKAGENAME%/resources/themes/" ^
 	"bin/%PACKAGENAME%.bat.tmpl" ^
 	"bin/%PACKAGENAME%-browser.bat.tmpl" ^
 	"bin/%PACKAGENAME%-designer.bat.tmpl" ^
diff --git a/python/core/symbology-ng/qgsfillsymbollayerv2.sip b/python/core/symbology-ng/qgsfillsymbollayerv2.sip
index 81002a9..ea8df3f 100644
--- a/python/core/symbology-ng/qgsfillsymbollayerv2.sip
+++ b/python/core/symbology-ng/qgsfillsymbollayerv2.sip
@@ -438,7 +438,7 @@ class QgsImageFillSymbolLayer: QgsFillSymbolLayerV2
     void renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, QgsSymbolV2RenderContext& context );
 
     virtual QgsSymbolV2* subSymbol();
-    virtual bool setSubSymbol( QgsSymbolV2* symbol );
+    virtual bool setSubSymbol( QgsSymbolV2* symbol /Transfer/ );
 
     void setOutlineWidthUnit( QgsSymbolV2::OutputUnit unit );
     QgsSymbolV2::OutputUnit outlineWidthUnit() const;
@@ -457,6 +457,8 @@ class QgsImageFillSymbolLayer: QgsFillSymbolLayerV2
     virtual double dxfWidth( const QgsDxfExport& e, QgsSymbolV2RenderContext& context ) const;
     virtual QColor dxfColor( QgsSymbolV2RenderContext& context ) const;
     virtual Qt::PenStyle dxfPenStyle() const;
+
+    QSet<QString> usedAttributes() const;
 };
 
 /** \ingroup core
@@ -493,7 +495,7 @@ class QgsRasterFillSymbolLayer: QgsImageFillSymbolLayer
 
     //override QgsImageFillSymbolLayer's support for sub symbols
     virtual QgsSymbolV2* subSymbol();
-    virtual bool setSubSymbol( QgsSymbolV2* symbol );
+    virtual bool setSubSymbol( QgsSymbolV2* symbol /Transfer/ );
 
     /** Sets the path to the raster image used for the fill.
      * @param imagePath path to image file
@@ -756,7 +758,7 @@ class QgsLinePatternFillSymbolLayer: QgsImageFillSymbolLayer
     void setMapUnitScale( const QgsMapUnitScale& scale );
     QgsMapUnitScale mapUnitScale() const;
 
-    bool setSubSymbol( QgsSymbolV2* symbol );
+    bool setSubSymbol( QgsSymbolV2* symbol /Transfer/ );
     QgsSymbolV2* subSymbol();
 
     QSet<QString> usedAttributes() const;
@@ -802,7 +804,7 @@ class QgsPointPatternFillSymbolLayer : QgsImageFillSymbolLayer
     double displacementY() const;
     void setDisplacementY( double d );
 
-    bool setSubSymbol( QgsSymbolV2* symbol );
+    bool setSubSymbol( QgsSymbolV2* symbol /Transfer/ );
     virtual QgsSymbolV2* subSymbol();
 
     void setDistanceXUnit( QgsSymbolV2::OutputUnit unit );
diff --git a/python/core/symbology-ng/qgslinesymbollayerv2.sip b/python/core/symbology-ng/qgslinesymbollayerv2.sip
index 0392c50..8849803 100644
--- a/python/core/symbology-ng/qgslinesymbollayerv2.sip
+++ b/python/core/symbology-ng/qgslinesymbollayerv2.sip
@@ -128,7 +128,7 @@ class QgsMarkerLineSymbolLayerV2 : QgsLineSymbolLayerV2
     void setColor( const QColor& color );
 
     QgsSymbolV2* subSymbol();
-    bool setSubSymbol( QgsSymbolV2* symbol );
+    bool setSubSymbol( QgsSymbolV2* symbol /Transfer/);
 
     virtual void setWidth( double width );
     virtual double width() const;
diff --git a/python/core/symbology-ng/qgssymbolv2.sip b/python/core/symbology-ng/qgssymbolv2.sip
index cf8a318..cdae27a 100644
--- a/python/core/symbology-ng/qgssymbolv2.sip
+++ b/python/core/symbology-ng/qgssymbolv2.sip
@@ -160,6 +160,11 @@ class QgsSymbolV2
 
     QSet<QString> usedAttributes() const;
 
+    /** Returns whether the symbol utilises any data defined properties.
+     * @note added in QGIS 2.12
+     */
+    bool hasDataDefinedProperties() const;
+
     void setLayer( const QgsVectorLayer* layer );
     const QgsVectorLayer* layer() const;
 
diff --git a/python/plugins/db_manager/db_plugins/oracle/TODO.md b/python/plugins/db_manager/db_plugins/oracle/TODO.md
index 4b01290..a29778c 100644
--- a/python/plugins/db_manager/db_plugins/oracle/TODO.md
+++ b/python/plugins/db_manager/db_plugins/oracle/TODO.md
@@ -3,10 +3,6 @@
 * SQL Window - "Retrieve columns" don't work => problem in
   dlg_sql_window.py (not enough abstraction for connectors). 
 
-* SQL Window - Can't retrieve column: dlg_sql_window.py launch an
-  invalid request for Oracle (no LIMIT operator in Oracle). Should
-  patch dlg_sql_window.py to use a connector method to grab columns.
-
 * Query-builder - Add date functions menu (needs to change the main
   code of query builder).
 
diff --git a/python/plugins/db_manager/dlg_sql_window.py b/python/plugins/db_manager/dlg_sql_window.py
index 134462f..76bbdef 100644
--- a/python/plugins/db_manager/dlg_sql_window.py
+++ b/python/plugins/db_manager/dlg_sql_window.py
@@ -287,7 +287,7 @@ class DlgSqlWindow(QWidget, Ui_Dialog):
         cols = []
         quotedCols = []
         connector = self.db.connector
-        sql = u"SELECT * FROM (%s\n) AS %s LIMIT 0" % (unicode(query), connector.quoteId(alias))
+        sql = u"SELECT * FROM (%s\n) AS %s WHERE 0=1" % (unicode(query), connector.quoteId(alias))
 
         c = None
         try:
diff --git a/python/plugins/fTools/tools/doGeoprocessing.py b/python/plugins/fTools/tools/doGeoprocessing.py
index 073b5cd..9a67c0a 100644
--- a/python/plugins/fTools/tools/doGeoprocessing.py
+++ b/python/plugins/fTools/tools/doGeoprocessing.py
@@ -32,7 +32,7 @@
 
 from PyQt4.QtCore import SIGNAL, QObject, Qt, QFile, QThread, QVariant
 from PyQt4.QtGui import QDialog, QDoubleValidator, QDialogButtonBox, QMessageBox
-from qgis.core import QGis, QgsVectorFileWriter, QgsFeature, QgsGeometry, QgsFields, QgsField, QgsFeatureRequest, QgsPoint, QgsDistanceArea
+from qgis.core import QGis, QgsVectorFileWriter, QgsFeature, QgsGeometry, QgsFields, QgsField, QgsFeatureRequest, QgsPoint, QgsDistanceArea, QgsWKBTypes
 
 from ui_frmGeoprocessing import Ui_Dialog
 import ftools_utils
@@ -204,14 +204,14 @@ class GeoprocessingDialog(QDialog, Ui_Dialog):
         self.inShapeA.addItems(myListA)
         self.inShapeB.addItems(myListB)
 
-#1: Buffer
-#2: Convex Hull
-#3: Difference
-#4: Dissolve
-#5: Intersection
-#6: Union
-#7: Symmetrical Difference
-#8: Clip
+# 1: Buffer
+# 2: Convex Hull
+# 3: Difference
+# 4: Dissolve
+# 5: Intersection
+# 6: Union
+# 7: Symmetrical Difference
+# 8: Clip
 
     def geoprocessing(self, myLayerA, myLayerB, myParam, myMerge, mySelectionA, mySelectionB, mySegments):
         check = QFile(self.shapefileName)
@@ -966,7 +966,7 @@ class geoprocessingThread(QThread):
                                 if geom.intersects(tmpGeom):
                                     atMapB = inFeatB.attributes()
                                     int_geom = QgsGeometry(geom.intersection(tmpGeom))
-                                    if int_geom.wkbType() == 0:
+                                    if int_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(int_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                                         int_com = geom.combine(tmpGeom)
                                         int_sym = geom.symDifference(tmpGeom)
                                         int_geom = QgsGeometry(int_com.difference(int_sym))
@@ -1001,7 +1001,7 @@ class geoprocessingThread(QThread):
                             if geom.intersects(tmpGeom):
                                 atMapB = inFeatB.attributes()
                                 int_geom = QgsGeometry(geom.intersection(tmpGeom))
-                                if int_geom.wkbType() == 0:
+                                if int_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(int_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                                     int_com = geom.combine(tmpGeom)
                                     int_sym = geom.symDifference(tmpGeom)
                                     int_geom = QgsGeometry(int_com.difference(int_sym))
@@ -1040,7 +1040,7 @@ class geoprocessingThread(QThread):
                                 if geom.intersects(tmpGeom):
                                     atMapB = inFeatB.attributes()
                                     int_geom = QgsGeometry(geom.intersection(tmpGeom))
-                                    if int_geom.wkbType() == 0:
+                                    if int_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(int_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                                         int_com = geom.combine(tmpGeom)
                                         int_sym = geom.symDifference(tmpGeom)
                                         int_geom = QgsGeometry(int_com.difference(int_sym))
@@ -1072,7 +1072,7 @@ class geoprocessingThread(QThread):
                             if geom.intersects(tmpGeom):
                                 atMapB = inFeatB.attributes()
                                 int_geom = QgsGeometry(geom.intersection(tmpGeom))
-                                if int_geom.wkbType() == 0:
+                                if (int_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(int_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection):
                                     int_com = geom.combine(tmpGeom)
                                     int_sym = geom.symDifference(tmpGeom)
                                     int_geom = QgsGeometry(int_com.difference(int_sym))
@@ -1161,7 +1161,7 @@ class geoprocessingThread(QThread):
                             else:
                                 int_geom = QgsGeometry(int_geom)
 
-                            if int_geom.wkbType() == 0:
+                            if int_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(int_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                                 # intersection produced different geometry types
                                 temp_list = int_geom.asGeometryCollection()
                                 for i in temp_list:
@@ -1197,7 +1197,7 @@ class geoprocessingThread(QThread):
                         intB = QgsGeometry.unaryUnion(lstIntersectingB)
                         diff_geom = diff_geom.difference(intB)
 
-                    if diff_geom.wkbType() == 0:
+                    if diff_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(diff_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                         temp_list = diff_geom.asGeometryCollection()
                         for i in temp_list:
                             if i.type() == geom.type():
@@ -1415,7 +1415,7 @@ class geoprocessingThread(QThread):
                         try:
                             cur_geom = QgsGeometry(outFeat.geometry())
                             new_geom = QgsGeometry(geom.intersection(cur_geom))
-                            if new_geom.wkbType() == 0:
+                            if new_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(new_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                                 int_com = QgsGeometry(geom.combine(cur_geom))
                                 int_sym = QgsGeometry(geom.symDifference(cur_geom))
                                 new_geom = QgsGeometry(int_com.difference(int_sym))
@@ -1459,7 +1459,7 @@ class geoprocessingThread(QThread):
                         try:
                             cur_geom = QgsGeometry(outFeat.geometry())
                             new_geom = QgsGeometry(geom.intersection(cur_geom))
-                            if new_geom.wkbType() == 0:
+                            if new_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(new_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                                 int_com = QgsGeometry(geom.combine(cur_geom))
                                 int_sym = QgsGeometry(geom.symDifference(cur_geom))
                                 new_geom = QgsGeometry(int_com.difference(int_sym))
@@ -1511,7 +1511,7 @@ class geoprocessingThread(QThread):
                         try:
                             cur_geom = QgsGeometry(outFeat.geometry())
                             new_geom = QgsGeometry(geom.intersection(cur_geom))
-                            if new_geom.wkbType() == 0:
+                            if new_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(new_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                                 int_com = QgsGeometry(geom.combine(cur_geom))
                                 int_sym = QgsGeometry(geom.symDifference(cur_geom))
                                 new_geom = QgsGeometry(int_com.difference(int_sym))
@@ -1557,7 +1557,7 @@ class geoprocessingThread(QThread):
                             try:
                                 cur_geom = QgsGeometry(outFeat.geometry())
                                 new_geom = QgsGeometry(geom.intersection(cur_geom))
-                                if new_geom.wkbType() == 0:
+                                if new_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(new_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                                     int_com = QgsGeometry(geom.combine(cur_geom))
                                     int_sym = QgsGeometry(geom.symDifference(cur_geom))
                                     new_geom = QgsGeometry(int_com.difference(int_sym))
diff --git a/python/plugins/processing/algs/qgis/Clip.py b/python/plugins/processing/algs/qgis/Clip.py
index 6a8f38f..9c26106 100644
--- a/python/plugins/processing/algs/qgis/Clip.py
+++ b/python/plugins/processing/algs/qgis/Clip.py
@@ -25,7 +25,7 @@ __copyright__ = '(C) 2012, Victor Olaya'
 
 __revision__ = '$Format:%H$'
 
-from qgis.core import QgsFeature, QgsGeometry, QgsFeatureRequest
+from qgis.core import QgsFeature, QgsGeometry, QgsFeatureRequest, QgsWKBTypes
 from processing.core.GeoAlgorithm import GeoAlgorithm
 from processing.core.ProcessingLog import ProcessingLog
 from processing.core.parameters import ParameterVector
@@ -103,7 +103,7 @@ class Clip(GeoAlgorithm):
                     try:
                         cur_geom = QgsGeometry(outFeat.geometry())
                         new_geom = QgsGeometry(geom.intersection(cur_geom))
-                        if new_geom.wkbType() == 0:
+                        if new_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(new_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                             int_com = QgsGeometry(geom.combine(cur_geom))
                             int_sym = QgsGeometry(geom.symDifference(cur_geom))
                             new_geom = QgsGeometry(int_com.difference(int_sym))
diff --git a/python/plugins/processing/algs/qgis/Intersection.py b/python/plugins/processing/algs/qgis/Intersection.py
index 8428f38..f39b2e0 100644
--- a/python/plugins/processing/algs/qgis/Intersection.py
+++ b/python/plugins/processing/algs/qgis/Intersection.py
@@ -25,7 +25,7 @@ __copyright__ = '(C) 2012, Victor Olaya'
 
 __revision__ = '$Format:%H$'
 
-from qgis.core import QGis, QgsFeatureRequest, QgsFeature, QgsGeometry
+from qgis.core import QGis, QgsFeatureRequest, QgsFeature, QgsGeometry, QgsWKBTypes
 from processing.core.GeoAlgorithm import GeoAlgorithm
 from processing.core.ProcessingLog import ProcessingLog
 from processing.core.parameters import ParameterVector
@@ -79,7 +79,7 @@ class Intersection(GeoAlgorithm):
                     if geom.intersects(tmpGeom):
                         atMapB = inFeatB.attributes()
                         int_geom = QgsGeometry(geom.intersection(tmpGeom))
-                        if int_geom.wkbType() == QGis.WKBUnknown:
+                        if int_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(int_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                             int_com = geom.combine(tmpGeom)
                             int_sym = geom.symDifference(tmpGeom)
                             int_geom = QgsGeometry(int_com.difference(int_sym))
diff --git a/python/plugins/processing/algs/qgis/Union.py b/python/plugins/processing/algs/qgis/Union.py
index 40e562e..56bbf94 100644
--- a/python/plugins/processing/algs/qgis/Union.py
+++ b/python/plugins/processing/algs/qgis/Union.py
@@ -25,7 +25,7 @@ __copyright__ = '(C) 2012, Victor Olaya'
 
 __revision__ = '$Format:%H$'
 
-from qgis.core import QgsFeatureRequest, QgsFeature, QgsGeometry
+from qgis.core import QgsFeatureRequest, QgsFeature, QgsGeometry, QgsWKBTypes
 from processing.core.GeoAlgorithm import GeoAlgorithm
 from processing.core.ProcessingLog import ProcessingLog
 from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
@@ -99,7 +99,7 @@ class Union(GeoAlgorithm):
                         else:
                             int_geom = QgsGeometry(int_geom)
 
-                        if int_geom.wkbType() == 0:
+                        if int_geom.wkbType() == QGis.WKBUnknown or QgsWKBTypes.flatType(int_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
                             # Intersection produced different geomety types
                             temp_list = int_geom.asGeometryCollection()
                             for i in temp_list:
@@ -117,24 +117,24 @@ class Union(GeoAlgorithm):
                                 self.tr('Feature exception while computing union'))
 
                 try:
-                        # the remaining bit of inFeatA's geometry
-                        # if there is nothing left, this will just silently fail and we're good
-                        diff_geom = QgsGeometry(geom)
-                        if len(lstIntersectingB) != 0:
-                            intB = QgsGeometry.unaryUnion(lstIntersectingB)
-                            diff_geom = diff_geom.difference(intB)
-
-                        if diff_geom.wkbType() == 0:
-                            temp_list = diff_geom.asGeometryCollection()
-                            for i in temp_list:
-                                if i.type() == geom.type():
-                                    diff_geom = QgsGeometry(i)
-                        outFeat.setGeometry(diff_geom)
-                        outFeat.setAttributes(atMapA)
-                        writer.addFeature(outFeat)
+                    # the remaining bit of inFeatA's geometry
+                    # if there is nothing left, this will just silently fail and we're good
+                    diff_geom = QgsGeometry(geom)
+                    if len(lstIntersectingB) != 0:
+                        intB = QgsGeometry.unaryUnion(lstIntersectingB)
+                        diff_geom = diff_geom.difference(intB)
+
+                    if diff_geom.wkbType() == 0 or QgsWKBTypes.flatType(int_geom.geometry().wkbType()) == QgsWKBTypes.GeometryCollection:
+                        temp_list = diff_geom.asGeometryCollection()
+                        for i in temp_list:
+                            if i.type() == geom.type():
+                                diff_geom = QgsGeometry(i)
+                    outFeat.setGeometry(diff_geom)
+                    outFeat.setAttributes(atMapA)
+                    writer.addFeature(outFeat)
                 except Exception as err:
-                        raise GeoAlgorithmExecutionException(
-                            self.tr('Feature exception while computing union'))
+                    raise GeoAlgorithmExecutionException(
+                        self.tr('Feature exception while computing union'))
 
         length = len(vproviderA.fields())
 
diff --git a/scripts/generate_test_mask_image.py b/scripts/generate_test_mask_image.py
old mode 100644
new mode 100755
index 369442a..7ada8b9
--- a/scripts/generate_test_mask_image.py
+++ b/scripts/generate_test_mask_image.py
@@ -14,109 +14,114 @@ import struct
 import urllib2
 import glob
 
-def error ( msg ):
-  print msg
-  sys.exit( 1 )
 
-def colorDiff( c1, c2 ):
-  redDiff = abs( qRed( c1 ) - qRed( c2 ) )
-  greenDiff = abs( qGreen( c1 ) - qGreen( c2 ) )
-  blueDiff = abs( qBlue( c1 ) - qBlue( c2 ) )
-  alphaDiff = abs( qAlpha( c1 ) - qAlpha( c2 ) )
-  return max( redDiff, greenDiff, blueDiff, alphaDiff )
+def error(msg):
+    print msg
+    sys.exit(1)
+
+
+def colorDiff(c1, c2):
+    redDiff = abs(qRed(c1) - qRed(c2))
+    greenDiff = abs(qGreen(c1) - qGreen(c2))
+    blueDiff = abs(qBlue(c1) - qBlue(c2))
+    alphaDiff = abs(qAlpha(c1) - qAlpha(c2))
+    return max(redDiff, greenDiff, blueDiff, alphaDiff)
+
 
 def imageFromPath(path):
-  if ( path[:7] == 'http://' or path[:7] == 'file://' ):
-    #fetch remote image
-    data = urllib2.urlopen(path).read()
-    image = QImage()
-    image.loadFromData(data)
-  else:
-    image = QImage( path )
-  return image
+    if (path[:7] == 'http://' or path[:7] == 'file://'):
+        #fetch remote image
+        data = urllib2.urlopen(path).read()
+        image = QImage()
+        image.loadFromData(data)
+    else:
+        image = QImage(path)
+    return image
+
 
 def getControlImagePath(path):
-  if os.path.isfile(path):
-    return path
+    if os.path.isfile(path):
+        return path
+
+    #else try and find matching test image
+    script_folder = os.path.dirname(os.path.realpath(sys.argv[0]))
+    control_images_folder = os.path.join(script_folder, '../tests/testdata/control_images')
 
-  #else try and find matching test image
-  script_folder = os.path.dirname(os.path.realpath(sys.argv[0]))
-  control_images_folder = os.path.join( script_folder, '../tests/testdata/control_images')
+    matching_control_images = [x[0] for x in os.walk(control_images_folder) if path in x[0]]
+    if len(matching_control_images) > 1:
+        error('Found multiple matching control images for {}'.format(path))
+    elif len(matching_control_images) == 0:
+        error('No matching control images found for {}'.format(path))
 
-  matching_control_images = [x[0] for x in os.walk(control_images_folder) if path in x[0]]
-  if len(matching_control_images) > 1:
-    error('Found multiple matching control images for {}'.format(path))
-  elif len(matching_control_images) == 0:
-    error('No matching control images found for {}'.format(path))
+    found_control_image_path = matching_control_images[0]
 
-  found_control_image_path = matching_control_images[0]
+    #check for a single matching expected image
+    images = glob.glob(os.path.join(found_control_image_path, '*.png'))
+    filtered_images = [i for i in images if not i[-9:] == '_mask.png']
+    if len(filtered_images) > 1:
+        error('Found multiple matching control images for {}'.format(path))
+    elif len(filtered_images) == 0:
+        error('No matching control images found for {}'.format(path))
 
-  #check for a single matching expected image
-  images = glob.glob( os.path.join(found_control_image_path, '*.png') )
-  filtered_images = [i for i in images if not i[-9:] == '_mask.png']
-  if len(filtered_images) > 1:
-    error('Found multiple matching control images for {}'.format(path))
-  elif len(filtered_images) == 0:
-    error('No matching control images found for {}'.format(path))
+    found_image = filtered_images[0]
+    print 'Found matching control image: {}'.format(found_image)
+    return found_image
 
-  found_image = filtered_images[0]
-  print 'Found matching control image: {}'.format(found_image)
-  return found_image
 
 def updateMask(control_image_path, rendered_image_path, mask_image_path):
-  control_image = imageFromPath( control_image_path )
-  if not control_image:
-    error('Could not read control image {}'.format(control_image_path))
-
-  rendered_image = imageFromPath( rendered_image_path )
-  if not rendered_image:
-    error('Could not read rendered image {}'.format(rendered_image_path))
-  if not rendered_image.width() == control_image.width() or not rendered_image.height() == control_image.height():
-    print ('Size mismatch - control image is {}x{}, rendered image is {}x{}'.format(control_image.width(),
-                                                                                   control_image.height(),
-                                                                                   rendered_image.width(),
-                                                                                   rendered_image.height()))
-
-  max_width = min( rendered_image.width(), control_image.width() )
-  max_height = min( rendered_image.height(), control_image.height() )
-
-  #read current mask, if it exist
-  mask_image = imageFromPath( mask_image_path )
-  if mask_image.isNull():
-    print 'Mask image does not exist, creating {}'.format( mask_image_path )
-    mask_image = QImage( control_image.width(), control_image.height(), QImage.Format_ARGB32 )
-    mask_image.fill( QColor(0,0,0) )
-
-  #loop through pixels in rendered image and compare
-  mismatch_count = 0
-  linebytes = max_width * 4
-  for y in xrange( max_height ):
-    control_scanline = control_image.constScanLine( y ).asstring(linebytes)
-    rendered_scanline = rendered_image.constScanLine( y ).asstring(linebytes)
-    mask_scanline = mask_image.scanLine( y ).asstring(linebytes)
-
-    for x in xrange( max_width ):
-      currentTolerance = qRed( struct.unpack('I', mask_scanline[ x*4:x*4+4 ] )[0] )
-
-      if currentTolerance == 255:
-        #ignore pixel
-        continue
-
-      expected_rgb = struct.unpack('I', control_scanline[ x*4:x*4+4 ] )[0]
-      rendered_rgb = struct.unpack('I', rendered_scanline[ x*4:x*4+4 ] )[0]
-      difference = colorDiff( expected_rgb, rendered_rgb )
-
-      if difference > currentTolerance:
-        #update mask image
-        mask_image.setPixel( x, y, qRgb( difference, difference, difference ) )
-        mismatch_count += 1
-
-  if mismatch_count:
-    #update mask
-    mask_image.save( mask_image_path, "png" )
-    print 'Updated {} pixels in {}'.format( mismatch_count, mask_image_path )
-  else:
-    print 'No mismatches in {}'.format( mask_image_path )
+    control_image = imageFromPath(control_image_path)
+    if not control_image:
+        error('Could not read control image {}'.format(control_image_path))
+
+    rendered_image = imageFromPath(rendered_image_path)
+    if not rendered_image:
+        error('Could not read rendered image {}'.format(rendered_image_path))
+    if not rendered_image.width() == control_image.width() or not rendered_image.height() == control_image.height():
+        print ('Size mismatch - control image is {}x{}, rendered image is {}x{}'.format(control_image.width(),
+                                                                                        control_image.height(),
+                                                                                        rendered_image.width(),
+                                                                                        rendered_image.height()))
+
+    max_width = min(rendered_image.width(), control_image.width())
+    max_height = min(rendered_image.height(), control_image.height())
+
+    #read current mask, if it exist
+    mask_image = imageFromPath(mask_image_path)
+    if mask_image.isNull():
+        print 'Mask image does not exist, creating {}'.format(mask_image_path)
+        mask_image = QImage(control_image.width(), control_image.height(), QImage.Format_ARGB32)
+        mask_image.fill(QColor(0, 0, 0))
+
+    #loop through pixels in rendered image and compare
+    mismatch_count = 0
+    linebytes = max_width * 4
+    for y in xrange(max_height):
+        control_scanline = control_image.constScanLine(y).asstring(linebytes)
+        rendered_scanline = rendered_image.constScanLine(y).asstring(linebytes)
+        mask_scanline = mask_image.scanLine(y).asstring(linebytes)
+
+        for x in xrange(max_width):
+            currentTolerance = qRed(struct.unpack('I', mask_scanline[x * 4:x * 4 + 4])[0])
+
+            if currentTolerance == 255:
+                #ignore pixel
+                continue
+
+            expected_rgb = struct.unpack('I', control_scanline[x * 4:x * 4 + 4])[0]
+            rendered_rgb = struct.unpack('I', rendered_scanline[x * 4:x * 4 + 4])[0]
+            difference = colorDiff(expected_rgb, rendered_rgb)
+
+            if difference > currentTolerance:
+                #update mask image
+                mask_image.setPixel(x, y, qRgb(difference, difference, difference))
+                mismatch_count += 1
+
+    if mismatch_count:
+        #update mask
+        mask_image.save(mask_image_path, "png")
+        print 'Updated {} pixels in {}'.format(mismatch_count, mask_image_path)
+    else:
+        print 'No mismatches in {}'.format(mask_image_path)
 
 parser = argparse.ArgumentParser() # OptionParser("usage: %prog control_image rendered_image mask_image")
 parser.add_argument('control_image')
@@ -124,9 +129,9 @@ parser.add_argument('rendered_image')
 parser.add_argument('mask_image', nargs='?', default=None)
 args = parser.parse_args()
 
-args.control_image = getControlImagePath( args.control_image)
+args.control_image = getControlImagePath(args.control_image)
 
 if not args.mask_image:
-  args.mask_image = args.control_image[:-4] + '_mask.png'
+    args.mask_image = args.control_image[:-4] + '_mask.png'
 
 updateMask(args.control_image, args.rendered_image, args.mask_image)
diff --git a/scripts/tsstat.pl b/scripts/tsstat.pl
index 0cca77b..d1efc2c 100755
--- a/scripts/tsstat.pl
+++ b/scripts/tsstat.pl
@@ -49,7 +49,7 @@ my $translators= {
 	'eu' => 'Asier Sarasua Garmendia, Irantzu Alvarez',
 	'fa' => 'Mola Pahnadayan, Masoud Pashotan , Masoud Erfanyan',
 	'fi' => 'Kari Mikkonen, Matti Mäntynen',
-	'fr' => 'Arnaud Morvan, Augustin Roche, Jean-Roc Morreale, Loïc Buscoz, Marc-André Saia, Mathieu Bossaert, Mayeul Kauffmann, Médéric Ribreux, Michael Douchin, Nicolas Rochard, Robin Prest, DelazJ, Stéphane Possamai, Sylvain Badey, Sylvain_M, Sylvain Maillard, Xavier Tardieu, Marie Silvestre, Vincent Picavet',
+	'fr' => 'Arnaud Morvan, Augustin Roche, DelazJ, Didier Vanden Berghe, Dofabien, etrimaille, Jean-Roc Morreale, Jérémy Garniaux, Loïc Buscoz, Lsam, Marc-André Saia, Marie Silvestre, Mathieu Bossaert, Mathieu Lattes, Mayeul Kauffmann, Médéric Ribreux, Mehdi Semchaoui, Michael Douchin, Nicolas Boisteault, Nicolas Rochard, Pascal Obstetar, Robin Prest, Rod Bera, Stéphane Henriod, Stéphane Possamai, sylther, Sylvain Badey, Sylvain Maillard, Vincent Picavet, Xavier Tardieu, Yann Leveille-Mene [...]
 	'gl' => 'Xan Vieiro',
 	'hi' => 'Harish Kumar Solanki',
 	'hu' => 'Zoltan Siki',
diff --git a/src/app/nodetool/qgsmaptoolnodetool.cpp b/src/app/nodetool/qgsmaptoolnodetool.cpp
index ebb483e..a829b20 100644
--- a/src/app/nodetool/qgsmaptoolnodetool.cpp
+++ b/src/app/nodetool/qgsmaptoolnodetool.cpp
@@ -539,7 +539,22 @@ void QgsMapToolNodeTool::keyPressEvent( QKeyEvent* e )
       return;
 
     mSelectedFeature->deleteSelectedVertexes();
-    safeSelectVertex( firstSelectedIndex );
+
+    if ( mSelectedFeature->geometry()->isEmpty() )
+    {
+      emit messageEmitted( tr( "Geometry has been cleared. Use the add part tool to set geometry for this feature." ) );
+    }
+    else
+    {
+      int nextVertexToSelect = firstSelectedIndex;
+      if ( mSelectedFeature->geometry()->type() == QGis::Line )
+      {
+        // for lines we don't wrap around vertex selection when deleting nodes from end of line
+        nextVertexToSelect = qMin( nextVertexToSelect, mSelectedFeature->geometry()->geometry()->nCoordinates() - 1 );
+      }
+
+      safeSelectVertex( nextVertexToSelect );
+    }
     mCanvas->refresh();
 
     // Override default shortcut management in MapCanvas
diff --git a/src/app/qgsfieldcalculator.cpp b/src/app/qgsfieldcalculator.cpp
index d19bb03..22dd831 100644
--- a/src/app/qgsfieldcalculator.cpp
+++ b/src/app/qgsfieldcalculator.cpp
@@ -246,9 +246,6 @@ void QgsFieldCalculator::accept()
     bool calculationSuccess = true;
     QString error;
 
-    bool onlySelected = mOnlyUpdateSelectedCheckBox->isChecked();
-    QgsFeatureIds selectedIds = mVectorLayer->selectedFeaturesIds();
-
     bool useGeometry = exp.needsGeometry();
     int rownum = 1;
 
@@ -259,17 +256,14 @@ void QgsFieldCalculator::accept()
     if ( newField )
       emptyAttribute = QVariant( field.type() );
 
-    QgsFeatureIterator fit = mVectorLayer->getFeatures( QgsFeatureRequest().setFlags( useGeometry ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) );
+    QgsFeatureRequest req = QgsFeatureRequest().setFlags( useGeometry ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry );
+    if ( mOnlyUpdateSelectedCheckBox->isChecked() )
+    {
+      req.setFilterFids( mVectorLayer->selectedFeaturesIds() );
+    }
+    QgsFeatureIterator fit = mVectorLayer->getFeatures( req );
     while ( fit.nextFeature( feature ) )
     {
-      if ( onlySelected )
-      {
-        if ( !selectedIds.contains( feature.id() ) )
-        {
-          continue;
-        }
-      }
-
       expContext.setFeature( feature );
       expContext.lastScope()->setVariable( QString( "row_number" ), rownum );
 
diff --git a/src/app/qgsprojectproperties.cpp b/src/app/qgsprojectproperties.cpp
index 60b1fea..7f5a186 100644
--- a/src/app/qgsprojectproperties.cpp
+++ b/src/app/qgsprojectproperties.cpp
@@ -272,7 +272,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
   mWMSUrlLineEdit->setText( QgsProject::instance()->readEntry( "WMSUrl", "/", "" ) );
   mWMSFees->setText( QgsProject::instance()->readEntry( "WMSFees", "/", "" ) );
   mWMSAccessConstraints->setText( QgsProject::instance()->readEntry( "WMSAccessConstraints", "/", "" ) );
-  mWMSKeywordList->setText( QgsProject::instance()->readListEntry( "WMSKeywordList", "/" ).join( "," ) );
+  mWMSKeywordList->setText( QgsProject::instance()->readListEntry( "WMSKeywordList", "/" ).join( ", " ) );
 
   // WMS GetFeatureInfo precision
   int WMSprecision = QgsProject::instance()->readNumEntry( "WMSPrecision", "/", -1 );
@@ -743,7 +743,8 @@ void QgsProjectProperties::apply()
   QStringList keywordStringList = mWMSKeywordList->text().split( "," );
   if ( keywordStringList.size() > 0 )
   {
-    QgsProject::instance()->writeEntry( "WMSKeywordList", "/", mWMSKeywordList->text().split( "," ) );
+    keywordStringList.replaceInStrings( QRegExp( "^\\s+" ), "" ).replaceInStrings( QRegExp( "\\s+$" ), "" );
+    QgsProject::instance()->writeEntry( "WMSKeywordList", "/", keywordStringList );
   }
   else
   {
diff --git a/src/core/auth/qgsauthcertutils.h b/src/core/auth/qgsauthcertutils.h
index 35b7a93..fcb614c 100644
--- a/src/core/auth/qgsauthcertutils.h
+++ b/src/core/auth/qgsauthcertutils.h
@@ -25,13 +25,13 @@
 #include "qgsauthconfig.h"
 
 #if QT_VERSION >= 0x050000
-#define SSL_ISSUER_INFO( var, prop ) var.issuerInfo( prop ).first()
+#define SSL_ISSUER_INFO( var, prop ) var.issuerInfo( prop ).value(0)
 #else
 #define SSL_ISSUER_INFO( var, prop ) var.issuerInfo( prop )
 #endif
 
 #if QT_VERSION >= 0x050000
-#define SSL_SUBJECT_INFO( var, prop ) var.subjectInfo( prop ).first()
+#define SSL_SUBJECT_INFO( var, prop ) var.subjectInfo( prop ).value(0)
 #else
 #define SSL_SUBJECT_INFO( var, prop ) var.subjectInfo( prop )
 #endif
diff --git a/src/core/auth/qgsauthmanager.cpp b/src/core/auth/qgsauthmanager.cpp
index 75ca012..1b57a22 100644
--- a/src/core/auth/qgsauthmanager.cpp
+++ b/src/core/auth/qgsauthmanager.cpp
@@ -2360,8 +2360,12 @@ bool QgsAuthManager::removeCertAuthority( const QSslCertificate& cert )
 
 const QList<QSslCertificate> QgsAuthManager::getSystemRootCAs()
 {
+#ifndef Q_OS_MAC
+  return QSslSocket::systemCaCertificates();
+#else
   QNetworkRequest req;
   return req.sslConfiguration().caCertificates();
+#endif
 }
 
 const QList<QSslCertificate> QgsAuthManager::getExtraFileCAs()
diff --git a/src/core/geometry/qgscircularstringv2.cpp b/src/core/geometry/qgscircularstringv2.cpp
index 80ca6d2..e53b30d 100644
--- a/src/core/geometry/qgscircularstringv2.cpp
+++ b/src/core/geometry/qgscircularstringv2.cpp
@@ -512,6 +512,12 @@ void QgsCircularStringV2::segmentize( const QgsPointV2& p1, const QgsPointV2& p2
   points.append( p1 );
   if ( p2 != p3 && p1 != p2 ) //draw straight line segment if two points have the same position
   {
+    QgsWKBTypes::Type pointWkbType = QgsWKBTypes::Point;
+    if ( hasZ )
+      pointWkbType = QgsWKBTypes::addZ( pointWkbType );
+    if ( hasM )
+      pointWkbType = QgsWKBTypes::addM( pointWkbType );
+
     for ( double angle = a1 + increment; clockwise ? angle > a3 : angle < a3; angle += increment )
     {
       x = centerX + radius * cos( angle );
@@ -532,7 +538,7 @@ void QgsCircularStringV2::segmentize( const QgsPointV2& p1, const QgsPointV2& p2
         m = interpolateArc( angle, a1, a2, a3, p1.m(), p2.m(), p3.m() );
       }
 
-      points.append( QgsPointV2( mWkbType, x, y, z, m ) );
+      points.append( QgsPointV2( pointWkbType, x, y, z, m ) );
     }
   }
   points.append( p3 );
diff --git a/src/core/geometry/qgscurvepolygonv2.cpp b/src/core/geometry/qgscurvepolygonv2.cpp
index 6dd2228..88f288e 100644
--- a/src/core/geometry/qgscurvepolygonv2.cpp
+++ b/src/core/geometry/qgscurvepolygonv2.cpp
@@ -173,6 +173,12 @@ bool QgsCurvePolygonV2::fromWkt( const QString& wkt )
     }
   }
 
+  if ( mInteriorRings.isEmpty() )
+  {
+    clear();
+    return false;
+  }
+
   mExteriorRing = mInteriorRings.first();
   mInteriorRings.removeFirst();
 
diff --git a/src/core/geometry/qgsgeometryutils.cpp b/src/core/geometry/qgsgeometryutils.cpp
index eea25da..85fba5f 100644
--- a/src/core/geometry/qgsgeometryutils.cpp
+++ b/src/core/geometry/qgsgeometryutils.cpp
@@ -498,11 +498,11 @@ QList<QgsPointV2> QgsGeometryUtils::pointsFromWKT( const QString &wktCoordinateL
     double y = coordinates[idx++].toDouble();
 
     double z = 0;
-    if (( is3D || foundZ ) && coordinates.length() >= idx )
+    if (( is3D || foundZ ) && coordinates.length() > idx )
       z = coordinates[idx++].toDouble();
 
     double m = 0;
-    if (( isMeasure || foundM ) && coordinates.length() >= idx )
+    if (( isMeasure || foundM ) && coordinates.length() > idx )
       m = coordinates[idx++].toDouble();
 
     QgsWKBTypes::Type t = QgsWKBTypes::Point;
diff --git a/src/core/geometry/qgsgeos.cpp b/src/core/geometry/qgsgeos.cpp
index 24fedf4..003654e 100644
--- a/src/core/geometry/qgsgeos.cpp
+++ b/src/core/geometry/qgsgeos.cpp
@@ -1333,20 +1333,20 @@ bool QgsGeos::pointOnSurface( QgsPointV2& pt, QString* errorMsg ) const
   try
   {
     geos.reset( GEOSPointOnSurface_r( geosinit.ctxt, mGeos ) );
-  }
-  CATCH_GEOS_WITH_ERRMSG( false );
 
-  if ( !geos )
-  {
-    return false;
-  }
+    if ( !geos || GEOSisEmpty_r( geosinit.ctxt, geos.get() ) != 0 )
+    {
+      return false;
+    }
 
-  double x, y;
-  GEOSGeomGetX_r( geosinit.ctxt, geos.get(), &x );
-  GEOSGeomGetY_r( geosinit.ctxt, geos.get(), &y );
+    double x, y;
+    GEOSGeomGetX_r( geosinit.ctxt, geos.get(), &x );
+    GEOSGeomGetY_r( geosinit.ctxt, geos.get(), &y );
 
-  pt.setX( x );
-  pt.setY( y );
+    pt.setX( x );
+    pt.setY( y );
+  }
+  CATCH_GEOS_WITH_ERRMSG( false );
 
   return true;
 }
diff --git a/src/core/geometry/qgslinestringv2.cpp b/src/core/geometry/qgslinestringv2.cpp
index 67eb6e3..f8e8007 100644
--- a/src/core/geometry/qgslinestringv2.cpp
+++ b/src/core/geometry/qgslinestringv2.cpp
@@ -300,8 +300,28 @@ void QgsLineStringV2::append( const QgsLineStringV2* line )
   }
 
   mCoords += line->mCoords;
-  mZ += line->mZ;
-  mM += line->mM;
+
+  if ( line->is3D() )
+  {
+    mZ += line->mZ;
+  }
+  else
+  {
+    // if append line does not have z coordinates, fill with 0 to match number of points in final line
+    mZ.insert( mZ.count(), mCoords.size() - mZ.size(), 0 );
+  }
+
+  if ( line->is3D() )
+  {
+    mM += line->mM;
+  }
+  else
+  {
+    // if append line does not have m values, fill with 0 to match number of points in final line
+    mM.insert( mM.count(), mCoords.size() - mM.size(), 0 );
+  }
+
+  mBoundingBox = QgsRectangle(); //set bounding box invalid
 }
 
 void QgsLineStringV2::draw( QPainter& p ) const
diff --git a/src/core/geometry/qgsmultipointv2.cpp b/src/core/geometry/qgsmultipointv2.cpp
index 05af23a..0e891d2 100644
--- a/src/core/geometry/qgsmultipointv2.cpp
+++ b/src/core/geometry/qgsmultipointv2.cpp
@@ -73,20 +73,19 @@ QDomElement QgsMultiPointV2::asGML3( QDomDocument& doc, int precision, const QSt
 
 QString QgsMultiPointV2::asJSON( int precision ) const
 {
-  QString json = "{\"type\": \"MultiPoint\", \"coordinates\": [";
+  QString json = "{\"type\": \"MultiPoint\", \"coordinates\": ";
+
+  QList<QgsPointV2> pts;
   Q_FOREACH ( const QgsAbstractGeometryV2 *geom, mGeometries )
   {
     if ( dynamic_cast<const QgsPointV2*>( geom ) )
     {
       const QgsPointV2* point = static_cast<const QgsPointV2*>( geom );
-      json += QgsGeometryUtils::pointsToJSON( QList<QgsPointV2>() << *point, precision ) + ", ";
+      pts << *point;
     }
   }
-  if ( json.endsWith( ", " ) )
-  {
-    json.chop( 2 ); // Remove last ", "
-  }
-  json += "] }";
+  json += QgsGeometryUtils::pointsToJSON( pts, precision );
+  json += " }";
   return json;
 }
 
diff --git a/src/core/geometry/qgspointv2.cpp b/src/core/geometry/qgspointv2.cpp
index 699e69e..78dee34 100644
--- a/src/core/geometry/qgspointv2.cpp
+++ b/src/core/geometry/qgspointv2.cpp
@@ -64,6 +64,7 @@ bool QgsPointV2::fromWkb( const unsigned char* wkb )
   QgsWKBTypes::Type type = wkbPtr.readHeader();
   if ( QgsWKBTypes::flatType( type ) != QgsWKBTypes::Point )
   {
+    clear();
     return false;
   }
   mWkbType = type;
@@ -75,6 +76,8 @@ bool QgsPointV2::fromWkb( const unsigned char* wkb )
   if ( isMeasure() )
     wkbPtr >> mM;
 
+  mBoundingBox = QgsRectangle();
+
   return true;
 }
 
@@ -88,8 +91,8 @@ bool QgsPointV2::fromWkt( const QString& wkt )
     return false;
   mWkbType = parts.first;
 
-  QStringList coordinates = parts.second.split( " ", QString::SkipEmptyParts );
-  if ( coordinates.size() < 2 + is3D() + isMeasure() )
+  QStringList coordinates = parts.second.split( ' ', QString::SkipEmptyParts );
+  if ( coordinates.size() < 2 )
   {
     clear();
     return false;
@@ -111,9 +114,9 @@ bool QgsPointV2::fromWkt( const QString& wkt )
   int idx = 0;
   mX = coordinates[idx++].toDouble();
   mY = coordinates[idx++].toDouble();
-  if ( is3D() )
+  if ( is3D() && coordinates.length() > 2 )
     mZ = coordinates[idx++].toDouble();
-  if ( isMeasure() )
+  if ( isMeasure() && coordinates.length() > 2 + is3D() )
     mM = coordinates[idx++].toDouble();
 
   return true;
@@ -197,10 +200,12 @@ void QgsPointV2::clear()
 {
   mWkbType = QgsWKBTypes::Unknown;
   mX = mY = mZ = mM = 0.;
+  mBoundingBox = QgsRectangle();
 }
 
 void QgsPointV2::transform( const QgsCoordinateTransform& ct, QgsCoordinateTransform::TransformDirection d )
 {
+  mBoundingBox = QgsRectangle();
   ct.transformInPlace( mX, mY, mZ, d );
 }
 
@@ -215,6 +220,7 @@ void QgsPointV2::coordinateSequence( QList< QList< QList< QgsPointV2 > > >& coor
 bool QgsPointV2::moveVertex( const QgsVertexId& position, const QgsPointV2& newPos )
 {
   Q_UNUSED( position );
+  mBoundingBox = QgsRectangle();
   mX = newPos.mX;
   mY = newPos.mY;
   if ( is3D() && newPos.is3D() )
@@ -225,7 +231,6 @@ bool QgsPointV2::moveVertex( const QgsVertexId& position, const QgsPointV2& newP
   {
     mM = newPos.mM;
   }
-  mBoundingBox = QgsRectangle(); //set bounding box invalid
   return true;
 }
 
@@ -279,6 +284,7 @@ bool QgsPointV2::addMValue( double mValue )
 
 void QgsPointV2::transform( const QTransform& t )
 {
+  mBoundingBox = QgsRectangle();
   qreal x, y;
   t.map( mX, mY, &x, &y );
   mX = x; mY = y;
diff --git a/src/core/geometry/qgspointv2.h b/src/core/geometry/qgspointv2.h
index 01a61e4..9a32328 100644
--- a/src/core/geometry/qgspointv2.h
+++ b/src/core/geometry/qgspointv2.h
@@ -44,8 +44,8 @@ class CORE_EXPORT QgsPointV2: public QgsAbstractGeometryV2
     double z() const { return mZ; }
     double m() const { return mM; }
 
-    void setX( double x ) { mX = x; }
-    void setY( double y ) { mY = y; }
+    void setX( double x ) { mX = x; mBoundingBox = QgsRectangle(); }
+    void setY( double y ) { mY = y; mBoundingBox = QgsRectangle(); }
     void setZ( double z ) { mZ = z; }
     void setM( double m ) { mM = m; }
 
diff --git a/src/core/layertree/qgslayertreegroup.cpp b/src/core/layertree/qgslayertreegroup.cpp
index 2e491d7..5f32815 100644
--- a/src/core/layertree/qgslayertreegroup.cpp
+++ b/src/core/layertree/qgslayertreegroup.cpp
@@ -39,9 +39,9 @@ QgsLayerTreeGroup::QgsLayerTreeGroup( const QgsLayerTreeGroup& other )
     : QgsLayerTreeNode( other )
     , mName( other.mName )
     , mChecked( other.mChecked )
-    , mChangingChildVisibility( false )
-    , mMutuallyExclusive( false )
-    , mMutuallyExclusiveChildIndex( -1 )
+    , mChangingChildVisibility( other.mChangingChildVisibility )
+    , mMutuallyExclusive( other.mMutuallyExclusive )
+    , mMutuallyExclusiveChildIndex( other.mMutuallyExclusiveChildIndex )
 {
   connect( this, SIGNAL( visibilityChanged( QgsLayerTreeNode*, Qt::CheckState ) ), this, SLOT( nodeVisibilityChanged( QgsLayerTreeNode* ) ) );
 }
diff --git a/src/core/pal/labelposition.cpp b/src/core/pal/labelposition.cpp
index cc955da..bfaa2ce 100644
--- a/src/core/pal/labelposition.cpp
+++ b/src/core/pal/labelposition.cpp
@@ -593,29 +593,37 @@ namespace pal
       polygon->createGeosGeom();
 
     GEOSContextHandle_t geosctxt = geosContext();
-
     double cost = 0;
-    //check the label center. if covered by polygon, initial cost of 4
-    if ( polygon->containsPoint(( x[0] + x[2] ) / 2.0, ( y[0] + y[2] ) / 2.0 ) )
-      cost += 4;
-
     try
     {
-      //calculate proportion of label candidate which is covered by polygon
-      GEOSGeometry* intersectionGeom = GEOSIntersection_r( geosctxt, mGeos, polygon->mGeos );
-      if ( intersectionGeom )
+      if ( GEOSPreparedIntersects_r( geosctxt, polygon->preparedGeom(), mGeos ) == 1 )
       {
-        double positionArea = 0;
-        if ( GEOSArea_r( geosctxt, mGeos, &positionArea ) == 1 )
+        //at least a partial intersection
+        cost += 1;
+
+        double px, py;
+
+        // check each corner
+        for ( int i = 0; i < 4; ++i )
         {
-          double intersectionArea = 0;
-          if ( GEOSArea_r( geosctxt, intersectionGeom, &intersectionArea ) == 1 )
+          px = x[i];
+          py = y[i];
+
+          for ( int a = 0; a < 2; ++a ) // and each middle of segment
           {
-            double portionCovered = intersectionArea / positionArea;
-            cost += portionCovered * 8.0; //cost of 8 if totally covered
+            if ( polygon->containsPoint( px, py ) )
+              cost++;
+            px = ( x[i] + x[( i+1 ) %4] ) / 2.0;
+            py = ( y[i] + y[( i+1 ) %4] ) / 2.0;
           }
         }
-        GEOSGeom_destroy_r( geosctxt, intersectionGeom );
+
+        px = ( x[0] + x[2] ) / 2.0;
+        py = ( y[0] + y[2] ) / 2.0;
+
+        //check the label center. if covered by polygon, cost of 4
+        if ( polygon->containsPoint( px, py ) )
+          cost += 4;
       }
     }
     catch ( GEOSException &e )
@@ -623,6 +631,9 @@ namespace pal
       QgsMessageLog::logMessage( QObject::tr( "Exception: %1" ).arg( e.what() ), QObject::tr( "GEOS" ) );
     }
 
+    //maintain scaling from 0 -> 12
+    cost = 12.0 * cost / 13.0;
+
     if ( nextPart )
     {
       cost += nextPart->polygonIntersectionCostForParts( polygon );
diff --git a/src/core/pal/pointset.cpp b/src/core/pal/pointset.cpp
index 20bd75a..f66134c 100644
--- a/src/core/pal/pointset.cpp
+++ b/src/core/pal/pointset.cpp
@@ -299,7 +299,7 @@ namespace pal
       GEOSCoordSeq_setX_r( geosctxt, seq, 0, x );
       GEOSCoordSeq_setY_r( geosctxt, seq, 0, y );
       GEOSGeometry* point = GEOSGeom_createPoint_r( geosctxt, seq );
-      bool result = ( GEOSPreparedContains_r( geosctxt, preparedGeom(), point ) == 1 );
+      bool result = ( GEOSPreparedContainsProperly_r( geosctxt, preparedGeom(), point ) == 1 );
       GEOSGeom_destroy_r( geosctxt, point );
 
       return result;
@@ -349,7 +349,7 @@ namespace pal
     try
     {
       GEOSGeometry* bboxGeos = GEOSGeom_createLinearRing_r( geosctxt, coord );
-      bool result = ( GEOSPreparedContains_r( geosctxt, preparedGeom(), bboxGeos ) == 1 );
+      bool result = ( GEOSPreparedContainsProperly_r( geosctxt, preparedGeom(), bboxGeos ) == 1 );
       GEOSGeom_destroy_r( geosctxt, bboxGeos );
       return result;
     }
diff --git a/src/core/qgsexpression.cpp b/src/core/qgsexpression.cpp
index 6c63b91..45404ce 100644
--- a/src/core/qgsexpression.cpp
+++ b/src/core/qgsexpression.cpp
@@ -2314,7 +2314,7 @@ const QList<QgsExpression::Function*>& QgsExpression::Functions()
     << new StaticFunction( "combine", 2, fcnCombine, "GeometryGroup" )
     << new StaticFunction( "union", 2, fcnCombine, "GeometryGroup" )
     << new StaticFunction( "geom_to_wkt", -1, fcnGeomToWKT, "GeometryGroup", QString(), false, QStringList(), false, QStringList() << "geomToWKT" )
-    << new StaticFunction( "geometry", 1, fcnGetGeometry, "GeometryGroup" )
+    << new StaticFunction( "geometry", 1, fcnGetGeometry, "GeometryGroup", QString(), true )
     << new StaticFunction( "transform", 3, fcnTransformGeometry, "GeometryGroup" )
     << new StaticFunction( "$rownum", 0, fcnRowNumber, "deprecated" )
     << new StaticFunction( "$id", 0, fcnFeatureId, "Record" )
diff --git a/src/core/qgsmaplayer.cpp b/src/core/qgsmaplayer.cpp
index 110fdd8..29b92a2 100644
--- a/src/core/qgsmaplayer.cpp
+++ b/src/core/qgsmaplayer.cpp
@@ -1380,6 +1380,7 @@ void QgsMapLayer::exportSldStyle( QDomDocument &doc, QString &errorMsg )
   // Create the root element
   QDomElement root = myDocument.createElementNS( "http://www.opengis.net/sld", "StyledLayerDescriptor" );
   root.setAttribute( "version", "1.1.0" );
+  root.setAttribute( "units", "mm" ); // default qgsmaprenderer is Millimeters
   root.setAttribute( "xsi:schemaLocation", "http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" );
   root.setAttribute( "xmlns:ogc", "http://www.opengis.net/ogc" );
   root.setAttribute( "xmlns:se", "http://www.opengis.net/se" );
diff --git a/src/core/qgsmaptopixelgeometrysimplifier.cpp b/src/core/qgsmaptopixelgeometrysimplifier.cpp
index 302cc1f..4641c1a 100644
--- a/src/core/qgsmaptopixelgeometrysimplifier.cpp
+++ b/src/core/qgsmaptopixelgeometrysimplifier.cpp
@@ -48,7 +48,7 @@ inline static QgsRectangle calculateBoundingBox( QGis::WkbType wkbType, const un
   r.setMinimal();
 
   int sizeOfDoubleX = sizeof( double );
-  int sizeOfDoubleY = QGis::wkbDimensions( wkbType ) == 3 /*hasZValue*/ ? 2 * sizeof( double ) : sizeof( double );
+  int sizeOfDoubleY = ( QGis::wkbDimensions( wkbType ) - 1 ) * sizeof( double );
 
   for ( size_t i = 0; i < numPoints; ++i )
   {
@@ -157,7 +157,6 @@ bool QgsMapToPixelSimplifier::simplifyWkbGeometry(
   bool writeHeader, bool isaLinearRing )
 {
   bool isGeneralizable = true;
-  bool hasZValue = QGis::wkbDimensions( wkbType ) == 3;
   bool result = false;
 
   // Save initial WKB settings to use when the simplification creates invalid geometries
@@ -206,7 +205,7 @@ bool QgsMapToPixelSimplifier::simplifyWkbGeometry(
     r.setMinimal();
 
     int sizeOfDoubleX = sizeof( double );
-    int sizeOfDoubleY = QGis::wkbDimensions( wkbType ) == 3 /*hasZValue*/ ? 2 * sizeof( double ) : sizeof( double );
+    int sizeOfDoubleY = ( QGis::wkbDimensions( wkbType ) - 1 ) * sizeof( double );
 
     int numPoints;
     memcpy( &numPoints, sourceWkb, 4 );
@@ -329,7 +328,7 @@ bool QgsMapToPixelSimplifier::simplifyWkbGeometry(
       memcpy( &numPoints_i, sourceWkb, 4 );
       QgsRectangle envelope_i = numRings == 1 ? envelope : calculateBoundingBox( wkbType, sourceWkb + 4, numPoints_i );
 
-      size_t sourceWkbSize_i = 4 + numPoints_i * ( hasZValue ? 3 : 2 ) * sizeof( double );
+      size_t sourceWkbSize_i = 4 + numPoints_i * QGis::wkbDimensions( wkbType ) * sizeof( double );
       size_t targetWkbSize_i = 0;
 
       result |= simplifyWkbGeometry( simplifyFlags, wkbType, sourceWkb, sourceWkbSize_i, targetWkb, targetWkbSize_i, envelope_i, map2pixelTol, false, true );
@@ -360,7 +359,7 @@ bool QgsMapToPixelSimplifier::simplifyWkbGeometry(
       {
         int numPoints_i;
         memcpy( &numPoints_i, wkb1 + 5, 4 );
-        int wkbSize_i = 4 + numPoints_i * ( hasZValue ? 3 : 2 ) * sizeof( double );
+        int wkbSize_i = 4 + numPoints_i * QGis::wkbDimensions( wkbType ) * sizeof( double );
 
         sourceWkbSize_i += 5 + wkbSize_i;
         wkb1 += 5 + wkbSize_i;
@@ -376,7 +375,7 @@ bool QgsMapToPixelSimplifier::simplifyWkbGeometry(
         {
           int numPoints_i;
           memcpy( &numPoints_i, wkb1, 4 );
-          int wkbSize_i = 4 + numPoints_i * ( hasZValue ? 3 : 2 ) * sizeof( double );
+          int wkbSize_i = 4 + numPoints_i * QGis::wkbDimensions( wkbType ) * sizeof( double );
 
           sourceWkbSize_i += wkbSize_i;
           wkb1 += wkbSize_i;
diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp
index 768adec..9a2e248 100644
--- a/src/core/qgsvectorfilewriter.cpp
+++ b/src/core/qgsvectorfilewriter.cpp
@@ -1982,10 +1982,10 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::writeAsVectorFormat( QgsVe
     req.setFlags( QgsFeatureRequest::NoGeometry );
   }
   req.setSubsetOfAttributes( allAttr );
+  if ( onlySelected )
+    req.setFilterFids( layer->selectedFeaturesIds() );
   QgsFeatureIterator fit = layer->getFeatures( req );
 
-  const QgsFeatureIds& ids = layer->selectedFeaturesIds();
-
   //create symbol table if needed
   if ( writer->symbologyExport() != NoSymbology )
   {
@@ -2027,9 +2027,6 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::writeAsVectorFormat( QgsVe
   // write all features
   while ( fit.nextFeature( fet ) )
   {
-    if ( onlySelected && !ids.contains( fet.id() ) )
-      continue;
-
     if ( shallTransform )
     {
       try
diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp
index c829683..1fc2608 100644
--- a/src/core/qgsvectorlayer.cpp
+++ b/src/core/qgsvectorlayer.cpp
@@ -619,17 +619,16 @@ QgsRectangle QgsVectorLayer::boundingBoxOfSelected()
   QgsFeature fet;
   if ( mDataProvider->capabilities() & QgsVectorDataProvider::SelectAtId )
   {
-    Q_FOREACH ( QgsFeatureId fid, mSelectedFeatureIds )
+    QgsFeatureIterator fit = getFeatures( QgsFeatureRequest()
+                                          .setFilterFids( mSelectedFeatureIds )
+                                          .setSubsetOfAttributes( QgsAttributeList() ) );
+
+    while ( fit.nextFeature( fet ) )
     {
-      if ( getFeatures( QgsFeatureRequest()
-                        .setFilterFid( fid )
-                        .setSubsetOfAttributes( QgsAttributeList() ) )
-           .nextFeature( fet ) &&
-           fet.constGeometry() )
-      {
-        r = fet.constGeometry()->boundingBox();
-        retval.combineExtentWith( &r );
-      }
+      if ( !fet.constGeometry() || fet.constGeometry()->isEmpty() )
+        continue;
+      r = fet.constGeometry()->boundingBox();
+      retval.combineExtentWith( &r );
     }
   }
   else
diff --git a/src/core/qgsvectorlayereditutils.cpp b/src/core/qgsvectorlayereditutils.cpp
index 386dce2..c564eb6 100644
--- a/src/core/qgsvectorlayereditutils.cpp
+++ b/src/core/qgsvectorlayereditutils.cpp
@@ -103,6 +103,13 @@ bool QgsVectorLayerEditUtils::deleteVertex( QgsFeatureId atFeatureId, int atVert
   if ( !geometry.deleteVertex( atVertex ) )
     return false;
 
+  if ( geometry.geometry() && geometry.geometry()->nCoordinates() == 0 )
+  {
+    //last vertex deleted, set geometry to null
+    geometry.setGeometry( 0 );
+  }
+
+
   L->editBuffer()->changeGeometry( atFeatureId, &geometry );
   return true;
 }
diff --git a/src/core/qgsvectorlayerfeatureiterator.cpp b/src/core/qgsvectorlayerfeatureiterator.cpp
index 61e07ed..fb52538 100644
--- a/src/core/qgsvectorlayerfeatureiterator.cpp
+++ b/src/core/qgsvectorlayerfeatureiterator.cpp
@@ -236,6 +236,17 @@ bool QgsVectorLayerFeatureIterator::fetchFeature( QgsFeature& f )
     if ( mHasVirtualAttributes )
       addVirtualAttributes( f );
 
+    if ( mRequest.filterType() == QgsFeatureRequest::FilterExpression && mProviderRequest.filterType() != QgsFeatureRequest::FilterExpression )
+    {
+        //filtering by expression, and couldn't do it on the provider side
+        mRequest.expressionContext()->setFeature( f );
+        if ( !mRequest.filterExpression()->evaluate( mRequest.expressionContext() ).toBool() )
+        {
+          //feature did not match filter
+          continue;
+        }
+    }
+
     // update geometry
     // TODO[MK]: FilterRect check after updating the geometry
     if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) )
diff --git a/src/core/qgsvectorlayerrenderer.cpp b/src/core/qgsvectorlayerrenderer.cpp
index d1c9b7b..a8936f1 100644
--- a/src/core/qgsvectorlayerrenderer.cpp
+++ b/src/core/qgsvectorlayerrenderer.cpp
@@ -152,7 +152,7 @@ bool QgsVectorLayerRenderer::render()
                                      .setFilterRect( requestExtent )
                                      .setSubsetOfAttributes( mAttrNames, mFields );
 
-  if ( !rendererFilter.isEmpty() )
+  if ( !rendererFilter.isEmpty() && rendererFilter != "TRUE" )
   {
     featureRequest.setFilterExpression( rendererFilter );
     featureRequest.setExpressionContext( mContext.expressionContext() );
@@ -303,28 +303,30 @@ void QgsVectorLayerRenderer::drawRendererV2( QgsFeatureIterator& fit )
       bool rendered = mRendererV2->renderFeature( fet, mContext, -1, sel, drawMarker );
 
       // labeling - register feature
-      Q_UNUSED( rendered );
-      if ( rendered && mContext.labelingEngine() )
+      if ( rendered )
       {
-        if ( mLabeling )
+        if ( mContext.labelingEngine() )
         {
-          mContext.labelingEngine()->registerFeature( mLayerID, fet, mContext );
-        }
-        if ( mDiagrams )
-        {
-          mContext.labelingEngine()->registerDiagramFeature( mLayerID, fet, mContext );
-        }
-      }
-      // new labeling engine
-      if ( rendered && mContext.labelingEngineV2() )
-      {
-        if ( mLabelProvider )
-        {
-          mLabelProvider->registerFeature( fet, mContext );
+          if ( mLabeling )
+          {
+            mContext.labelingEngine()->registerFeature( mLayerID, fet, mContext );
+          }
+          if ( mDiagrams )
+          {
+            mContext.labelingEngine()->registerDiagramFeature( mLayerID, fet, mContext );
+          }
         }
-        if ( mDiagramProvider )
+        // new labeling engine
+        if ( mContext.labelingEngineV2() )
         {
-          mDiagramProvider->registerFeature( fet, mContext );
+          if ( mLabelProvider )
+          {
+            mLabelProvider->registerFeature( fet, mContext );
+          }
+          if ( mDiagramProvider )
+          {
+            mDiagramProvider->registerFeature( fet, mContext );
+          }
         }
       }
     }
diff --git a/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp b/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp
index c8e0d21..040556b 100644
--- a/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp
+++ b/src/core/symbology-ng/qgsellipsesymbollayerv2.cpp
@@ -27,22 +27,23 @@
 #include <QDomElement>
 
 QgsEllipseSymbolLayerV2::QgsEllipseSymbolLayerV2()
-    : mSymbolName( "circle" )
+    : QgsMarkerSymbolLayerV2()
+    , mSymbolName( "circle" )
     , mSymbolWidth( 4 )
     , mSymbolWidthUnit( QgsSymbolV2::MM )
     , mSymbolHeight( 3 )
     , mSymbolHeightUnit( QgsSymbolV2::MM )
-    , mFillColor( Qt::white )
     , mOutlineColor( Qt::black )
     , mOutlineStyle( Qt::SolidLine )
     , mOutlineWidth( 0 )
     , mOutlineWidthUnit( QgsSymbolV2::MM )
 {
+  mColor = Qt::white;
   mPen.setColor( mOutlineColor );
   mPen.setStyle( mOutlineStyle );
   mPen.setWidth( 1.0 );
   mPen.setJoinStyle( Qt::MiterJoin );
-  mBrush.setColor( mFillColor );
+  mBrush.setColor( mColor );
   mBrush.setStyle( Qt::SolidPattern );
   mOffset = QPointF( 0, 0 );
 
@@ -307,7 +308,7 @@ void QgsEllipseSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context )
   mPen.setColor( mOutlineColor );
   mPen.setStyle( mOutlineStyle );
   mPen.setWidthF( QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), mOutlineWidth, mOutlineWidthUnit, mOutlineWidthMapUnitScale ) );
-  mBrush.setColor( mFillColor );
+  mBrush.setColor( mColor );
   prepareExpressions( context );
 }
 
@@ -339,7 +340,7 @@ void QgsEllipseSymbolLayerV2::writeSldMarker( QDomDocument &doc, QDomElement &el
   QDomElement graphicElem = doc.createElement( "se:Graphic" );
   element.appendChild( graphicElem );
 
-  QgsSymbolLayerV2Utils::wellKnownMarkerToSld( doc, graphicElem, mSymbolName, mFillColor, mOutlineColor, mOutlineStyle, mOutlineWidth, mSymbolWidth );
+  QgsSymbolLayerV2Utils::wellKnownMarkerToSld( doc, graphicElem, mSymbolName, mColor, mOutlineColor, mOutlineStyle, mOutlineWidth, mSymbolWidth );
 
   // store w/h factor in a <VendorOption>
   double widthHeightFactor = mSymbolWidth / mSymbolHeight;
@@ -450,7 +451,7 @@ QgsStringMap QgsEllipseSymbolLayerV2::properties() const
   map["outline_width"] = QString::number( mOutlineWidth );
   map["outline_width_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOutlineWidthUnit );
   map["outline_width_map_unit_scale"] = QgsSymbolLayerV2Utils::encodeMapUnitScale( mOutlineWidthMapUnitScale );
-  map["color"] = QgsSymbolLayerV2Utils::encodeColor( mFillColor );
+  map["color"] = QgsSymbolLayerV2Utils::encodeColor( mColor );
   map["outline_color"] = QgsSymbolLayerV2Utils::encodeColor( mOutlineColor );
   map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset );
   map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit );
@@ -621,10 +622,10 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
 
   //fill color
   bool ok;
-  QColor fc = mFillColor;
+  QColor fc = mColor;
   if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL_COLOR ) )
   {
-    context->setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mFillColor ) );
+    context->setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mColor ) );
     QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL_COLOR, *context, QVariant(), &ok ).toString();
     if ( ok )
       fc = QgsSymbolLayerV2Utils::decodeColor( colorString );
diff --git a/src/core/symbology-ng/qgsellipsesymbollayerv2.h b/src/core/symbology-ng/qgsellipsesymbollayerv2.h
index 78cef9a..0daf99b 100644
--- a/src/core/symbology-ng/qgsellipsesymbollayerv2.h
+++ b/src/core/symbology-ng/qgsellipsesymbollayerv2.h
@@ -57,8 +57,8 @@ class CORE_EXPORT QgsEllipseSymbolLayerV2: public QgsMarkerSymbolLayerV2
     void setOutlineWidth( double w ) { mOutlineWidth = w; }
     double outlineWidth() const { return mOutlineWidth; }
 
-    void setFillColor( const QColor& c ) override { mFillColor = c;}
-    QColor fillColor() const override { return mFillColor; }
+    void setFillColor( const QColor& c ) override { setColor( c ); }
+    QColor fillColor() const override { return color(); }
 
     void setOutlineColor( const QColor& c ) override { mOutlineColor = c; }
     QColor outlineColor() const override { return mOutlineColor; }
@@ -95,7 +95,6 @@ class CORE_EXPORT QgsEllipseSymbolLayerV2: public QgsMarkerSymbolLayerV2
     double mSymbolHeight;
     QgsSymbolV2::OutputUnit mSymbolHeightUnit;
     QgsMapUnitScale mSymbolHeightMapUnitScale;
-    QColor mFillColor;
     QColor mOutlineColor;
     Qt::PenStyle mOutlineStyle;
     double mOutlineWidth;
diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp
index daf831c..2c9bcd2 100644
--- a/src/core/symbology-ng/qgsfillsymbollayerv2.cpp
+++ b/src/core/symbology-ng/qgsfillsymbollayerv2.cpp
@@ -1701,6 +1701,14 @@ Qt::PenStyle QgsImageFillSymbolLayer::dxfPenStyle() const
 #endif //0
 }
 
+QSet<QString> QgsImageFillSymbolLayer::usedAttributes() const
+{
+  QSet<QString> attr = QgsFillSymbolLayerV2::usedAttributes();
+  if ( mOutline )
+    attr.unite( mOutline->usedAttributes() );
+  return attr;
+}
+
 
 //QgsSVGFillSymbolLayer
 
@@ -2319,7 +2327,7 @@ QgsSymbolV2* QgsLinePatternFillSymbolLayer::subSymbol()
 
 QSet<QString> QgsLinePatternFillSymbolLayer::usedAttributes() const
 {
-  QSet<QString> attr = QgsFillSymbolLayerV2::usedAttributes();
+  QSet<QString> attr = QgsImageFillSymbolLayer::usedAttributes();
   if ( mFillLineSymbol )
     attr.unite( mFillLineSymbol->usedAttributes() );
   return attr;
@@ -2725,6 +2733,7 @@ void QgsLinePatternFillSymbolLayer::applyPattern( const QgsSymbolV2RenderContext
   QgsMapToPixel mtp( context.renderContext().mapToPixel().mapUnitsPerPixel() / context.renderContext().rasterScaleFactor() );
   lineRenderContext.setMapToPixel( mtp );
   lineRenderContext.setForceVectorOutput( false );
+  lineRenderContext.setExpressionContext( context.renderContext().expressionContext() );
 
   fillLineSymbol->startRender( lineRenderContext, context.fields() );
 
@@ -2874,7 +2883,8 @@ QString QgsLinePatternFillSymbolLayer::ogrFeatureStyleWidth( double widthScaleFa
 void QgsLinePatternFillSymbolLayer::applyDataDefinedSettings( QgsSymbolV2RenderContext &context )
 {
   if ( !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINEANGLE ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE )
-       && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINEWIDTH ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR ) )
+       && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINEWIDTH ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR )
+       && ( !mFillLineSymbol || !mFillLineSymbol->hasDataDefinedProperties() ) )
   {
     return; //no data defined settings
   }
@@ -3138,6 +3148,7 @@ void QgsPointPatternFillSymbolLayer::applyPattern( const QgsSymbolV2RenderContex
     QgsMapToPixel mtp( context.renderContext().mapToPixel().mapUnitsPerPixel() / context.renderContext().rasterScaleFactor() );
     pointRenderContext.setMapToPixel( mtp );
     pointRenderContext.setForceVectorOutput( false );
+    pointRenderContext.setExpressionContext( context.renderContext().expressionContext() );
 
     mMarkerSymbol->startRender( pointRenderContext, context.fields() );
 
@@ -3286,14 +3297,12 @@ bool QgsPointPatternFillSymbolLayer::setSubSymbol( QgsSymbolV2* symbol )
 
 void QgsPointPatternFillSymbolLayer::applyDataDefinedSettings( QgsSymbolV2RenderContext &context )
 {
-#if 0
-  // TODO: enable but check also if mMarkerSymbol has data defined properties
   if ( !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE_X ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE_Y )
-       && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_X ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_Y ) )
+       && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_X ) && !hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISPLACEMENT_Y )
+       && ( !mMarkerSymbol || !mMarkerSymbol->hasDataDefinedProperties() ) )
   {
     return;
   }
-#endif
 
   double distanceX = mDistanceX;
   if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_DISTANCE_X ) )
@@ -3329,7 +3338,7 @@ double QgsPointPatternFillSymbolLayer::estimateMaxBleed() const
 
 QSet<QString> QgsPointPatternFillSymbolLayer::usedAttributes() const
 {
-  QSet<QString> attributes = QgsSymbolLayerV2::usedAttributes();
+  QSet<QString> attributes = QgsImageFillSymbolLayer::usedAttributes();
 
   if ( mMarkerSymbol )
     attributes.unite( mMarkerSymbol->usedAttributes() );
@@ -3455,9 +3464,7 @@ bool QgsCentroidFillSymbolLayerV2::setSubSymbol( QgsSymbolV2* symbol )
 
 QSet<QString> QgsCentroidFillSymbolLayerV2::usedAttributes() const
 {
-  QSet<QString> attributes;
-
-  attributes.unite( QgsSymbolLayerV2::usedAttributes() );
+  QSet<QString> attributes = QgsFillSymbolLayerV2::usedAttributes();
 
   if ( mMarker )
     attributes.unite( mMarker->usedAttributes() );
diff --git a/src/core/symbology-ng/qgsfillsymbollayerv2.h b/src/core/symbology-ng/qgsfillsymbollayerv2.h
index 22c6e8e..1856736 100644
--- a/src/core/symbology-ng/qgsfillsymbollayerv2.h
+++ b/src/core/symbology-ng/qgsfillsymbollayerv2.h
@@ -571,6 +571,8 @@ class CORE_EXPORT QgsImageFillSymbolLayer: public QgsFillSymbolLayerV2
     virtual QColor dxfColor( QgsSymbolV2RenderContext& context ) const override;
     virtual Qt::PenStyle dxfPenStyle() const override;
 
+    QSet<QString> usedAttributes() const override;
+
   protected:
     QBrush mBrush;
     double mNextAngle; // mAngle / data defined angle
@@ -844,7 +846,6 @@ class CORE_EXPORT QgsSVGFillSymbolLayer: public QgsImageFillSymbolLayer
 
     //param(fill), param(outline), param(outline-width) are going
     //to be replaced in memory
-    QColor mSvgFillColor;
     QColor mSvgOutlineColor;
     double mSvgOutlineWidth;
     QgsSymbolV2::OutputUnit mSvgOutlineWidthUnit;
diff --git a/src/core/symbology-ng/qgslinesymbollayerv2.cpp b/src/core/symbology-ng/qgslinesymbollayerv2.cpp
index a8fa1eb..9dfe31b 100644
--- a/src/core/symbology-ng/qgslinesymbollayerv2.cpp
+++ b/src/core/symbology-ng/qgslinesymbollayerv2.cpp
@@ -302,6 +302,7 @@ void QgsSimpleLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
   applyDataDefinedSymbology( context, mPen, mSelPen, offset );
 
   p->setPen( context.selected() ? mSelPen : mPen );
+  p->setBrush( Qt::NoBrush );
 
   // Disable 'Antialiasing' if the geometry was generalized in the current RenderContext (We known that it must have least #2 points).
   if ( points.size() <= 2 &&
@@ -310,21 +311,41 @@ void QgsSimpleLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
        ( p->renderHints() & QPainter::Antialiasing ) )
   {
     p->setRenderHint( QPainter::Antialiasing, false );
+#if 0
     p->drawPolyline( points );
+#else
+    QPainterPath path;
+    path.addPolygon( points );
+    p->drawPath( path );
+#endif
     p->setRenderHint( QPainter::Antialiasing, true );
     return;
   }
 
   if ( qgsDoubleNear( offset, 0 ) )
   {
+#if 0
     p->drawPolyline( points );
+#else
+    QPainterPath path;
+    path.addPolygon( points );
+    p->drawPath( path );
+#endif
   }
   else
   {
     double scaledOffset = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), offset, mOffsetUnit, mOffsetMapUnitScale );
     QList<QPolygonF> mline = ::offsetLine( points, scaledOffset, context.feature() ? context.feature()->constGeometry()->type() : QGis::Line );
     for ( int part = 0; part < mline.count(); ++part )
-      p->drawPolyline( mline[ part ] );
+    {
+#if 0
+      p->drawPolyline( mline );
+#else
+      QPainterPath path;
+      path.addPolygon( mline[ part ] );
+      p->drawPath( path );
+#endif
+    }
   }
 }
 
diff --git a/src/core/symbology-ng/qgsrulebasedrendererv2.cpp b/src/core/symbology-ng/qgsrulebasedrendererv2.cpp
index 956b3c4..b42d7dc 100644
--- a/src/core/symbology-ng/qgsrulebasedrendererv2.cpp
+++ b/src/core/symbology-ng/qgsrulebasedrendererv2.cpp
@@ -435,7 +435,12 @@ bool QgsRuleBasedRendererV2::Rule::startRender( QgsRenderContext& context, const
   QString sf;
   // If there are subfilters present (and it's not a single empty one), group them and join them with OR
   if ( subfilters.length() > 1 || subfilters.value( 0 ).trimmed().length() > 0 )
-    sf = subfilters.join( ") OR (" ).prepend( "(" ).append( ")" );
+  {
+    if ( subfilters.contains( "TRUE" ) )
+      sf = "TRUE";
+    else
+      sf = subfilters.join( ") OR (" ).prepend( "(" ).append( ")" );
+  }
 
   // Now join the subfilters with their parent (this) based on if
   // * The parent is an else rule
@@ -521,8 +526,8 @@ QgsRuleBasedRendererV2::Rule::RenderResult QgsRuleBasedRendererV2::Rule::renderF
     {
       //QgsDebugMsg(QString("add job at level %1").arg(normZLevel));
       renderQueue[normZLevel].jobs.append( new RenderJob( featToRender, mSymbol ) );
+      rendered = true;
     }
-    rendered = true;
   }
 
   bool willrendersomething = false;
@@ -548,7 +553,7 @@ QgsRuleBasedRendererV2::Rule::RenderResult QgsRuleBasedRendererV2::Rule::renderF
       rendered |= rule->renderFeature( featToRender, context, renderQueue ) == Rendered;
     }
   }
-  if ( !mIsActive )
+  if ( !mIsActive || ( mSymbol && !rendered ) )
     return Inactive;
   else if ( rendered )
     return Rendered;
diff --git a/src/core/symbology-ng/qgssymbollayerv2.cpp b/src/core/symbology-ng/qgssymbollayerv2.cpp
index 866f5cd..a858155 100644
--- a/src/core/symbology-ng/qgssymbollayerv2.cpp
+++ b/src/core/symbology-ng/qgssymbollayerv2.cpp
@@ -736,7 +736,9 @@ void QgsFillSymbolLayerV2::_renderPolygon( QPainter* p, const QPolygonF& points,
     return;
   }
 
-  if ( rings == NULL )
+  // polygons outlines are sometimes rendered wrongly with drawPolygon, when
+  // clipped (see #13343), so use drawPath instead.
+  if ( !rings && p->pen().style() == Qt::NoPen )
   {
     // simple polygon without holes
     p->drawPolygon( points );
@@ -748,11 +750,14 @@ void QgsFillSymbolLayerV2::_renderPolygon( QPainter* p, const QPolygonF& points,
     QPolygonF outerRing = points;
     path.addPolygon( outerRing );
 
-    QList<QPolygonF>::const_iterator it = rings->constBegin();
-    for ( ; it != rings->constEnd(); ++it )
+    if ( rings )
     {
-      QPolygonF ring = *it;
-      path.addPolygon( ring );
+      QList<QPolygonF>::const_iterator it = rings->constBegin();
+      for ( ; it != rings->constEnd(); ++it )
+      {
+        QPolygonF ring = *it;
+        path.addPolygon( ring );
+      }
     }
 
     p->drawPath( path );
diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp
index 8715fa6..112db7c 100644
--- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp
+++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp
@@ -781,7 +781,11 @@ QList<QPolygonF> offsetLine( QPolygonF polyline, double dist, QGis::GeometryType
 
       if ( QGis::flatType( tempGeometry->wkbType() ) == QGis::WKBLineString )
       {
-        resultLine.append( makeOffsetGeometry( tempGeometry->asPolyline() ) );
+        QgsPolyline line = tempGeometry->asPolyline();
+        // Reverse the line if offset was negative, see
+        // http://hub.qgis.org/issues/13811
+        if ( dist < 0 ) std::reverse(line.begin(), line.end() );
+        resultLine.append( makeOffsetGeometry( line ) );
         delete tempGeometry;
         return resultLine;
       }
diff --git a/src/core/symbology-ng/qgssymbolv2.cpp b/src/core/symbology-ng/qgssymbolv2.cpp
index 50a7df6..cb0d0d8 100644
--- a/src/core/symbology-ng/qgssymbolv2.cpp
+++ b/src/core/symbology-ng/qgssymbolv2.cpp
@@ -490,6 +490,16 @@ QSet<QString> QgsSymbolV2::usedAttributes() const
   return attributes;
 }
 
+bool QgsSymbolV2::hasDataDefinedProperties() const
+{
+  Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers )
+  {
+    if ( layer->hasDataDefinedProperties() )
+      return true;
+  }
+  return false;
+}
+
 ////////////////////
 
 
diff --git a/src/core/symbology-ng/qgssymbolv2.h b/src/core/symbology-ng/qgssymbolv2.h
index 3724536..d206156 100644
--- a/src/core/symbology-ng/qgssymbolv2.h
+++ b/src/core/symbology-ng/qgssymbolv2.h
@@ -217,6 +217,11 @@ class CORE_EXPORT QgsSymbolV2
 
     QSet<QString> usedAttributes() const;
 
+    /** Returns whether the symbol utilises any data defined properties.
+     * @note added in QGIS 2.12
+     */
+    bool hasDataDefinedProperties() const;
+
     //! @note the layer will be NULL after stopRender
     void setLayer( const QgsVectorLayer* layer ) { mLayer = layer; }
     const QgsVectorLayer* layer() const { return mLayer; }
diff --git a/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp
index 642bcfb..0d4176a 100644
--- a/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp
@@ -68,10 +68,10 @@ void QgsDefaultSearchWidgetWrapper::setExpression( QString exp )
     str = QString( "%1 %2 '%3'" )
           .arg( QgsExpression::quotedColumnRef( fieldName ),
                 numeric ? "=" : mCaseString,
-                numeric
-                ? exp.replace( "'", "''" )
+                numeric ?
+                exp.replace( '\'', "''" )
                 :
-                "%" + exp.replace( "'", "''" ) + "%" ); // escape quotes
+                '%' + exp.replace( '\'', "''" ) + '%' ); // escape quotes
   }
   mExpression = str;
 }
diff --git a/src/gui/editorwidgets/qgsrelationreferencewidget.cpp b/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
index 02c22be..5977131 100644
--- a/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
+++ b/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
@@ -353,7 +353,7 @@ QVariant QgsRelationReferenceWidget::foreignKey()
   {
     if ( !mFeature.isValid() )
     {
-      return QVariant( mReferencingLayer->fields().at( mFkeyFieldIdx ).type() );
+      return QVariant( mReferencingLayer->fields().at( mReferencingLayer->fieldNameIndex( mRelation.fieldPairs().at( 0 ).first ) ).type() );
     }
     else
     {
diff --git a/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.cpp
index b219eae..a23b75f 100644
--- a/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.cpp
@@ -23,7 +23,7 @@
 #include <QSizePolicy>
 
 QgsValueMapSearchWidgetWrapper::QgsValueMapSearchWidgetWrapper( QgsVectorLayer* vl, int fieldIdx, QWidget* parent )
-    : QgsDefaultSearchWidgetWrapper( vl, fieldIdx, parent ),
+    : QgsSearchWidgetWrapper( vl, fieldIdx, parent ),
     mComboBox( NULL )
 {
 }
@@ -33,10 +33,13 @@ QWidget* QgsValueMapSearchWidgetWrapper::createWidget( QWidget* parent )
   return new QComboBox( parent );
 }
 
-void QgsValueMapSearchWidgetWrapper::comboBoxIndexChanged( int )
+void QgsValueMapSearchWidgetWrapper::comboBoxIndexChanged( int idx )
 {
   if ( mComboBox )
-    setExpression( mComboBox->itemData( mComboBox->currentIndex() ).toString() );
+  {
+    setExpression( mComboBox->itemData( idx ).toString() );
+    emit expressionChanged( mExpression );
+  }
 }
 
 bool QgsValueMapSearchWidgetWrapper::applyDirectly()
@@ -44,6 +47,16 @@ bool QgsValueMapSearchWidgetWrapper::applyDirectly()
   return true;
 }
 
+QString QgsValueMapSearchWidgetWrapper::expression()
+{
+  return mExpression;
+}
+
+bool QgsValueMapSearchWidgetWrapper::valid()
+{
+  return true;
+}
+
 void QgsValueMapSearchWidgetWrapper::initWidget( QWidget* editor )
 {
   mComboBox = qobject_cast<QComboBox*>( editor );
@@ -63,3 +76,15 @@ void QgsValueMapSearchWidgetWrapper::initWidget( QWidget* editor )
   }
 }
 
+void QgsValueMapSearchWidgetWrapper::setExpression( QString exp )
+{
+  QString fieldName = layer()->fields().at( mFieldIdx ).name();
+  QString str;
+
+  str = QString( "%1 = '%2'" )
+        .arg( QgsExpression::quotedColumnRef( fieldName ),
+              exp.replace( '\'', "''" ) );
+
+  mExpression = str;
+}
+
diff --git a/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.h b/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.h
index f1a34a0..84b6dad 100644
--- a/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.h
+++ b/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.h
@@ -16,24 +16,33 @@
 #ifndef QGSVALUEMAPSEARCHWIDGETWRAPPER_H
 #define QGSVALUEMAPSEARCHWIDGETWRAPPER_H
 
-#include "qgsdefaultsearchwidgetwrapper.h"
+#include "qgssearchwidgetwrapper.h"
 #include <QComboBox>
 
+/**
+ * Wraps a value map search widget. This widget will offer a combobox with values from another layer
+ * referenced by a foreign key (a constraint may be set but is not required on data level).
+ * It will be used as a search widget and produces expression to look for in the layer.
+ */
 
-
-class GUI_EXPORT QgsValueMapSearchWidgetWrapper : public QgsDefaultSearchWidgetWrapper
+class GUI_EXPORT QgsValueMapSearchWidgetWrapper : public QgsSearchWidgetWrapper
 {
     Q_OBJECT
   public:
     explicit QgsValueMapSearchWidgetWrapper( QgsVectorLayer* vl, int fieldIdx, QWidget* parent = 0 );
     bool applyDirectly() override;
+    QString expression() override;
+    bool valid() override;
 
   protected:
     QWidget* createWidget( QWidget* parent ) override;
     void initWidget( QWidget* editor ) override;
 
+  protected slots:
+    void setExpression( QString exp ) override;
+
   private slots:
-    void comboBoxIndexChanged( int );
+    void comboBoxIndexChanged( int idx );
 
   private:
     QComboBox * mComboBox;
diff --git a/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.cpp
index 490a5b2..959fa4a 100644
--- a/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.cpp
@@ -21,11 +21,12 @@
 #include "qgsvectorlayer.h"
 #include "qgsfilterlineedit.h"
 
+#include <QSettings>
 #include <QStringListModel>
 #include <QCompleter>
 
 QgsValueRelationSearchWidgetWrapper::QgsValueRelationSearchWidgetWrapper( QgsVectorLayer* vl, int fieldIdx, QWidget* parent )
-    : QgsDefaultSearchWidgetWrapper( vl, fieldIdx, parent )
+    : QgsSearchWidgetWrapper( vl, fieldIdx, parent )
     , mComboBox( 0 )
     , mListWidget( 0 )
     , mLineEdit( 0 )
@@ -42,7 +43,12 @@ bool QgsValueRelationSearchWidgetWrapper::applyDirectly()
   return true;
 }
 
-QVariant QgsValueRelationSearchWidgetWrapper::value()
+QString QgsValueRelationSearchWidgetWrapper::expression()
+{
+  return mExpression;
+}
+
+QVariant QgsValueRelationSearchWidgetWrapper::value() const
 {
   QVariant v;
 
@@ -83,9 +89,38 @@ QVariant QgsValueRelationSearchWidgetWrapper::value()
   return v;
 }
 
+bool QgsValueRelationSearchWidgetWrapper::valid()
+{
+  return true;
+}
+
 void QgsValueRelationSearchWidgetWrapper::valueChanged()
 {
-  setExpression( value().toString() );
+  QVariant vl = value();
+  QSettings settings;
+  setExpression( vl.isNull() ? settings.value( "qgis/nullValue", "NULL" ).toString() : vl.toString() );
+  emit expressionChanged( mExpression );
+}
+
+void QgsValueRelationSearchWidgetWrapper::setExpression( QString exp )
+{
+  QSettings settings;
+  QString nullValue = settings.value( "qgis/nullValue", "NULL" ).toString();
+  QString fieldName = layer()->fields().at( mFieldIdx ).name();
+
+  QString str;
+  if ( exp == nullValue )
+  {
+    str = QString( "%1 IS NULL" ).arg( QgsExpression::quotedColumnRef( fieldName ) );
+  }
+  else
+  {
+    str = QString( "%1 = '%3'" )
+          .arg( QgsExpression::quotedColumnRef( fieldName ),
+                exp.replace( '\'', "''" )
+              );
+  }
+  mExpression = str;
 }
 
 QWidget* QgsValueRelationSearchWidgetWrapper::createWidget( QWidget* parent )
@@ -98,6 +133,7 @@ QWidget* QgsValueRelationSearchWidgetWrapper::createWidget( QWidget* parent )
   {
     return new QgsFilterLineEdit( parent );
   }
+  else
   {
     return new QComboBox( parent );
   }
diff --git a/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.h b/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.h
index c88199b..a2378ae 100644
--- a/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.h
+++ b/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.h
@@ -16,7 +16,7 @@
 #ifndef QGSVALUERELATIONSEARCHWIDGETWRAPPER_H
 #define QGSVALUERELATIONSEARCHWIDGETWRAPPER_H
 
-#include "qgsdefaultsearchwidgetwrapper.h"
+#include "qgssearchwidgetwrapper.h"
 #include "qgsvaluerelationwidgetwrapper.h"
 
 #include <QComboBox>
@@ -26,26 +26,12 @@
 class QgsValueRelationWidgetFactory;
 
 /**
- * Wraps a value relation widget. This widget will offer a combobox with values from another layer
+ * Wraps a value relation search  widget. This widget will offer a combobox with values from another layer
  * referenced by a foreign key (a constraint may be set but is not required on data level).
- * This is useful for having value lists on a separate layer containing codes and their
- * translation to human readable names.
- *
- * Options:
- *
- * <ul>
- * <li><b>Layer</b> <i>The id of the referenced layer.</i></li>
- * <li><b>Key</b> <i>The key field on the referenced layer (code).</i></li>
- * <li><b>Value</b> <i>The value field on the referenced layer (human readable name).</i></li>
- * <li><b>AllowMulti</b> <i>If set to True, will allow multiple selections. This requires the data type to be a string. This does NOT work with normalized database structures.</i></li>
- * <li><b>AllowNull</b> <i>Will offer NULL as a possible value.</i></li>
- * <li><b>FilterExpression</b> <i>If not empty, will be used as expression. Only if this evaluates to True, the value will be shown.</i></li>
- * <li><b>OrderByValue</b> <i>Will order by value instead of key.</i></li>
- * </ul>
- *
+ * It will be used as a search widget and produces expression to look for in the layer.
  */
 
-class GUI_EXPORT QgsValueRelationSearchWidgetWrapper : public QgsDefaultSearchWidgetWrapper
+class GUI_EXPORT QgsValueRelationSearchWidgetWrapper : public QgsSearchWidgetWrapper
 {
     Q_OBJECT
 
@@ -56,8 +42,9 @@ class GUI_EXPORT QgsValueRelationSearchWidgetWrapper : public QgsDefaultSearchWi
   public:
     explicit QgsValueRelationSearchWidgetWrapper( QgsVectorLayer* vl, int fieldIdx, QWidget* parent = 0 );
     bool applyDirectly() override;
-    QVariant value();
-
+    QString expression() override;
+    bool valid() override;
+    QVariant value() const;
 
   protected:
     QWidget* createWidget( QWidget* parent ) override;
@@ -66,6 +53,9 @@ class GUI_EXPORT QgsValueRelationSearchWidgetWrapper : public QgsDefaultSearchWi
   public slots:
     void valueChanged();
 
+  protected slots:
+    void setExpression( QString exp ) override;
+
   private:
     QComboBox* mComboBox;
     QListWidget* mListWidget;
diff --git a/src/plugins/geometry_checker/CMakeLists.txt b/src/plugins/geometry_checker/CMakeLists.txt
index 313fc64..ba0d0e7 100644
--- a/src/plugins/geometry_checker/CMakeLists.txt
+++ b/src/plugins/geometry_checker/CMakeLists.txt
@@ -39,8 +39,10 @@ SET (geometrychecker_HDRS
 
 SET (geometrychecker_MOC_HDRS
     qgsgeometrychecker.h
+    qgsgeometrycheckerplugin.h
     checks/qgsgeometryanglecheck.h
     checks/qgsgeometryareacheck.h
+    checks/qgsgeometrycheck.h
     checks/qgsgeometrydegeneratepolygoncheck.h
     checks/qgsgeometryduplicatecheck.h
     checks/qgsgeometryduplicatenodescheck.h
diff --git a/src/plugins/geometry_checker/checks/qgsgeometrycheck.h b/src/plugins/geometry_checker/checks/qgsgeometrycheck.h
index 593d24a..84d0db8 100644
--- a/src/plugins/geometry_checker/checks/qgsgeometrycheck.h
+++ b/src/plugins/geometry_checker/checks/qgsgeometrycheck.h
@@ -41,6 +41,8 @@ class QgsGeometryCheckPrecision
 
 class QgsGeometryCheck : public QObject
 {
+    Q_OBJECT
+
   public:
     enum ChangeWhat { ChangeFeature, ChangePart, ChangeRing, ChangeNode };
     enum ChangeType { ChangeAdded, ChangeRemoved, ChangeChanged };
diff --git a/src/plugins/geometry_checker/qgsgeometrycheckerplugin.cpp b/src/plugins/geometry_checker/qgsgeometrycheckerplugin.cpp
index ca0168a..1615962 100644
--- a/src/plugins/geometry_checker/qgsgeometrycheckerplugin.cpp
+++ b/src/plugins/geometry_checker/qgsgeometrycheckerplugin.cpp
@@ -44,3 +44,67 @@ void QgsGeometryCheckerPlugin::unload()
   mMenuAction = 0;
   mIface->removePluginVectorMenu( QApplication::translate( "QgsGeometryCheckerPlugin", "G&eometry Tools" ), mMenuAction );
 }
+
+
+//////////////////////////////////////////////////////////////////////////
+//
+//
+//  THE FOLLOWING CODE IS AUTOGENERATED BY THE PLUGIN BUILDER SCRIPT
+//    YOU WOULD NORMALLY NOT NEED TO MODIFY THIS, AND YOUR PLUGIN
+//      MAY NOT WORK PROPERLY IF YOU MODIFY THIS INCORRECTLY
+//
+//
+//////////////////////////////////////////////////////////////////////////
+
+
+/**
+ * Required extern functions needed  for every plugin
+ * These functions can be called prior to creating an instance
+ * of the plugin class
+ */
+// Class factory to return a new instance of the plugin class
+QGISEXTERN QgisPlugin * classFactory( QgisInterface * theQgisInterfacePointer )
+{
+  return new QgsGeometryCheckerPlugin( theQgisInterfacePointer );
+}
+// Return the name of the plugin - note that we do not user class members as
+// the class may not yet be insantiated when this method is called.
+QGISEXTERN QString name()
+{
+  return sName;
+}
+
+// Return the description
+QGISEXTERN QString description()
+{
+  return sDescription;
+}
+
+// Return the category
+QGISEXTERN QString category()
+{
+  return sCategory;
+}
+
+// Return the type (either UI or MapLayer plugin)
+QGISEXTERN int type()
+{
+  return sPluginType;
+}
+
+// Return the version number for the plugin
+QGISEXTERN QString version()
+{
+  return sPluginVersion;
+}
+
+QGISEXTERN QString icon()
+{
+  return sPluginIcon;
+}
+
+// Delete ourself
+QGISEXTERN void unload( QgisPlugin * thePluginPointer )
+{
+  delete thePluginPointer;
+}
diff --git a/src/plugins/geometry_checker/qgsgeometrycheckerplugin.h b/src/plugins/geometry_checker/qgsgeometrycheckerplugin.h
index 491d62d..8551765 100644
--- a/src/plugins/geometry_checker/qgsgeometrycheckerplugin.h
+++ b/src/plugins/geometry_checker/qgsgeometrycheckerplugin.h
@@ -27,6 +27,8 @@ class QgsGeometryCheckerDialog;
 
 class QgsGeometryCheckerPlugin : public QObject, public QgisPlugin
 {
+    Q_OBJECT
+
   public:
     explicit QgsGeometryCheckerPlugin( QgisInterface* iface );
     void initGui() override;
@@ -46,68 +48,4 @@ static const QString sPluginVersion = QApplication::translate( "QgsGeometryCheck
 static const QgisPlugin::PLUGINTYPE sPluginType = QgisPlugin::UI;
 static const QString sPluginIcon = ":/geometrychecker/icons/geometrychecker.png";
 
-
-//////////////////////////////////////////////////////////////////////////
-//
-//
-//  THE FOLLOWING CODE IS AUTOGENERATED BY THE PLUGIN BUILDER SCRIPT
-//    YOU WOULD NORMALLY NOT NEED TO MODIFY THIS, AND YOUR PLUGIN
-//      MAY NOT WORK PROPERLY IF YOU MODIFY THIS INCORRECTLY
-//
-//
-//////////////////////////////////////////////////////////////////////////
-
-
-/**
- * Required extern functions needed  for every plugin
- * These functions can be called prior to creating an instance
- * of the plugin class
- */
-// Class factory to return a new instance of the plugin class
-QGISEXTERN QgisPlugin * classFactory( QgisInterface * theQgisInterfacePointer )
-{
-  return new QgsGeometryCheckerPlugin( theQgisInterfacePointer );
-}
-// Return the name of the plugin - note that we do not user class members as
-// the class may not yet be insantiated when this method is called.
-QGISEXTERN QString name()
-{
-  return sName;
-}
-
-// Return the description
-QGISEXTERN QString description()
-{
-  return sDescription;
-}
-
-// Return the category
-QGISEXTERN QString category()
-{
-  return sCategory;
-}
-
-// Return the type (either UI or MapLayer plugin)
-QGISEXTERN int type()
-{
-  return sPluginType;
-}
-
-// Return the version number for the plugin
-QGISEXTERN QString version()
-{
-  return sPluginVersion;
-}
-
-QGISEXTERN QString icon()
-{
-  return sPluginIcon;
-}
-
-// Delete ourself
-QGISEXTERN void unload( QgisPlugin * thePluginPointer )
-{
-  delete thePluginPointer;
-}
-
 #endif // QGS_GEOMETRY_CHECKER_PLUGIN_H
diff --git a/src/plugins/geometry_snapper/CMakeLists.txt b/src/plugins/geometry_snapper/CMakeLists.txt
index 4e8a5dc..3e53be5 100644
--- a/src/plugins/geometry_snapper/CMakeLists.txt
+++ b/src/plugins/geometry_snapper/CMakeLists.txt
@@ -21,6 +21,7 @@ SET (geometrysnapper_UIS
 SET (geometrysnapper_MOC_HDRS
     qgsgeometrysnapper.h
     qgsgeometrysnapperdialog.h
+    qgsgeometrysnapperplugin.h
 )
 
 SET (geometrysnapper_RCCS
diff --git a/src/plugins/geometry_snapper/qgsgeometrysnapperplugin.cpp b/src/plugins/geometry_snapper/qgsgeometrysnapperplugin.cpp
index 960227e..7142c3b 100644
--- a/src/plugins/geometry_snapper/qgsgeometrysnapperplugin.cpp
+++ b/src/plugins/geometry_snapper/qgsgeometrysnapperplugin.cpp
@@ -41,3 +41,67 @@ void QgsGeometrySnapperPlugin::unload()
   mMenuAction = 0;
   mIface->removePluginVectorMenu( QApplication::translate( "QgsGeometrySnapperPlugin", "G&eometry Tools" ), mMenuAction );
 }
+
+
+//////////////////////////////////////////////////////////////////////////
+//
+//
+//  THE FOLLOWING CODE IS AUTOGENERATED BY THE PLUGIN BUILDER SCRIPT
+//    YOU WOULD NORMALLY NOT NEED TO MODIFY THIS, AND YOUR PLUGIN
+//      MAY NOT WORK PROPERLY IF YOU MODIFY THIS INCORRECTLY
+//
+//
+//////////////////////////////////////////////////////////////////////////
+
+
+/**
+ * Required extern functions needed  for every plugin
+ * These functions can be called prior to creating an instance
+ * of the plugin class
+ */
+// Class factory to return a new instance of the plugin class
+QGISEXTERN QgisPlugin * classFactory( QgisInterface * theQgisInterfacePointer )
+{
+  return new QgsGeometrySnapperPlugin( theQgisInterfacePointer );
+}
+// Return the name of the plugin - note that we do not user class members as
+// the class may not yet be insantiated when this method is called.
+QGISEXTERN QString name()
+{
+  return sName;
+}
+
+// Return the description
+QGISEXTERN QString description()
+{
+  return sDescription;
+}
+
+// Return the category
+QGISEXTERN QString category()
+{
+  return sCategory;
+}
+
+// Return the type (either UI or MapLayer plugin)
+QGISEXTERN int type()
+{
+  return sPluginType;
+}
+
+// Return the version number for the plugin
+QGISEXTERN QString version()
+{
+  return sPluginVersion;
+}
+
+QGISEXTERN QString icon()
+{
+  return sPluginIcon;
+}
+
+// Delete ourself
+QGISEXTERN void unload( QgisPlugin * thePluginPointer )
+{
+  delete thePluginPointer;
+}
diff --git a/src/plugins/geometry_snapper/qgsgeometrysnapperplugin.h b/src/plugins/geometry_snapper/qgsgeometrysnapperplugin.h
index de96de9..de1fe9a 100644
--- a/src/plugins/geometry_snapper/qgsgeometrysnapperplugin.h
+++ b/src/plugins/geometry_snapper/qgsgeometrysnapperplugin.h
@@ -33,6 +33,8 @@ static const QString sPluginIcon = ":/geometrysnapper/icons/geometrysnapper.png"
 
 class QgsGeometrySnapperPlugin : public QObject, public QgisPlugin
 {
+    Q_OBJECT
+
   public:
     explicit QgsGeometrySnapperPlugin( QgisInterface* iface );
     void initGui() override;
@@ -44,69 +46,4 @@ class QgsGeometrySnapperPlugin : public QObject, public QgisPlugin
     QAction* mMenuAction;
 };
 
-
-
-//////////////////////////////////////////////////////////////////////////
-//
-//
-//  THE FOLLOWING CODE IS AUTOGENERATED BY THE PLUGIN BUILDER SCRIPT
-//    YOU WOULD NORMALLY NOT NEED TO MODIFY THIS, AND YOUR PLUGIN
-//      MAY NOT WORK PROPERLY IF YOU MODIFY THIS INCORRECTLY
-//
-//
-//////////////////////////////////////////////////////////////////////////
-
-
-/**
- * Required extern functions needed  for every plugin
- * These functions can be called prior to creating an instance
- * of the plugin class
- */
-// Class factory to return a new instance of the plugin class
-QGISEXTERN QgisPlugin * classFactory( QgisInterface * theQgisInterfacePointer )
-{
-  return new QgsGeometrySnapperPlugin( theQgisInterfacePointer );
-}
-// Return the name of the plugin - note that we do not user class members as
-// the class may not yet be insantiated when this method is called.
-QGISEXTERN QString name()
-{
-  return sName;
-}
-
-// Return the description
-QGISEXTERN QString description()
-{
-  return sDescription;
-}
-
-// Return the category
-QGISEXTERN QString category()
-{
-  return sCategory;
-}
-
-// Return the type (either UI or MapLayer plugin)
-QGISEXTERN int type()
-{
-  return sPluginType;
-}
-
-// Return the version number for the plugin
-QGISEXTERN QString version()
-{
-  return sPluginVersion;
-}
-
-QGISEXTERN QString icon()
-{
-  return sPluginIcon;
-}
-
-// Delete ourself
-QGISEXTERN void unload( QgisPlugin * thePluginPointer )
-{
-  delete thePluginPointer;
-}
-
 #endif // QGS_GEOMETRY_SNAPPER_PLUGIN_H
diff --git a/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp b/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
index cc81ce6..9bbc2bf 100644
--- a/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
+++ b/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
@@ -409,6 +409,7 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
   QList<bool> couldBeInt;
   QList<bool> couldBeLongLong;
   QList<bool> couldBeDouble;
+  bool foundFirstGeometry = false;
 
   while ( true )
   {
@@ -458,11 +459,12 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
             if ( mGeometryType == QGis::UnknownGeometry || geom->type() == mGeometryType )
             {
               mGeometryType = geom->type();
-              if ( mNumberFeatures == 0 )
+              if ( !foundFirstGeometry )
               {
                 mNumberFeatures++;
                 mWkbType = type;
                 mExtent = geom->boundingBox();
+                foundFirstGeometry = true;
               }
               else
               {
@@ -517,7 +519,7 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
 
         if ( ok )
         {
-          if ( mNumberFeatures > 0 )
+          if ( foundFirstGeometry )
           {
             mExtent.combineExtentWith( pt.x(), pt.y() );
           }
@@ -527,6 +529,7 @@ void QgsDelimitedTextProvider::scanFile( bool buildIndexes )
             mExtent.set( pt.x(), pt.y(), pt.x(), pt.y() );
             mWkbType = QGis::WKBPoint;
             mGeometryType = QGis::Point;
+            foundFirstGeometry = true;
           }
           mNumberFeatures++;
           if ( buildSpatialIndex && qIsFinite( pt.x() ) && qIsFinite( pt.y() ) )
@@ -778,13 +781,15 @@ void QgsDelimitedTextProvider::rescanFile()
   mNumberFeatures = 0;
   mExtent = QgsRectangle();
   QgsFeature f;
+  bool foundFirstGeometry = false;
   while ( fi.nextFeature( f ) )
   {
     if ( mGeometryType != QGis::NoGeometry )
     {
-      if ( mNumberFeatures == 0 )
+      if ( !foundFirstGeometry )
       {
         mExtent = f.constGeometry()->boundingBox();
+        foundFirstGeometry = true;
       }
       else
       {
diff --git a/src/providers/grass/qgis.r.in.cpp b/src/providers/grass/qgis.r.in.cpp
index 187c41f..19ee3df 100644
--- a/src/providers/grass/qgis.r.in.cpp
+++ b/src/providers/grass/qgis.r.in.cpp
@@ -108,6 +108,9 @@ int main( int argc, char **argv )
   stdoutFile.open( stdout, QIODevice::WriteOnly | QIODevice::Unbuffered );
   QDataStream stdoutStream( &stdoutFile );
 
+  qint32 proj, zone;
+  stdinStream >> proj >> zone;
+
   QgsRectangle extent;
   qint32 rows, cols;
   stdinStream >> extent >> cols >> rows;
@@ -118,6 +121,8 @@ int main( int argc, char **argv )
   {
     G_fatal_error( "Cannot set region: %s", err.toUtf8().data() );
   }
+  window.proj = ( int ) proj;
+  window.zone = ( int ) zone;
 
   G_set_window( &window );
 
diff --git a/src/providers/grass/qgis.v.in.cpp b/src/providers/grass/qgis.v.in.cpp
index a5972d1..2c9dbeb 100644
--- a/src/providers/grass/qgis.v.in.cpp
+++ b/src/providers/grass/qgis.v.in.cpp
@@ -307,7 +307,7 @@ int main( int argc, char **argv )
       }
 
       QgsAttributes attributes = feature.attributes();
-      attributes.insert( 0, QVariant( feature.id() ) );
+      attributes.insert( 0, QVariant( feature.id() + fidToCatPlus ) );
       try
       {
         // TODO: inserting row is extremely slow on Windows (at least with SQLite), v.in.ogr is fast
diff --git a/src/providers/grass/qgsgrassimport.cpp b/src/providers/grass/qgsgrassimport.cpp
index d0f25a4..bd9198e 100644
--- a/src/providers/grass/qgsgrassimport.cpp
+++ b/src/providers/grass/qgsgrassimport.cpp
@@ -241,6 +241,14 @@ bool QgsGrassRasterImport::import()
     return false;
   }
 
+
+  struct Cell_head defaultWindow;
+  if ( !QgsGrass::defaultRegion( mGrassObject.gisdbase(), mGrassObject.location(), &defaultWindow ) )
+  {
+    setError( "Cannot get default window" );
+    return false;
+  }
+
   int redBand = 0;
   int greenBand = 0;
   int blueBand = 0;
@@ -326,6 +334,8 @@ bool QgsGrassRasterImport::import()
 
     QDataStream outStream( mProcess );
 
+    outStream << ( qint32 ) defaultWindow.proj;
+    outStream << ( qint32 ) defaultWindow.zone;
     outStream << mExtent << ( qint32 )mXSize << ( qint32 )mYSize;
     outStream << ( qint32 )qgis_out_type;
 
diff --git a/src/providers/grass/qgsgrassvectormaplayer.cpp b/src/providers/grass/qgsgrassvectormaplayer.cpp
index 91874ae..2031119 100644
--- a/src/providers/grass/qgsgrassvectormaplayer.cpp
+++ b/src/providers/grass/qgsgrassvectormaplayer.cpp
@@ -836,17 +836,40 @@ void QgsGrassVectorMapLayer::insertAttributes( int cat, const QgsFeature &featur
   names << mFieldInfo->key;
   values << QString::number( cat );
 
-  if ( feature.isValid() && feature.fields() )
+  QList<QVariant> cacheValues;
+  cacheValues.reserve( mAttributeFields.size() );
+  for ( int i = 0; i < mAttributeFields.size(); ++i )
+  {
+    cacheValues << QVariant();
+  }
+
+  if ( feature.fields() )
   {
     // append feature attributes if not null
     for ( int i = 0; i < feature.fields()->size(); i++ )
     {
       QString name = feature.fields()->at( i ).name();
+      QVariant valueVariant = feature.attributes().value( i );
+
+      if ( name != QgsGrassVectorMap::topoSymbolFieldName() )
+      {
+        int cacheIndex = mAttributeFields.indexFromName( name );
+        if ( cacheIndex < 0 ) // should not happen
+        {
+          error = QString( "Field %1 not found in cached attributes" ).arg( name );
+          return;
+        }
+        else
+        {
+          cacheValues[cacheIndex] = valueVariant;
+        }
+      }
+
       if ( name == mFieldInfo->key )
       {
         continue;
       }
-      QVariant valueVariant = feature.attributes().value( i );
+
       if ( !valueVariant.isNull() )
       {
         names << name;
@@ -860,13 +883,7 @@ void QgsGrassVectorMapLayer::insertAttributes( int cat, const QgsFeature &featur
   executeSql( query, error );
   if ( error.isEmpty() )
   {
-    QList<QVariant> values;
-    values.reserve( mAttributeFields.size() );
-    for ( int i = 0; i < mAttributeFields.size(); ++i )
-    {
-      values << QVariant();
-    }
-    mAttributes[cat] = values;
+    mAttributes[cat] = cacheValues;
   }
   printCachedAttributes();
 }
diff --git a/src/providers/postgres/qgspostgresexpressioncompiler.cpp b/src/providers/postgres/qgspostgresexpressioncompiler.cpp
index c5d234c..b23612f 100644
--- a/src/providers/postgres/qgspostgresexpressioncompiler.cpp
+++ b/src/providers/postgres/qgspostgresexpressioncompiler.cpp
@@ -160,7 +160,7 @@ QgsPostgresExpressionCompiler::Result QgsPostgresExpressionCompiler::compile( co
       QString right;
       Result rr( compile( n->opRight(), right ) );
 
-      result = left + " " + op + " " + right;
+      result = '(' + left + ' ' + op + ' ' + right + ')';
       return ( lr == Complete && rr == Complete ) ? Complete : Fail;
     }
 
diff --git a/src/providers/postgres/qgspostgresprovider.cpp b/src/providers/postgres/qgspostgresprovider.cpp
index 6df1d82..4820d2b 100644
--- a/src/providers/postgres/qgspostgresprovider.cpp
+++ b/src/providers/postgres/qgspostgresprovider.cpp
@@ -196,7 +196,7 @@ QgsPostgresProvider::QgsPostgresProvider( QString const & uri )
       QString delim;
       Q_FOREACH ( int idx, mPrimaryKeyAttrs )
       {
-        key += delim + mAttributeFields.at( idx ).name();
+        key += delim + quotedIdentifier( mAttributeFields.at( idx ).name() );
         delim = ",";
       }
     }
@@ -549,13 +549,35 @@ QString QgsPostgresUtils::whereClause( QgsFeatureId featureId, const QgsFields&
 
 QString QgsPostgresUtils::whereClause( QgsFeatureIds featureIds, const QgsFields& fields, QgsPostgresConn* conn, QgsPostgresPrimaryKeyType pkType, const QList<int>& pkAttrs, QSharedPointer<QgsPostgresSharedData> sharedData )
 {
-  QStringList whereClauses;
-  Q_FOREACH ( const QgsFeatureId featureId, featureIds )
+  switch ( pkType )
   {
-    whereClauses << whereClause( featureId, fields, conn, pkType, pkAttrs, sharedData );
-  }
+    case pktOid:
+    case pktInt:
+    {
+      //simple primary key, so prefer to use an "IN (...)" query. These are much faster then multiple chained ...OR... clauses
+      QString delim;
+      QString expr = QString( "%1 IN (" ).arg(( pkType == pktOid ? "oid" : QgsPostgresConn::quotedIdentifier( fields[ pkAttrs[0] ].name() ) ) );
+
+      Q_FOREACH ( const QgsFeatureId featureId, featureIds )
+      {
+        expr += delim + QString::number( featureId );
+        delim = ',';
+      }
+      expr += ')';
 
-  return whereClauses.isEmpty() ? "" : whereClauses.join( " OR " ).prepend( "(" ).append( ")" );
+      return expr;
+    }
+    default:
+    {
+      //complex primary key, need to build up where string
+      QStringList whereClauses;
+      Q_FOREACH ( const QgsFeatureId featureId, featureIds )
+      {
+        whereClauses << whereClause( featureId, fields, conn, pkType, pkAttrs, sharedData );
+      }
+      return whereClauses.isEmpty() ? "" : whereClauses.join( " OR " ).prepend( '(' ).append( ')' );
+    }
+  }
 }
 
 QString QgsPostgresUtils::andWhereClauses( const QString& c1, const QString& c2 )
diff --git a/src/providers/spatialite/qgsspatialitefeatureiterator.cpp b/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
index 2789b42..7e36506 100644
--- a/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
+++ b/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
@@ -34,31 +34,46 @@ QgsSpatiaLiteFeatureIterator::QgsSpatiaLiteFeatureIterator( QgsSpatiaLiteFeature
   mHasPrimaryKey = !mSource->mPrimaryKey.isEmpty();
   mRowNumber = 0;
 
+  QStringList whereClauses;
   QString whereClause;
   if ( !request.filterRect().isNull() && !mSource->mGeometryColumn.isNull() )
   {
     // some kind of MBR spatial filtering is required
-    whereClause += whereClauseRect();
+    whereClause = whereClauseRect();
+    if ( ! whereClause.isEmpty() )
+    {
+      whereClauses.append( whereClause );
+    }
   }
 
   if ( request.filterType() == QgsFeatureRequest::FilterFid )
   {
-    whereClause += whereClauseFid();
+    whereClause = whereClauseFid();
+    if ( ! whereClause.isEmpty() )
+    {
+      whereClauses.append( whereClause );
+    }
   }
   else if ( request.filterType() == QgsFeatureRequest::FilterFids )
   {
-    whereClause += whereClauseFids();
+    whereClause = whereClauseFids();
+    if ( ! whereClause.isEmpty() )
+    {
+      whereClauses.append( whereClause );
+    }
   }
 
   if ( !mSource->mSubsetString.isEmpty() )
   {
-    if ( !whereClause.isEmpty() )
+    whereClause = "( " + mSource->mSubsetString + ')';
+    if ( ! whereClause.isEmpty() )
     {
-      whereClause += " AND ";
+      whereClauses.append( whereClause );
     }
-    whereClause += "( " + mSource->mSubsetString + ")";
   }
 
+  whereClause = whereClauses.join( " AND " );
+
   // preparing the SQL statement
   if ( !prepareStatement( whereClause ) )
   {
diff --git a/src/providers/wms/qgswmscapabilities.cpp b/src/providers/wms/qgswmscapabilities.cpp
index f9d6281..f40e605 100644
--- a/src/providers/wms/qgswmscapabilities.cpp
+++ b/src/providers/wms/qgswmscapabilities.cpp
@@ -2018,8 +2018,13 @@ void QgsWmsCapabilitiesDownload::capabilitiesReplyFinished()
           request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
 
           mCapabilitiesReply->deleteLater();
+          mCapabilitiesReply = 0;
+
           QgsDebugMsg( QString( "redirected getcapabilities: %1" ).arg( redirect.toString() ) );
           //mCapabilitiesReply = QgsNetworkAccessManager::instance()->get( request );
+          connect( QgsNetworkAccessManager::instance(),
+                   SIGNAL( requestSent( QNetworkReply *, QObject * ) ),
+                   SLOT( requestSent( QNetworkReply *, QObject * ) ) );
           emit sendRequest( request );
           return;
         }
diff --git a/src/server/qgswfsserver.cpp b/src/server/qgswfsserver.cpp
index 800e854..1d38b68 100644
--- a/src/server/qgswfsserver.cpp
+++ b/src/server/qgswfsserver.cpp
@@ -507,10 +507,10 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
 
         //map extent
         searchRect = layer->extent();
-        searchRect.set( searchRect.xMinimum() - 0.000001
-                        , searchRect.yMinimum() - 0.000001
-                        , searchRect.xMaximum() + 0.000001
-                        , searchRect.yMaximum() + 0.000001 );
+        searchRect.set( searchRect.xMinimum() - 1. / pow( 10., layerPrec )
+                        , searchRect.yMinimum() - 1. / pow( 10., layerPrec )
+                        , searchRect.xMaximum() + 1. / pow( 10., layerPrec )
+                        , searchRect.yMaximum() + 1. / pow( 10., layerPrec ) );
         layerCrs = layer->crs();
 
         QgsFeatureIterator fit = layer->getFeatures(
@@ -853,10 +853,10 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
       if ( bboxOk )
         searchRect.set( minx, miny, maxx, maxy );
       else
-        searchRect.set( searchRect.xMinimum() - 0.000001,
-                        searchRect.yMinimum() - 0.000001,
-                        searchRect.xMaximum() + 0.000001,
-                        searchRect.yMaximum() + 0.000001 );
+        searchRect.set( searchRect.xMinimum() - 1. / pow( 10., layerPrec ),
+                        searchRect.yMinimum() - 1. / pow( 10., layerPrec ),
+                        searchRect.xMaximum() + 1. / pow( 10., layerPrec ),
+                        searchRect.yMaximum() + 1. / pow( 10., layerPrec ) );
       layerCrs = layer->crs();
 
       long featCounter = 0;
@@ -1751,7 +1751,10 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoord
     else
     {
       fStr += "\"";
-      fStr +=  val.toString().replace( QString( "\"" ), QString( "\\\"" ) );
+      fStr +=  val.toString()
+               .replace( '"', "\\\"" )
+               .replace( '\r', "\\r" )
+               .replace( '\n', "\\n" );
       fStr += "\"";
     }
     fStr += "\n";
diff --git a/src/server/qgswmsconfigparser.cpp b/src/server/qgswmsconfigparser.cpp
index 53bc3a8..3a214c4 100644
--- a/src/server/qgswmsconfigparser.cpp
+++ b/src/server/qgswmsconfigparser.cpp
@@ -132,24 +132,34 @@ QgsComposition* QgsWMSConfigParser::createPrintComposition( const QString& compo
     if ( !layers.isEmpty() )
     {
       QStringList layerSet;
-      QStringList wmsLayerList = layers.split( "," );
+      QStringList wmsLayerList = layers.split( ",", QString::SkipEmptyParts );
       QStringList wmsStyleList;
 
       if ( !styles.isEmpty() )
       {
-        wmsStyleList = styles.split( "," );
+        wmsStyleList = styles.split( ",", QString::SkipEmptyParts );
       }
 
       for ( int i = 0; i < wmsLayerList.size(); ++i )
       {
+        QString wmsLayer = wmsLayerList.at( i );
         QString styleName;
         if ( wmsStyleList.size() > i )
         {
           styleName = wmsStyleList.at( i );
         }
+        
+        bool allowCaching = true;
+        if ( wmsLayerList.count( wmsLayer ) > 1 )
+        {
+          allowCaching = false;
+        }
 
-        Q_FOREACH ( QgsMapLayer *layer, mapLayerFromStyle( wmsLayerList.at( i ), styleName ) )
+        QList<QgsMapLayer*> layerList = mapLayerFromStyle( wmsLayer, styleName, allowCaching );
+        int listIndex;
+        for ( listIndex = layerList.size() - 1; listIndex >= 0; listIndex-- )
         {
+          QgsMapLayer* layer = layerList.at( listIndex );
           if ( layer )
           {
             layerSet.push_back( layer->id() );
diff --git a/src/server/qgswmsprojectparser.cpp b/src/server/qgswmsprojectparser.cpp
index 64800be..985b899 100644
--- a/src/server/qgswmsprojectparser.cpp
+++ b/src/server/qgswmsprojectparser.cpp
@@ -1538,6 +1538,7 @@ QDomDocument QgsWMSProjectParser::getStyles( QStringList& layerList ) const
   // Create the root element
   QDomElement root = myDocument.createElementNS( "http://www.opengis.net/sld", "StyledLayerDescriptor" );
   root.setAttribute( "version", "1.1.0" );
+  root.setAttribute( "units", "mm" ); // default qgsmaprenderer is Millimeters
   root.setAttribute( "xsi:schemaLocation", "http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" );
   root.setAttribute( "xmlns:ogc", "http://www.opengis.net/ogc" );
   root.setAttribute( "xmlns:se", "http://www.opengis.net/se" );
diff --git a/tests/src/core/CMakeLists.txt b/tests/src/core/CMakeLists.txt
index 26903c7..6a86436 100644
--- a/tests/src/core/CMakeLists.txt
+++ b/tests/src/core/CMakeLists.txt
@@ -134,6 +134,7 @@ ADD_QGIS_TEST(invertedpolygontest testqgsinvertedpolygonrenderer.cpp )
 ADD_QGIS_TEST(labelingenginev2 testqgslabelingenginev2.cpp)
 ADD_QGIS_TEST(layertree testqgslayertree.cpp)
 ADD_QGIS_TEST(legendrenderertest testqgslegendrenderer.cpp )
+ADD_QGIS_TEST(linefillsymboltest testqgslinefillsymbol.cpp )
 ADD_QGIS_TEST(maplayerstylemanager testqgsmaplayerstylemanager.cpp )
 ADD_QGIS_TEST(maplayertest testqgsmaplayer.cpp)
 # ADD_QGIS_TEST(maprendererjobtest testmaprendererjob.cpp )
@@ -141,12 +142,14 @@ ADD_QGIS_TEST(maprenderertest testqgsmaprenderer.cpp)
 ADD_QGIS_TEST(maprotationtest testqgsmaprotation.cpp)
 ADD_QGIS_TEST(mapsettingstest testqgsmapsettings.cpp)
 ADD_QGIS_TEST(maptopixeltest testqgsmaptopixel.cpp)
+ADD_QGIS_TEST(markerlinessymboltest testqgsmarkerlinesymbol.cpp)
 ADD_QGIS_TEST(networkcontentfetcher testqgsnetworkcontentfetcher.cpp )
 ADD_QGIS_TEST(ogcutilstest testqgsogcutils.cpp)
 ADD_QGIS_TEST(painteffectregistrytest testqgspainteffectregistry.cpp)
 ADD_QGIS_TEST(painteffecttest testqgspainteffect.cpp)
 ADD_QGIS_TEST(pallabelingtest testqgspallabeling.cpp)
 ADD_QGIS_TEST(pointlocatortest testqgspointlocator.cpp )
+ADD_QGIS_TEST(pointpatternfillsymboltest testqgspointpatternfillsymbol.cpp )
 ADD_QGIS_TEST(pointtest testqgspoint.cpp)
 ADD_QGIS_TEST(projecttest testqgsproject.cpp)
 ADD_QGIS_TEST(qgistest testqgis.cpp)
diff --git a/tests/src/core/testqgsauthmanager.cpp b/tests/src/core/testqgsauthmanager.cpp
index f72e71f..d21f9c5 100644
--- a/tests/src/core/testqgsauthmanager.cpp
+++ b/tests/src/core/testqgsauthmanager.cpp
@@ -136,16 +136,16 @@ void TestQgsAuthManager::cleanupTempDir()
   {
     Q_FOREACH ( const QString &tf, tmpDir.entryList( QDir::NoDotAndDotDot | QDir::Files ) )
     {
-      QVERIFY( tmpDir.remove( mTempDir + "/" + tf ) );
+      QVERIFY2( tmpDir.remove( mTempDir + "/" + tf ), qPrintable( "Could not remove " + mTempDir + "/" + tf ) );
     }
-    QVERIFY( tmpDir.rmdir( mTempDir ) );
+    QVERIFY2( tmpDir.rmdir( mTempDir ), qPrintable( "Could not remove directory " + mTempDir ) );
   }
 }
 
 void TestQgsAuthManager::cleanupTestCase()
 {
-  cleanupTempDir();
   QgsApplication::exitQgis();
+  cleanupTempDir();
 
   QString myReportFile = QDir::tempPath() + "/qgistest.html";
   QFile myFile( myReportFile );
diff --git a/tests/src/core/testqgsexpression.cpp b/tests/src/core/testqgsexpression.cpp
index 2a56044..da5a1fc 100644
--- a/tests/src/core/testqgsexpression.cpp
+++ b/tests/src/core/testqgsexpression.cpp
@@ -28,6 +28,7 @@
 #include "qgsexpressioncontext.h"
 #include "qgsvectorlayer.h"
 #include "qgsmaplayerregistry.h"
+#include "qgsvectordataprovider.h"
 
 static void _parseAndEvalExpr( int arg )
 {
@@ -47,11 +48,13 @@ class TestQgsExpression: public QObject
 
     TestQgsExpression()
         : mPointsLayer( 0 )
+        , mMemoryLayer( 0 )
     {}
 
   private:
 
     QgsVectorLayer* mPointsLayer;
+    QgsVectorLayer* mMemoryLayer;
 
   private slots:
 
@@ -68,7 +71,7 @@ class TestQgsExpression: public QObject
       QgsApplication::showSettings();
 
       //create a point layer that will be used in all tests...
-      QString testDataDir = QString( TEST_DATA_DIR ) + "/";
+      QString testDataDir = QString( TEST_DATA_DIR ) + '/';
       QString pointsFileName = testDataDir + "points.shp";
       QFileInfo pointFileInfo( pointsFileName );
       mPointsLayer = new QgsVectorLayer( pointFileInfo.filePath(),
@@ -82,6 +85,24 @@ class TestQgsExpression: public QObject
       mPointsLayer->setAttributionUrl( "attribution url" );
       mPointsLayer->setMaximumScale( 500 );
       mPointsLayer->setMinimumScale( 1000 );
+
+      // test memory layer for get_feature tests
+      mMemoryLayer = new QgsVectorLayer( "Point?field=col1:integer&field=col2:string", "test", "memory" );
+      QVERIFY( mMemoryLayer->isValid() );
+      QgsFeature f1( mMemoryLayer->dataProvider()->fields(), 1 );
+      f1.setAttribute( "col1", 10 );
+      f1.setAttribute( "col2", "test1" );
+      QgsFeature f2( mMemoryLayer->dataProvider()->fields(), 2 );
+      f2.setAttribute( "col1", 11 );
+      f2.setAttribute( "col2", "test2" );
+      QgsFeature f3( mMemoryLayer->dataProvider()->fields(), 3 );
+      f3.setAttribute( "col1", 3 );
+      f3.setAttribute( "col2", "test3" );
+      QgsFeature f4( mMemoryLayer->dataProvider()->fields(), 4 );
+      f4.setAttribute( "col1", 41 );
+      f4.setAttribute( "col2", "test4" );
+      mMemoryLayer->dataProvider()->addFeatures( QgsFeatureList() << f1 << f2 << f3 << f4 );
+      QgsMapLayerRegistry::instance()->addMapLayer( mMemoryLayer );
     }
 
     void cleanupTestCase()
@@ -788,6 +809,75 @@ class TestQgsExpression: public QObject
       QCOMPARE( v.toInt(), 5 );
     }
 
+    void eval_get_feature_data()
+    {
+      QTest::addColumn<QString>( "string" );
+      QTest::addColumn<bool>( "featureMatched" );
+      QTest::addColumn<int>( "featureId" );
+
+      // get_feature evaluation
+
+      //by layer name
+      QTest::newRow( "get_feature 1" ) << "get_feature('test','col1',10)" << true << 1;
+      QTest::newRow( "get_feature 2" ) << "get_feature('test','col2','test1')" << true << 1;
+      QTest::newRow( "get_feature 3" ) << "get_feature('test','col1',11)" << true << 2;
+      QTest::newRow( "get_feature 4" ) << "get_feature('test','col2','test2')" << true << 2;
+      QTest::newRow( "get_feature 5" ) << "get_feature('test','col1',3)" << true << 3;
+      QTest::newRow( "get_feature 6" ) << "get_feature('test','col2','test3')" << true << 3;
+      QTest::newRow( "get_feature 7" ) << "get_feature('test','col1',41)" << true << 4;
+      QTest::newRow( "get_feature 8" ) << "get_feature('test','col2','test4')" << true << 4;
+
+      //by layer id
+      QTest::newRow( "get_feature 3" ) << QString( "get_feature('%1','col1',11)" ).arg( mMemoryLayer->id() ) << true << 2;
+      QTest::newRow( "get_feature 4" ) << QString( "get_feature('%1','col2','test2')" ).arg( mMemoryLayer->id() ) << true << 2;
+
+      //no matching features
+      QTest::newRow( "get_feature no match1" ) << "get_feature('test','col1',499)" << false << -1;
+      QTest::newRow( "get_feature no match2" ) << "get_feature('test','col2','no match!')" << false << -1;
+      //no matching layer
+      QTest::newRow( "get_feature no match layer" ) << "get_feature('not a layer!','col1',10)" << false << -1;
+    }
+
+    void eval_get_feature()
+    {
+      QFETCH( QString, string );
+      QFETCH( bool, featureMatched );
+      QFETCH( int, featureId );
+
+      QgsExpression exp( string );
+      QCOMPARE( exp.hasParserError(), false );
+      if ( exp.hasParserError() )
+        qDebug() << exp.parserErrorString();
+
+      QVariant res = exp.evaluate();
+      if ( exp.hasEvalError() )
+        qDebug() << exp.evalErrorString();
+
+      QCOMPARE( exp.hasEvalError(), false );
+      QCOMPARE( res.canConvert<QgsFeature>(), featureMatched );
+      if ( featureMatched )
+      {
+        QgsFeature feat = res.value<QgsFeature>();
+        QCOMPARE( feat.id(), ( long long )featureId );
+      }
+    }
+
+    void get_feature_geometry()
+    {
+      //test that get_feature fetches feature's geometry
+      QgsExpression exp( QString( "x(geometry(get_feature('%1','heading',340)))" ).arg( mPointsLayer->id() ) );
+      QCOMPARE( exp.hasParserError(), false );
+      if ( exp.hasParserError() )
+        qDebug() << exp.parserErrorString();
+
+      QVariant res = exp.evaluate();
+      if ( exp.hasEvalError() )
+        qDebug() << exp.evalErrorString();
+
+      QCOMPARE( exp.hasEvalError(), false );
+      QVERIFY( qgsDoubleNear( res.toDouble(), -85.65217, 0.00001 ) );
+    }
+
     void eval_rand()
     {
       QgsExpression exp1( "rand(1,10)" );
@@ -1157,6 +1247,7 @@ class TestQgsExpression: public QObject
       QTest::addColumn<QString>( "string" );
       QTest::addColumn<void*>( "geomptr" );
       QTest::addColumn<bool>( "evalError" );
+      QTest::addColumn<bool>( "needsGeom" );
 
       QgsPoint point( 123, 456 );
       QgsPolyline line;
@@ -1168,10 +1259,10 @@ class TestQgsExpression: public QObject
       QgsPolygon polygon;
       polygon << polygon_ring;
 
-      QTest::newRow( "geometry Point" ) << "geometry( $currentfeature )" << ( void* ) QgsGeometry::fromPoint( point ) << false;
-      QTest::newRow( "geometry Line" ) << "geometry( $currentfeature )" << ( void* ) QgsGeometry::fromPolyline( line ) << false;
-      QTest::newRow( "geometry Polyline" ) << "geometry( $currentfeature )" << ( void* ) QgsGeometry::fromPolyline( polyline ) << false;
-      QTest::newRow( "geometry Polygon" ) << "geometry( $currentfeature )" << ( void* ) QgsGeometry::fromPolygon( polygon ) << false;
+      QTest::newRow( "geometry Point" ) << "geometry( $currentfeature )" << ( void* ) QgsGeometry::fromPoint( point ) << false << true;
+      QTest::newRow( "geometry Line" ) << "geometry( $currentfeature )" << ( void* ) QgsGeometry::fromPolyline( line ) << false << true;
+      QTest::newRow( "geometry Polyline" ) << "geometry( $currentfeature )" << ( void* ) QgsGeometry::fromPolyline( polyline ) << false << true;
+      QTest::newRow( "geometry Polygon" ) << "geometry( $currentfeature )" << ( void* ) QgsGeometry::fromPolygon( polygon ) << false << true;
 
       QgsCoordinateReferenceSystem s;
       s.createFromOgcWmsCrs( "EPSG:4326" );
@@ -1186,8 +1277,8 @@ class TestQgsExpression: public QObject
 
       QgsGeometry* oLine = QgsGeometry::fromPolyline( line );
       QgsGeometry* oPolygon = QgsGeometry::fromPolygon( polygon );
-      QTest::newRow( "transform Line" ) << "transform( geomFromWKT('" + oLine->exportToWkt() + "'), 'EPSG:4326', 'EPSG:3857' )" << ( void* ) tLine << false;
-      QTest::newRow( "transform Polygon" ) << "transform( geomFromWKT('" + oPolygon->exportToWkt() + "'), 'EPSG:4326', 'EPSG:3857' )" << ( void* ) tPolygon << false;
+      QTest::newRow( "transform Line" ) << "transform( geomFromWKT('" + oLine->exportToWkt() + "'), 'EPSG:4326', 'EPSG:3857' )" << ( void* ) tLine << false << false;
+      QTest::newRow( "transform Polygon" ) << "transform( geomFromWKT('" + oPolygon->exportToWkt() + "'), 'EPSG:4326', 'EPSG:3857' )" << ( void* ) tPolygon << false << false;
       delete oLine;
       delete oPolygon;
     }
@@ -1197,6 +1288,7 @@ class TestQgsExpression: public QObject
       QFETCH( QString, string );
       QFETCH( void*, geomptr );
       QFETCH( bool, evalError );
+      QFETCH( bool, needsGeom );
 
       QgsGeometry* geom = ( QgsGeometry* ) geomptr;
 
@@ -1205,7 +1297,7 @@ class TestQgsExpression: public QObject
 
       QgsExpression exp( string );
       QCOMPARE( exp.hasParserError(), false );
-      QCOMPARE( exp.needsGeometry(), false );
+      QCOMPARE( exp.needsGeometry(), needsGeom );
 
       //deprecated method
       Q_NOWARN_DEPRECATED_PUSH
diff --git a/tests/src/core/testqgsgeometry.cpp b/tests/src/core/testqgsgeometry.cpp
index 34db72c..2197718 100644
--- a/tests/src/core/testqgsgeometry.cpp
+++ b/tests/src/core/testqgsgeometry.cpp
@@ -81,6 +81,8 @@ class TestQgsGeometry : public QObject
     void smoothCheck();
 
     void dataStream();
+    
+    void exportToGeoJSON();
 
   private:
     /** A helper method to do a render check to see if the geometry op is as expected */
@@ -739,6 +741,51 @@ void TestQgsGeometry::dataStream()
   QVERIFY( resultGeometry.isEmpty() );
 }
 
+void TestQgsGeometry::exportToGeoJSON()
+{
+  //Point
+  QString wkt = "Point (40 50)";
+  QScopedPointer<QgsGeometry> geom( QgsGeometry::fromWkt( wkt ) );
+  QString obtained = geom->exportToGeoJSON();
+  QString geojson = "{\"type\": \"Point\", \"coordinates\": [40, 50]}";
+  QCOMPARE( obtained, geojson );
+  
+  //MultiPoint
+  wkt = "MultiPoint (0 0, 10 0, 10 10, 20 10)";
+  geom.reset( QgsGeometry::fromWkt( wkt ) );
+  obtained = geom->exportToGeoJSON();
+  geojson = "{\"type\": \"MultiPoint\", \"coordinates\": [ [0, 0], [10, 0], [10, 10], [20, 10]] }";
+  QCOMPARE( obtained, geojson );
+
+  //Linestring
+  wkt = "LineString(0 0, 10 0, 10 10, 20 10)";
+  geom.reset( QgsGeometry::fromWkt( wkt ) );
+  obtained = geom->exportToGeoJSON();
+  geojson = "{\"type\": \"LineString\", \"coordinates\": [ [0, 0], [10, 0], [10, 10], [20, 10]]}";
+  QCOMPARE( obtained, geojson );
+  
+  //MultiLineString
+  wkt = "MultiLineString ((0 0, 10 0, 10 10, 20 10),(30 30, 40 30, 40 40, 50 40))";
+  geom.reset( QgsGeometry::fromWkt( wkt ) );
+  obtained = geom->exportToGeoJSON();
+  geojson = "{\"type\": \"MultiLineString\", \"coordinates\": [[ [0, 0], [10, 0], [10, 10], [20, 10]], [ [30, 30], [40, 30], [40, 40], [50, 40]]] }";
+  QCOMPARE( obtained, geojson );
+  
+  //Polygon
+  wkt = "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0 ),(2 2, 4 2, 4 4, 2 4, 2 2))";
+  geom.reset( QgsGeometry::fromWkt( wkt ) );
+  obtained = geom->exportToGeoJSON();
+  geojson = "{\"type\": \"Polygon\", \"coordinates\": [[ [0, 0], [10, 0], [10, 10], [0, 10], [0, 0]], [ [2, 2], [4, 2], [4, 4], [2, 4], [2, 2]]] }";
+  QCOMPARE( obtained, geojson );
+
+  //MultiPolygon
+  wkt = "MultiPolygon (((0 0, 10 0, 10 10, 0 10, 0 0 )),((2 2, 4 2, 4 4, 2 4, 2 2)))";
+  geom.reset( QgsGeometry::fromWkt( wkt ) );
+  obtained = geom->exportToGeoJSON();
+  geojson = "{\"type\": \"MultiPolygon\", \"coordinates\": [[[ [0, 0], [10, 0], [10, 10], [0, 10], [0, 0]]], [[ [2, 2], [4, 2], [4, 4], [2, 4], [2, 2]]]] }";
+  QCOMPARE( obtained, geojson );
+}
+
 bool TestQgsGeometry::renderCheck( const QString& theTestName, const QString& theComment, int mismatchCount )
 {
   mReport += "<h2>" + theTestName + "</h2>\n";
diff --git a/tests/src/core/testqgslinefillsymbol.cpp b/tests/src/core/testqgslinefillsymbol.cpp
new file mode 100644
index 0000000..1fce4f1
--- /dev/null
+++ b/tests/src/core/testqgslinefillsymbol.cpp
@@ -0,0 +1,185 @@
+/***************************************************************************
+     testqgslinefillsymbol.cpp
+     -------------------------
+    Date                 : Nov 2015
+    Copyright            : (C) 2015 by Nyall Dawson
+    Email                : nyall dot dawson at gmail 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 <QObject>
+#include <QString>
+#include <QStringList>
+#include <QApplication>
+#include <QFileInfo>
+#include <QDir>
+#include <QDesktopServices>
+
+//qgis includes...
+#include <qgsmaprenderer.h>
+#include <qgsmaplayer.h>
+#include <qgsvectorlayer.h>
+#include <qgsapplication.h>
+#include <qgsproviderregistry.h>
+#include <qgsmaplayerregistry.h>
+#include <qgssymbolv2.h>
+#include <qgssinglesymbolrendererv2.h>
+#include <qgsfillsymbollayerv2.h>
+#include "qgslinesymbollayerv2.h"
+#include "qgsdatadefined.h"
+
+//qgis test includes
+#include "qgsrenderchecker.h"
+
+/** \ingroup UnitTests
+ * This is a unit test for line fill symbol types.
+ */
+class TestQgsLineFillSymbol : public QObject
+{
+    Q_OBJECT
+
+  public:
+    TestQgsLineFillSymbol()
+        : mTestHasError( false )
+        , mpPolysLayer( 0 )
+        , mLineFill( 0 )
+        , mFillSymbol( 0 )
+        , mSymbolRenderer( 0 )
+    {}
+
+  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 lineFillSymbol();
+    void dataDefinedSubSymbol();
+
+  private:
+    bool mTestHasError;
+
+    bool imageCheck( const QString& theType );
+    QgsMapSettings mMapSettings;
+    QgsVectorLayer * mpPolysLayer;
+    QgsLinePatternFillSymbolLayer* mLineFill;
+    QgsFillSymbolV2* mFillSymbol;
+    QgsSingleSymbolRendererV2* mSymbolRenderer;
+    QString mTestDataDir;
+    QString mReport;
+};
+
+
+void TestQgsLineFillSymbol::initTestCase()
+{
+  mTestHasError = false;
+  // init QGIS's paths - true means that all path will be inited from prefix
+  QgsApplication::init();
+  QgsApplication::initQgis();
+  QgsApplication::showSettings();
+
+  //create some objects that will be used in all tests...
+  QString myDataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt
+  mTestDataDir = myDataDir + '/';
+
+  //
+  //create a poly layer that will be used in all tests...
+  //
+  QString myPolysFileName = mTestDataDir + "polys.shp";
+  QFileInfo myPolyFileInfo( myPolysFileName );
+  mpPolysLayer = new QgsVectorLayer( myPolyFileInfo.filePath(),
+                                     myPolyFileInfo.completeBaseName(), "ogr" );
+
+  QgsVectorSimplifyMethod simplifyMethod;
+  simplifyMethod.setSimplifyHints( QgsVectorSimplifyMethod::NoSimplification );
+  mpPolysLayer->setSimplifyMethod( simplifyMethod );
+
+  // Register the layer with the registry
+  QgsMapLayerRegistry::instance()->addMapLayers(
+    QList<QgsMapLayer *>() << mpPolysLayer );
+
+  //setup gradient fill
+  mLineFill = new QgsLinePatternFillSymbolLayer();
+  mFillSymbol = new QgsFillSymbolV2();
+  mFillSymbol->changeSymbolLayer( 0, mLineFill );
+  mSymbolRenderer = new QgsSingleSymbolRendererV2( mFillSymbol );
+  mpPolysLayer->setRendererV2( mSymbolRenderer );
+
+  // We only need maprender instead of mapcanvas
+  // since maprender does not require a qui
+  // and is more light weight
+  //
+  mMapSettings.setLayers( QStringList() << mpPolysLayer->id() );
+  mReport += "<h1>Gradient Renderer Tests</h1>\n";
+
+}
+void TestQgsLineFillSymbol::cleanupTestCase()
+{
+  QString myReportFile = QDir::tempPath() + "/qgistest.html";
+  QFile myFile( myReportFile );
+  if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
+  {
+    QTextStream myQTextStream( &myFile );
+    myQTextStream << mReport;
+    myFile.close();
+  }
+
+  QgsApplication::exitQgis();
+}
+
+void TestQgsLineFillSymbol::lineFillSymbol()
+{
+  mReport += "<h2>Line fill symbol renderer test</h2>\n";
+
+  QgsStringMap properties;
+  properties.insert( "color", "0,0,0,255" );
+  properties.insert( "width", "1" );
+  properties.insert( "capstyle", "flat" );
+  QgsLineSymbolV2* lineSymbol = QgsLineSymbolV2::createSimple( properties );
+
+  mLineFill->setSubSymbol( lineSymbol );
+  QVERIFY( imageCheck( "symbol_linefill" ) );
+}
+
+void TestQgsLineFillSymbol::dataDefinedSubSymbol()
+{
+  mReport += "<h2>Line fill symbol data defined sub symbol test</h2>\n";
+
+  QgsStringMap properties;
+  properties.insert( "color", "0,0,0,255" );
+  properties.insert( "width", "1" );
+  properties.insert( "capstyle", "flat" );
+  QgsLineSymbolV2* lineSymbol = QgsLineSymbolV2::createSimple( properties );
+  lineSymbol->symbolLayer( 0 )->setDataDefinedProperty( "color", new QgsDataDefined( QString( "if(\"Name\" ='Lake','#ff0000','#ff00ff')" ) ) );
+  mLineFill->setSubSymbol( lineSymbol );
+  QVERIFY( imageCheck( "datadefined_subsymbol" ) );
+}
+
+//
+// Private helper functions not called directly by CTest
+//
+
+
+bool TestQgsLineFillSymbol::imageCheck( const QString& theTestType )
+{
+  //use the QgsRenderChecker test utility class to
+  //ensure the rendered output matches our control image
+  mMapSettings.setExtent( mpPolysLayer->extent() );
+  mMapSettings.setOutputDpi( 96 );
+  QgsRenderChecker myChecker;
+  myChecker.setControlPathPrefix( "symbol_linefill" );
+  myChecker.setControlName( "expected_" + theTestType );
+  myChecker.setMapSettings( mMapSettings );
+  bool myResultFlag = myChecker.runTest( theTestType );
+  mReport += myChecker.report();
+  return myResultFlag;
+}
+
+QTEST_MAIN( TestQgsLineFillSymbol )
+#include "testqgslinefillsymbol.moc"
diff --git a/tests/src/core/testqgsmarkerlinesymbol.cpp b/tests/src/core/testqgsmarkerlinesymbol.cpp
new file mode 100644
index 0000000..fdec55e
--- /dev/null
+++ b/tests/src/core/testqgsmarkerlinesymbol.cpp
@@ -0,0 +1,154 @@
+/***************************************************************************
+     testqgsmarkerlinesymbol.cpp
+     --------------------------------------
+    Date                 : Nov 12  2015
+    Copyright            : (C) 2015 by Sandro Santilli
+    Email                : strk at keybit.net
+ ***************************************************************************
+ *                                                                         *
+ *   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 <QObject>
+#include <QString>
+#include <QStringList>
+#include <QApplication>
+#include <QFileInfo>
+#include <QDir>
+
+//qgis includes...
+#include "qgsrasterlayer.h"
+#include "qgsvectorlayer.h"
+#include "qgsmultibandcolorrenderer.h"
+#include "qgsmaplayerregistry.h"
+#include "qgsapplication.h"
+#include "qgsmaprenderer.h"
+#include "qgspallabeling.h"
+#include "qgsfontutils.h"
+
+//qgis unit test includes
+#include <qgsrenderchecker.h>
+
+/** \ingroup UnitTests
+ * This is a unit test for the Marker Line symbol
+ */
+class TestQgsMarkerLineSymbol : public QObject
+{
+    Q_OBJECT
+  public:
+    TestQgsMarkerLineSymbol()
+        : mLinesLayer( 0 )
+        , mMapSettings( 0 )
+    {
+      mTestDataDir = QString( TEST_DATA_DIR ) + '/';
+    }
+
+    ~TestQgsMarkerLineSymbol();
+
+  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 lineOffset();
+
+  private:
+    bool render( const QString& theFileName );
+
+    QString mTestDataDir;
+    QgsVectorLayer* mLinesLayer;
+    QgsMapSettings *mMapSettings;
+    QString mReport;
+};
+
+//runs before all tests
+void TestQgsMarkerLineSymbol::initTestCase()
+{
+  // init QGIS's paths - true means that all path will be inited from prefix
+  QgsApplication::init();
+  QgsApplication::initQgis();
+
+  mMapSettings = new QgsMapSettings();
+
+  QList<QgsMapLayer *> mapLayers;
+
+  //create a line layer that will be used in all tests...
+  QString myLinesFileName = mTestDataDir + "lines_cardinals.shp";
+  QFileInfo myLinesFileInfo( myLinesFileName );
+  mLinesLayer = new QgsVectorLayer( myLinesFileInfo.filePath(),
+                                    myLinesFileInfo.completeBaseName(), "ogr" );
+  mapLayers << mLinesLayer;
+
+  // Register all layers with the registry
+  QgsMapLayerRegistry::instance()->addMapLayers( mapLayers );
+
+  // This is needed to correctly set rotation center,
+  // the actual size doesn't matter as QgsRenderChecker will
+  // re-set it to the size of the expected image
+  mMapSettings->setOutputSize( QSize( 256, 256 ) );
+
+  mReport += "<h1>Line Marker Symbol Tests</h1>\n";
+
+  QgsFontUtils::loadStandardTestFonts( QStringList() << "Bold" );
+}
+
+TestQgsMarkerLineSymbol::~TestQgsMarkerLineSymbol()
+{
+
+}
+
+//runs after all tests
+void TestQgsMarkerLineSymbol::cleanupTestCase()
+{
+  delete mMapSettings;
+  QgsApplication::exitQgis();
+
+  QString myReportFile = QDir::tempPath() + "/qgistest.html";
+  QFile myFile( myReportFile );
+  if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
+  {
+    QTextStream myQTextStream( &myFile );
+    myQTextStream << mReport;
+    myFile.close();
+  }
+}
+
+void TestQgsMarkerLineSymbol::lineOffset()
+{
+  mMapSettings->setLayers( QStringList() << mLinesLayer->id() );
+
+  // Negative offset on marker line
+  // See http://hub.qgis.org/issues/13811
+
+  QString qml = mTestDataDir + "marker_line_offset.qml";
+  bool success = false;
+  mLinesLayer->loadNamedStyle( qml, success );
+
+  QVERIFY( success );
+  mMapSettings->setExtent( QgsRectangle(-140,-140,140,140) );
+  QVERIFY( render( "line_offset" ) );
+
+  // TODO: -0.0 offset, see 
+  // http://hub.qgis.org/issues/13811#note-1
+}
+
+bool TestQgsMarkerLineSymbol::render( const QString& theTestType )
+{
+  mReport += "<h2>" + theTestType + "</h2>\n";
+  mMapSettings->setOutputDpi( 96 );
+  QgsRenderChecker checker;
+  checker.setControlPathPrefix( "markerlinesymbol" );
+  checker.setControlName( "expected_" + theTestType );
+  checker.setMapSettings( *mMapSettings );
+  bool result = checker.runTest( theTestType );
+  mReport += "\n\n\n" + checker.report();
+  return result;
+}
+
+QTEST_MAIN( TestQgsMarkerLineSymbol )
+#include "testqgsmarkerlinesymbol.moc"
diff --git a/tests/src/core/testqgspointpatternfillsymbol.cpp b/tests/src/core/testqgspointpatternfillsymbol.cpp
new file mode 100644
index 0000000..5905900
--- /dev/null
+++ b/tests/src/core/testqgspointpatternfillsymbol.cpp
@@ -0,0 +1,185 @@
+/***************************************************************************
+     testqgspointpatternfillsymbol.cpp
+     ---------------------------------
+    Date                 : Nov 2015
+    Copyright            : (C) 2015 by Nyall Dawson
+    Email                : nyall dot dawson at gmail 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 <QObject>
+#include <QString>
+#include <QStringList>
+#include <QApplication>
+#include <QFileInfo>
+#include <QDir>
+#include <QDesktopServices>
+
+//qgis includes...
+#include <qgsmaprenderer.h>
+#include <qgsmaplayer.h>
+#include <qgsvectorlayer.h>
+#include <qgsapplication.h>
+#include <qgsproviderregistry.h>
+#include <qgsmaplayerregistry.h>
+#include <qgssymbolv2.h>
+#include <qgssinglesymbolrendererv2.h>
+#include <qgsfillsymbollayerv2.h>
+#include "qgslinesymbollayerv2.h"
+#include "qgsdatadefined.h"
+
+//qgis test includes
+#include "qgsrenderchecker.h"
+
+/** \ingroup UnitTests
+ * This is a unit test for point pattern fill symbol types.
+ */
+class TestQgsPointPatternFillSymbol : public QObject
+{
+    Q_OBJECT
+
+  public:
+    TestQgsPointPatternFillSymbol()
+        : mTestHasError( false )
+        , mpPolysLayer( 0 )
+        , mPointPatternFill( 0 )
+        , mFillSymbol( 0 )
+        , mSymbolRenderer( 0 )
+    {}
+
+  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 pointPatternFillSymbol();
+    void dataDefinedSubSymbol();
+
+  private:
+    bool mTestHasError;
+
+    bool imageCheck( const QString& theType );
+    QgsMapSettings mMapSettings;
+    QgsVectorLayer * mpPolysLayer;
+    QgsPointPatternFillSymbolLayer* mPointPatternFill;
+    QgsFillSymbolV2* mFillSymbol;
+    QgsSingleSymbolRendererV2* mSymbolRenderer;
+    QString mTestDataDir;
+    QString mReport;
+};
+
+
+void TestQgsPointPatternFillSymbol::initTestCase()
+{
+  mTestHasError = false;
+  // init QGIS's paths - true means that all path will be inited from prefix
+  QgsApplication::init();
+  QgsApplication::initQgis();
+  QgsApplication::showSettings();
+
+  //create some objects that will be used in all tests...
+  QString myDataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt
+  mTestDataDir = myDataDir + '/';
+
+  //
+  //create a poly layer that will be used in all tests...
+  //
+  QString myPolysFileName = mTestDataDir + "polys.shp";
+  QFileInfo myPolyFileInfo( myPolysFileName );
+  mpPolysLayer = new QgsVectorLayer( myPolyFileInfo.filePath(),
+                                     myPolyFileInfo.completeBaseName(), "ogr" );
+
+  QgsVectorSimplifyMethod simplifyMethod;
+  simplifyMethod.setSimplifyHints( QgsVectorSimplifyMethod::NoSimplification );
+  mpPolysLayer->setSimplifyMethod( simplifyMethod );
+
+  // Register the layer with the registry
+  QgsMapLayerRegistry::instance()->addMapLayers(
+    QList<QgsMapLayer *>() << mpPolysLayer );
+
+  //setup gradient fill
+  mPointPatternFill = new QgsPointPatternFillSymbolLayer();
+  mFillSymbol = new QgsFillSymbolV2();
+  mFillSymbol->changeSymbolLayer( 0, mPointPatternFill );
+  mSymbolRenderer = new QgsSingleSymbolRendererV2( mFillSymbol );
+  mpPolysLayer->setRendererV2( mSymbolRenderer );
+
+  // We only need maprender instead of mapcanvas
+  // since maprender does not require a qui
+  // and is more light weight
+  //
+  mMapSettings.setLayers( QStringList() << mpPolysLayer->id() );
+  mReport += "<h1>Gradient Renderer Tests</h1>\n";
+
+}
+void TestQgsPointPatternFillSymbol::cleanupTestCase()
+{
+  QString myReportFile = QDir::tempPath() + "/qgistest.html";
+  QFile myFile( myReportFile );
+  if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
+  {
+    QTextStream myQTextStream( &myFile );
+    myQTextStream << mReport;
+    myFile.close();
+  }
+
+  QgsApplication::exitQgis();
+}
+
+void TestQgsPointPatternFillSymbol::pointPatternFillSymbol()
+{
+  mReport += "<h2>Point pattern fill symbol renderer test</h2>\n";
+
+  QgsStringMap properties;
+  properties.insert( "color", "0,0,0,255" );
+  properties.insert( "name", "circle" );
+  properties.insert( "size", "5.0" );
+  QgsMarkerSymbolV2* pointSymbol = QgsMarkerSymbolV2::createSimple( properties );
+
+  mPointPatternFill->setSubSymbol( pointSymbol );
+  QVERIFY( imageCheck( "symbol_pointfill" ) );
+}
+
+void TestQgsPointPatternFillSymbol::dataDefinedSubSymbol()
+{
+  mReport += "<h2>Point pattern symbol data defined sub symbol test</h2>\n";
+
+  QgsStringMap properties;
+  properties.insert( "color", "0,0,0,255" );
+  properties.insert( "name", "circle" );
+  properties.insert( "size", "5.0" );
+  QgsMarkerSymbolV2* pointSymbol = QgsMarkerSymbolV2::createSimple( properties );
+  pointSymbol->symbolLayer( 0 )->setDataDefinedProperty( "color", new QgsDataDefined( QString( "if(\"Name\" ='Lake','#ff0000','#ff00ff')" ) ) );
+  mPointPatternFill->setSubSymbol( pointSymbol );
+  QVERIFY( imageCheck( "datadefined_subsymbol" ) );
+}
+
+//
+// Private helper functions not called directly by CTest
+//
+
+
+bool TestQgsPointPatternFillSymbol::imageCheck( const QString& theTestType )
+{
+  //use the QgsRenderChecker test utility class to
+  //ensure the rendered output matches our control image
+  mMapSettings.setExtent( mpPolysLayer->extent() );
+  mMapSettings.setOutputDpi( 96 );
+  QgsRenderChecker myChecker;
+  myChecker.setControlPathPrefix( "symbol_pointpatternfill" );
+  myChecker.setControlName( "expected_" + theTestType );
+  myChecker.setMapSettings( mMapSettings );
+  bool myResultFlag = myChecker.runTest( theTestType );
+  mReport += myChecker.report();
+  return myResultFlag;
+}
+
+QTEST_MAIN( TestQgsPointPatternFillSymbol )
+#include "testqgspointpatternfillsymbol.moc"
diff --git a/tests/src/providers/grass/testqgsgrassprovider.cpp b/tests/src/providers/grass/testqgsgrassprovider.cpp
index 5387801..57d5c7d 100644
--- a/tests/src/providers/grass/testqgsgrassprovider.cpp
+++ b/tests/src/providers/grass/testqgsgrassprovider.cpp
@@ -765,7 +765,10 @@ void TestQgsGrassProvider::rasterImport()
   }
 
   QStringList rasterFiles;
-  rasterFiles << "tenbytenraster.asc" << "landsat.tif" << "raster/band1_byte_ct_epsg4326.tif" << "raster/band1_int16_noct_epsg4326.tif";
+  // tenbytenraster.asc does not have CRS, import to EPSG:4326 without reprojection fails
+  // in G_adjust_Cell_head() (Illegal latitude for North)
+  //rasterFiles << "tenbytenraster.asc";
+  rasterFiles << "landsat.tif" << "raster/band1_byte_ct_epsg4326.tif" << "raster/band1_int16_noct_epsg4326.tif";
   rasterFiles << "raster/band1_float32_noct_epsg4326.tif" << "raster/band3_int16_noct_epsg4326.tif";
 
   QgsCoordinateReferenceSystem mapsetCrs = QgsGrass::crsDirect( mGisdbase, mLocation );
diff --git a/tests/src/python/test_qgsdelimitedtextprovider.py b/tests/src/python/test_qgsdelimitedtextprovider.py
index c404ac2..542863b 100644
--- a/tests/src/python/test_qgsdelimitedtextprovider.py
+++ b/tests/src/python/test_qgsdelimitedtextprovider.py
@@ -43,7 +43,8 @@ from qgis.core import (QgsProviderRegistry,
                        QgsVectorLayer,
                        QgsFeatureRequest,
                        QgsRectangle,
-                       QgsMessageLog
+                       QgsMessageLog,
+                       QGis
                        )
 
 from utilities import (getQgisTestApp,
@@ -190,7 +191,7 @@ def delimitedTextData(testname, filename, requests, verbose, **params):
             msg = re.sub(r'file\s+.*' + re.escape(filename), 'file ' + filelogname, msg)
             msg = msg.replace(filepath, filelogname)
             log.append(msg)
-        return dict(fields=fields, fieldTypes=fieldTypes, data=data, log=log, uri=uri)
+        return dict(fields=fields, fieldTypes=fieldTypes, data=data, log=log, uri=uri, geometryType=layer.geometryType())
 
 
 def printWanted(testname, result):
@@ -206,6 +207,7 @@ def printWanted(testname, result):
     print prefix + "wanted={}"
     print prefix + "wanted['uri']=" + repr(result['uri'])
     print prefix + "wanted['fieldTypes']=" + repr(result['fieldTypes'])
+    print prefix + "wanted['geometryType']=" + repr(result['geometryType'])
     print prefix + "wanted['data']={"
     for k in sorted(data.keys()):
         row = data[k]
@@ -272,6 +274,10 @@ def runTest(file, requests, **params):
         msg = "Layer field types ({0}) doesn't match expected ({1})".format(
             result['fieldTypes'], wanted['fieldTypes'])
         failures.append(msg)
+    if result['geometryType'] != wanted['geometryType']:
+        msg = "Layer geometry type ({0}) doesn't match expected ({1})".format(
+            result['geometryType'], wanted['geometryType'])
+        failures.append(msg)
     wanted_data = wanted['data']
     for id in sorted(wanted_data.keys()):
         wrec = wanted_data[id]
@@ -728,5 +734,13 @@ class TestQgsDelimitedTextProviderOther(TestCase):
         requests = None
         runTest(filename, requests, **params)
 
+    def test_039_issue_13749(self):
+        # First record contains missing geometry
+        filename = 'test13749.csv'
+        params = {'yField': 'geom_y', 'xField': 'geom_x', 'type': 'csv'}
+        requests = None
+        runTest(filename, requests, **params)
+
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/src/python/test_qgsdelimitedtextprovider_wanted.py b/tests/src/python/test_qgsdelimitedtextprovider_wanted.py
index 4de835b..d10b782 100644
--- a/tests/src/python/test_qgsdelimitedtextprovider_wanted.py
+++ b/tests/src/python/test_qgsdelimitedtextprovider_wanted.py
@@ -3,6 +3,7 @@ def test_002_load_csv_file():
     wanted = {}
     wanted['uri'] = u'file://test.csv?geomType=none&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -67,6 +68,7 @@ def test_003_field_naming():
     wanted = {}
     wanted['uri'] = u'file://testfields.csv?geomType=none&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -93,6 +95,7 @@ def test_004_max_fields():
     wanted = {}
     wanted['uri'] = u'file://testfields.csv?geomType=none&maxFields=7&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -114,6 +117,7 @@ def test_005_load_whitespace():
     wanted = {}
     wanted['uri'] = u'file://test.space?geomType=none&type=whitespace'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -184,6 +188,7 @@ def test_006_quote_escape():
     wanted = {}
     wanted['uri'] = u'file://test.pipe?geomType=none&quote="&delimiter=|&escape=\\'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -274,6 +279,7 @@ def test_007_multiple_quote():
     wanted = {}
     wanted['uri'] = u'file://test.quote?geomType=none&quote=\'"&type=csv&escape="\''
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -339,6 +345,7 @@ def test_008_badly_formed_quotes():
     wanted = {}
     wanted['uri'] = u'file://test.badquote?geomType=none&quote="&type=csv&escape="'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         4: {
             'id': u'3',
@@ -363,6 +370,7 @@ def test_009_skip_lines():
     wanted = {}
     wanted['uri'] = u'file://test2.csv?geomType=none&skipLines=2&type=csv&useHeader=no'
     wanted['fieldTypes'] = ['integer', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         3: {
             'id': u'3',
@@ -382,6 +390,7 @@ def test_010_read_coordinates():
     wanted = {}
     wanted['uri'] = u'file://testpt.csv?yField=geom_y&xField=geom_x&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'double', 'double']
+    wanted['geometryType'] = 0
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -421,6 +430,7 @@ def test_011_read_wkt():
     wanted = {}
     wanted['uri'] = u'file://testwkt.csv?delimiter=|&type=csv&wktField=geom_wkt'
     wanted['fieldTypes'] = ['integer', 'text']
+    wanted['geometryType'] = 0
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -467,6 +477,7 @@ def test_012_read_wkt_point():
     wanted = {}
     wanted['uri'] = u'file://testwkt.csv?geomType=point&delimiter=|&type=csv&wktField=geom_wkt'
     wanted['fieldTypes'] = ['integer', 'text']
+    wanted['geometryType'] = 0
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -513,6 +524,7 @@ def test_013_read_wkt_line():
     wanted = {}
     wanted['uri'] = u'file://testwkt.csv?geomType=line&delimiter=|&type=csv&wktField=geom_wkt'
     wanted['fieldTypes'] = ['integer', 'text']
+    wanted['geometryType'] = 1
     wanted['data'] = {
         4: {
             'id': u'3',
@@ -559,6 +571,7 @@ def test_014_read_wkt_polygon():
     wanted = {}
     wanted['uri'] = u'file://testwkt.csv?geomType=polygon&delimiter=|&type=csv&wktField=geom_wkt'
     wanted['fieldTypes'] = ['integer', 'text']
+    wanted['geometryType'] = 2
     wanted['data'] = {
         6: {
             'id': u'5',
@@ -587,6 +600,7 @@ def test_015_read_dms_xy():
     wanted = {}
     wanted['uri'] = u'file://testdms.csv?yField=lat&xField=lon&type=csv&xyDms=yes'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text']
+    wanted['geometryType'] = 0
     wanted['data'] = {
         3: {
             'id': u'1',
@@ -758,6 +772,7 @@ def test_016_decimal_point():
     wanted = {}
     wanted['uri'] = u'file://testdp.csv?yField=geom_y&xField=geom_x&type=csv&delimiter=;&decimalPoint=,'
     wanted['fieldTypes'] = ['integer', 'text', 'double', 'double', 'double', 'text']
+    wanted['geometryType'] = 0
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -788,6 +803,7 @@ def test_017_regular_expression_1():
     wanted = {}
     wanted['uri'] = u'file://testre.txt?geomType=none&trimFields=Y&delimiter=RE(?:GEXP)?&type=regexp'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -814,6 +830,7 @@ def test_018_regular_expression_2():
     wanted = {}
     wanted['uri'] = u'file://testre.txt?geomType=none&trimFields=Y&delimiter=(RE)(GEXP)?&type=regexp'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -852,6 +869,7 @@ def test_019_regular_expression_3():
     wanted = {}
     wanted['uri'] = u'file://testre2.txt?geomType=none&trimFields=Y&delimiter=^(.{5})(.{30})(.{5,})&type=regexp'
     wanted['fieldTypes'] = ['integer', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -881,6 +899,7 @@ def test_020_regular_expression_4():
     wanted = {}
     wanted['uri'] = u'file://testre3.txt?geomType=none&delimiter=x?&type=regexp'
     wanted['fieldTypes'] = ['text', 'text', 'text', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'f',
@@ -904,6 +923,7 @@ def test_021_regular_expression_5():
     wanted = {}
     wanted['uri'] = u'file://testre3.txt?geomType=none&delimiter=\\b&type=regexp'
     wanted['fieldTypes'] = ['text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'fi',
@@ -923,6 +943,7 @@ def test_022_utf8_encoded_file():
     wanted = {}
     wanted['uri'] = u'file://testutf8.csv?geomType=none&delimiter=|&type=csv&encoding=utf-8'
     wanted['fieldTypes'] = ['integer', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -940,6 +961,7 @@ def test_023_latin1_encoded_file():
     wanted = {}
     wanted['uri'] = u'file://testlatin1.csv?geomType=none&delimiter=|&type=csv&encoding=latin1'
     wanted['fieldTypes'] = ['integer', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -957,6 +979,7 @@ def test_024_filter_rect_xy():
     wanted = {}
     wanted['uri'] = u'file://testextpt.txt?yField=y&delimiter=|&type=csv&xField=x'
     wanted['fieldTypes'] = ['integer', 'text', 'integer', 'integer']
+    wanted['geometryType'] = 0
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -1001,6 +1024,7 @@ def test_025_filter_rect_wkt():
     wanted = {}
     wanted['uri'] = u'file://testextw.txt?delimiter=|&type=csv&wktField=wkt'
     wanted['fieldTypes'] = ['integer', 'text']
+    wanted['geometryType'] = 1
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -1061,6 +1085,7 @@ def test_026_filter_fid():
     wanted = {}
     wanted['uri'] = u'file://test.csv?geomType=none&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         3: {
             'id': u'2',
@@ -1100,6 +1125,7 @@ def test_027_filter_attributes():
     wanted = {}
     wanted['uri'] = u'file://test.csv?geomType=none&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'None',
@@ -1209,6 +1235,7 @@ def test_028_substring_test():
     wanted = {}
     wanted['uri'] = u'file://test.csv?geomType=none&type=csv&subset=id%20%25%202%20%3D%201'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -1246,6 +1273,7 @@ def test_029_file_watcher():
     wanted = {}
     wanted['uri'] = u'file://file?geomType=none&type=csv&watchFile=yes'
     wanted['fieldTypes'] = ['integer', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         3: {
             'id': u'2',
@@ -1359,6 +1387,7 @@ def test_030_filter_rect_xy_spatial_index():
     wanted = {}
     wanted['uri'] = u'file://testextpt.txt?spatialIndex=Y&yField=y&delimiter=|&type=csv&xField=x'
     wanted['fieldTypes'] = ['integer', 'text', 'integer', 'integer']
+    wanted['geometryType'] = 0
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -1547,6 +1576,7 @@ def test_031_filter_rect_wkt_spatial_index():
     wanted = {}
     wanted['uri'] = u'file://testextw.txt?spatialIndex=Y&delimiter=|&type=csv&wktField=wkt'
     wanted['fieldTypes'] = ['integer', 'text']
+    wanted['geometryType'] = 1
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -1679,6 +1709,7 @@ def test_032_filter_rect_wkt_create_spatial_index():
     wanted = {}
     wanted['uri'] = u'file://testextw.txt?delimiter=|&type=csv&wktField=wkt'
     wanted['fieldTypes'] = ['integer', 'text']
+    wanted['geometryType'] = 1
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -1877,6 +1908,7 @@ def test_033_reset_subset_string():
     wanted = {}
     wanted['uri'] = u'file://test.csv?geomType=none&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'text', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -2040,6 +2072,7 @@ def test_034_csvt_file():
     wanted = {}
     wanted['uri'] = u'file://testcsvt.csv?geomType=none&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'integer', 'double', 'text', 'text', 'text', 'text', 'text', 'text', 'longlong', 'longlong']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -2082,6 +2115,7 @@ def test_035_csvt_file2():
     wanted = {}
     wanted['uri'] = u'file://testcsvt2.txt?geomType=none&delimiter=|&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'integer', 'double', 'integer', 'text', 'integer']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -2114,6 +2148,7 @@ def test_036_csvt_file_invalid_types():
     wanted = {}
     wanted['uri'] = u'file://testcsvt3.csv?geomType=none&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'integer', 'double', 'integer', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -2149,6 +2184,7 @@ def test_037_csvt_file_invalid_file():
     wanted = {}
     wanted['uri'] = u'file://testcsvt4.csv?geomType=none&type=csv'
     wanted['fieldTypes'] = ['integer', 'text', 'integer', 'double', 'integer', 'text', 'text']
+    wanted['geometryType'] = 4
     wanted['data'] = {
         2: {
             'id': u'1',
@@ -2181,6 +2217,7 @@ def test_038_type_inference():
     wanted = {}
     wanted['uri'] = u'file://testtypes.csv?yField=lat&xField=lon&type=csv'
     wanted['fieldTypes'] = ['text', 'double', 'double', 'text', 'text', 'integer', 'longlong', 'double', 'text']
+    wanted['geometryType'] = 0
     wanted['data'] = {
         2: {
             'id': u'line1',
@@ -2269,3 +2306,49 @@ def test_038_type_inference():
     }
     wanted['log'] = []
     return wanted
+
+
+def test_039_issue_13749():
+    wanted = {}
+    wanted['uri'] = u'file://test13749.csv?yField=geom_y&xField=geom_x&type=csv'
+    wanted['fieldTypes'] = ['integer', 'text', 'double', 'double']
+    wanted['geometryType'] = 0
+    wanted['data'] = {
+        2: {
+            'id': u'1',
+            'description': u'No geom',
+            'geom_x': u'NULL',
+            'geom_y': u'NULL',
+            '#fid': 2,
+            '#geometry': 'None',
+        },
+        3: {
+            'id': u'2',
+            'description': u'Point1',
+            'geom_x': u'11.0',
+            'geom_y': u'22.0',
+            '#fid': 3,
+            '#geometry': 'Point (11 22)',
+        },
+        4: {
+            'id': u'3',
+            'description': u'Point2',
+            'geom_x': u'15.0',
+            'geom_y': u'23.0',
+            '#fid': 4,
+            '#geometry': 'Point (15 23)',
+        },
+        5: {
+            'id': u'4',
+            'description': u'Point3',
+            'geom_x': u'13.0',
+            'geom_y': u'23.0',
+            '#fid': 5,
+            '#geometry': 'Point (13 23)',
+        },
+    }
+    wanted['log'] = [
+        u'Errors in file test13749.csv',
+        u'1 records have missing geometry definitions',
+    ]
+    return wanted
diff --git a/tests/src/python/test_qgsgeometry.py b/tests/src/python/test_qgsgeometry.py
index 2751a67..a8badcc 100644
--- a/tests/src/python/test_qgsgeometry.py
+++ b/tests/src/python/test_qgsgeometry.py
@@ -129,7 +129,11 @@ class TestQgsGeometry(TestCase):
 
                 #test that geometry can be created from WKT
                 geom = QgsGeometry.fromWkt(row['wkt'])
-                assert geom, "WKT conversion {} failed: could not create geom:\n{}\n".format(i + 1, row['wkt'])
+                if row['valid_wkt']:
+                    assert geom, "WKT conversion {} failed: could not create geom:\n{}\n".format(i + 1, row['wkt'])
+                else:
+                    assert not geom, "Corrupt WKT {} was incorrectly converted to geometry:\n{}\n".format(i + 1, row['wkt'])
+                    continue
 
                 #test exporting to WKT results in expected string
                 result = geom.exportToWkt()
diff --git a/tests/src/python/test_qgsvectorlayer.py b/tests/src/python/test_qgsvectorlayer.py
index a22265a..c6ebd6c 100644
--- a/tests/src/python/test_qgsvectorlayer.py
+++ b/tests/src/python/test_qgsvectorlayer.py
@@ -159,7 +159,7 @@ class TestQgsVectorLayer(TestCase):
         checkAfter()
         assert layer.dataProvider().featureCount() == 1
 
-    #DELETE FEATURE
+    # DELETE FEATURE
 
     def test_DeleteFeature(self):
         layer = createLayerWithOnePoint()
@@ -258,7 +258,7 @@ class TestQgsVectorLayer(TestCase):
 
         assert layer.dataProvider().featureCount() == 0
 
-    #CHANGE ATTRIBUTE
+    # CHANGE ATTRIBUTE
 
     def test_ChangeAttribute(self):
         layer = createLayerWithOnePoint()
@@ -347,8 +347,8 @@ class TestQgsVectorLayer(TestCase):
         assert layer.commitChanges()
         checkAfter()
 
-        #print "COMMIT ERRORS:"
-        #for item in list(layer.commitErrors()): print item
+        # print "COMMIT ERRORS:"
+        # for item in list(layer.commitErrors()): print item
 
     # CHANGE GEOMETRY
 
@@ -471,8 +471,8 @@ class TestQgsVectorLayer(TestCase):
         assert layer.commitChanges()
         checkAfter()
 
-        #print "COMMIT ERRORS:"
-        #for item in list(layer.commitErrors()): print item
+        # print "COMMIT ERRORS:"
+        # for item in list(layer.commitErrors()): print item
 
     # ADD ATTRIBUTE
 
@@ -517,7 +517,7 @@ class TestQgsVectorLayer(TestCase):
             assert f2[1] == 123
             assert f2[2] is None
 
-        #for nt in layer.dataProvider().nativeTypes():
+        # for nt in layer.dataProvider().nativeTypes():
         #    print (nt.mTypeDesc, nt.mTypeName, nt.mType, nt.mMinLen,
         #          nt.mMaxLen, nt.mMinPrec, nt.mMaxPrec)
         assert layer.dataProvider().supportedType(fld1)
@@ -591,8 +591,8 @@ class TestQgsVectorLayer(TestCase):
         layer.commitChanges()
         checkAfter()
 
-        #print "COMMIT ERRORS:"
-        #for item in list(layer.commitErrors()): print item
+        # print "COMMIT ERRORS:"
+        # for item in list(layer.commitErrors()): print item
 
     def test_AddAttributeAfterChangeValue(self):
         pass  # not interesting to test...?
@@ -634,7 +634,7 @@ class TestQgsVectorLayer(TestCase):
 
         def checkAfterOneDelete():
             flds = layer.pendingFields()
-            #for fld in flds: print "FLD", fld.name()
+            # for fld in flds: print "FLD", fld.name()
             assert len(flds) == 2
             assert flds[0].name() == "fldint"
             assert flds[1].name() == "flddouble"
@@ -654,7 +654,7 @@ class TestQgsVectorLayer(TestCase):
         def checkAfterTwoDeletes():
             assert layer.pendingAllAttributesList() == [0]
             flds = layer.pendingFields()
-            #for fld in flds: print "FLD", fld.name()
+            # for fld in flds: print "FLD", fld.name()
             assert len(flds) == 1
             assert flds[0].name() == "flddouble"
 
@@ -976,6 +976,19 @@ class TestQgsVectorLayer(TestCase):
 
         assert(layer.pendingFields().count() == cnt)
 
+    def test_ExpressionFilter(self):
+        layer = createLayerWithOnePoint()
+
+        idx = layer.addExpressionField('5', QgsField('test', QVariant.LongLong))
+
+        features = layer.getFeatures(QgsFeatureRequest().setFilterExpression('"test" = 6'))
+
+        assert(len(list(features)) == 0)
+
+        features = layer.getFeatures(QgsFeatureRequest().setFilterExpression('"test" = 5'))
+
+        assert(len(list(features)) == 1)
+
     def onLayerTransparencyChanged(self, tr):
         self.transparencyTest = tr
 
diff --git a/tests/testdata/control_images/expected_rulebased_disabled_else/expected_rulebased_disabled_else_mask.png b/tests/testdata/control_images/expected_rulebased_disabled_else/expected_rulebased_disabled_else_mask.png
new file mode 100644
index 0000000..6915737
Binary files /dev/null and b/tests/testdata/control_images/expected_rulebased_disabled_else/expected_rulebased_disabled_else_mask.png differ
diff --git a/tests/testdata/control_images/expected_rulebased_else/expected_rulebased_else_mask.png b/tests/testdata/control_images/expected_rulebased_else/expected_rulebased_else_mask.png
new file mode 100644
index 0000000..ada409e
Binary files /dev/null and b/tests/testdata/control_images/expected_rulebased_else/expected_rulebased_else_mask.png differ
diff --git a/tests/testdata/control_images/maprotation/expected_lines-parallel-label+45/expected_lines-parallel-label+45_mask.png b/tests/testdata/control_images/maprotation/expected_lines-parallel-label+45/expected_lines-parallel-label+45_mask.png
index 2f11635..41ae00a 100644
Binary files a/tests/testdata/control_images/maprotation/expected_lines-parallel-label+45/expected_lines-parallel-label+45_mask.png and b/tests/testdata/control_images/maprotation/expected_lines-parallel-label+45/expected_lines-parallel-label+45_mask.png differ
diff --git a/tests/testdata/control_images/markerlinesymbol/expected_line_offset/expected_line_offset.png b/tests/testdata/control_images/markerlinesymbol/expected_line_offset/expected_line_offset.png
new file mode 100644
index 0000000..756dad1
Binary files /dev/null and b/tests/testdata/control_images/markerlinesymbol/expected_line_offset/expected_line_offset.png differ
diff --git a/tests/testdata/control_images/markerlinesymbol/expected_line_offset/expected_line_offset_mask.png b/tests/testdata/control_images/markerlinesymbol/expected_line_offset/expected_line_offset_mask.png
new file mode 100644
index 0000000..452ccbb
Binary files /dev/null and b/tests/testdata/control_images/markerlinesymbol/expected_line_offset/expected_line_offset_mask.png differ
diff --git a/tests/testdata/control_images/symbol_linefill/expected_datadefined_subsymbol/expected_datadefined_subsymbol.png b/tests/testdata/control_images/symbol_linefill/expected_datadefined_subsymbol/expected_datadefined_subsymbol.png
new file mode 100644
index 0000000..8dfbc98
Binary files /dev/null and b/tests/testdata/control_images/symbol_linefill/expected_datadefined_subsymbol/expected_datadefined_subsymbol.png differ
diff --git a/tests/testdata/control_images/symbol_linefill/expected_datadefined_subsymbol/expected_datadefined_subsymbol_mask.png b/tests/testdata/control_images/symbol_linefill/expected_datadefined_subsymbol/expected_datadefined_subsymbol_mask.png
new file mode 100644
index 0000000..5e41e05
Binary files /dev/null and b/tests/testdata/control_images/symbol_linefill/expected_datadefined_subsymbol/expected_datadefined_subsymbol_mask.png differ
diff --git a/tests/testdata/control_images/symbol_linefill/expected_symbol_linefill/expected_symbol_linefill.png b/tests/testdata/control_images/symbol_linefill/expected_symbol_linefill/expected_symbol_linefill.png
new file mode 100644
index 0000000..9ecc716
Binary files /dev/null and b/tests/testdata/control_images/symbol_linefill/expected_symbol_linefill/expected_symbol_linefill.png differ
diff --git a/tests/testdata/control_images/symbol_linefill/expected_symbol_linefill/expected_symbol_linefill_mask.png b/tests/testdata/control_images/symbol_linefill/expected_symbol_linefill/expected_symbol_linefill_mask.png
new file mode 100644
index 0000000..0f876ed
Binary files /dev/null and b/tests/testdata/control_images/symbol_linefill/expected_symbol_linefill/expected_symbol_linefill_mask.png differ
diff --git a/tests/testdata/control_images/symbol_pointpatternfill/expected_datadefined_subsymbol/expected_datadefined_subsymbol.png b/tests/testdata/control_images/symbol_pointpatternfill/expected_datadefined_subsymbol/expected_datadefined_subsymbol.png
new file mode 100644
index 0000000..dd78091
Binary files /dev/null and b/tests/testdata/control_images/symbol_pointpatternfill/expected_datadefined_subsymbol/expected_datadefined_subsymbol.png differ
diff --git a/tests/testdata/control_images/symbol_pointpatternfill/expected_datadefined_subsymbol/expected_datadefined_subsymbol_mask.png b/tests/testdata/control_images/symbol_pointpatternfill/expected_datadefined_subsymbol/expected_datadefined_subsymbol_mask.png
new file mode 100644
index 0000000..dd10937
Binary files /dev/null and b/tests/testdata/control_images/symbol_pointpatternfill/expected_datadefined_subsymbol/expected_datadefined_subsymbol_mask.png differ
diff --git a/tests/testdata/control_images/symbol_pointpatternfill/expected_symbol_pointfill/expected_symbol_pointfill.png b/tests/testdata/control_images/symbol_pointpatternfill/expected_symbol_pointfill/expected_symbol_pointfill.png
new file mode 100644
index 0000000..576766b
Binary files /dev/null and b/tests/testdata/control_images/symbol_pointpatternfill/expected_symbol_pointfill/expected_symbol_pointfill.png differ
diff --git a/tests/testdata/delimitedtext/test13749.csv b/tests/testdata/delimitedtext/test13749.csv
new file mode 100644
index 0000000..9ac56c7
--- /dev/null
+++ b/tests/testdata/delimitedtext/test13749.csv
@@ -0,0 +1,5 @@
+id,description,geom_x,geom_y
+1,No geom,,
+2,Point1,11,22
+3,Point2,15,23
+4,Point3,13.0,23.0
diff --git a/tests/testdata/geom_data.csv b/tests/testdata/geom_data.csv
index 3c5f973..9843e39 100644
--- a/tests/testdata/geom_data.csv
+++ b/tests/testdata/geom_data.csv
@@ -50,6 +50,7 @@ GeometryCollection (PointZ (1 2 3)),GEOMETRYCOLLECTION Z (POINT Z (1 2 3)),1,0,0
 "LineString M (1 2 3 , 4 5 6 , 7 8 9 , 10 11 12, 13 14 15)","LINESTRING M (1 2 3,4 5 6,7 8 9,10 11 12,13 14 15)",5,16.9705627485,0,0,1,0,0,POINT(7 8),1,2,13,14,
 "LineString( 1 2 3, 4 5 6 )","LineStringZ( 1 2 3, 4 5 6 )",2,4.2426406871,0,0,1,0,0,Point (2.5 3.5),1,2,4,5,"z coordinate, but geometry not explicitly marked as such. Should be upgraded to have Z dimension"
 "LineString( 1 2 3 4, 5 6 7 8 )","LineStringZM( 1 2 3 4, 5 6 7 8)",2,5.6568542495,0,0,0,0,0,POINT( 3 4 ),1,2,5,6,"4d coordinates, but geometry not explicitly marked as such. Should be upgraded to have ZM dimension"
+"LineString( 1 2 3 4, 5 6 )","LineStringZM( 1 2 3 4, 5 6 0 0)",2,5.6568542495,0,0,0,0,0,POINT( 3 4 ),1,2,5,6,Malformed WKT
 "LineString(1 2,2 3,3 4)","LINESTRING(1 2,2 3,3 4)",3,2.8284271247,0,0,1,0,0,POINT(2 3),1,2,3,4,
 "LineStringZ (0 0 0 , 1 1 1 , 2 2 2 , 3 3 3, 4 4 4)","LINESTRING Z (0 0 0,1 1 1,2 2 2,3 3 3,4 4 4)",5,5.6568542495,0,0,1,0,0,POINT(2 2),0,0,4,4,
 "LineStringZM (0 0 0 2 , 1 1 1 3 , 2 2 2  4, 3 3 3 5, 4 4 4 6)","LineStringZM (0 0 0 2, 1 1 1 3, 2 2 2 4, 3 3 3 5, 4 4 4 6)",5,5.6568542495,0,0,1,0,0,POINT(2 2),0,0,4,4,
@@ -96,6 +97,8 @@ Point( 1 2 3 4 ),PointZM( 1 2 3 4 ),1,0,0,0,1,0,0,Point( 1 2 ),1,2,1,2,"4d coord
 PointM( 4 5 6 ),PointM ( 4 5 6 ),1,0,0,0,1,0,0,POINT(4 5),4,5,4,5,
 PointZ (1 2 3),POINT Z (1 2 3),1,0,0,0,1,0,0,POINT(1 2),1,2,1,2,
 PointZM( 7 8 9 10 ),PointZM( 7 8 9 10 ),1,0,0,0,1,0,0,POINT( 7 8 ),7,8,7,8,
+Polygon(),,,,,,,,,,,,,,Malformed WKT
+Polygon,,,,,,,,,,,,,,Malformed WKT
 "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0),(5 5, 7 5, 7 7 , 5 7, 5 5),(1 1,2 1, 2 2, 1 2, 1 1))","POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5),(1 1,2 1,2 2,1 2,1 1))",15,0,95,52,1,2,0,POINT(4.99473684210526 4.99473684210526),0,0,10,10,
 "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0),(5 5, 7 5, 7 7 , 5 7, 5 5))","POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))",10,0,96,48,1,1,0,POINT(4.95833333333333 4.95833333333333),0,0,10,10,
 "Polygon ((0 0, 10 0, 10 10, 0 10, 0 0))","POLYGON((0 0,10 0,10 10,0 10,0 0))",5,0,100,40,1,0,0,POINT(5 5),0,0,10,10,
diff --git a/tests/testdata/marker_line_offset.qml b/tests/testdata/marker_line_offset.qml
new file mode 100644
index 0000000..20eb0ea
--- /dev/null
+++ b/tests/testdata/marker_line_offset.qml
@@ -0,0 +1,284 @@
+<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
+<qgis version="2.13.0-Master" minimumScale="1" maximumScale="1e+08" simplifyDrawingHints="1" minLabelScale="1" maxLabelScale="1e+08" simplifyDrawingTol="1" simplifyMaxScale="1" hasScaleBasedVisibilityFlag="0" simplifyLocal="1" scaleBasedLabelVisibilityFlag="0">
+  <renderer-v2 attr="LBL" forceraster="0" symbollevels="0" type="categorizedSymbol">
+    <categories>
+      <category render="true" symbol="0" value="East" label="East"/>
+      <category render="true" symbol="1" value="North" label="North"/>
+      <category render="true" symbol="2" value="West" label="West"/>
+      <category render="true" symbol="3" value="South" label="South"/>
+    </categories>
+    <symbols>
+      <symbol alpha="1" clip_to_extent="1" type="line" name="0">
+        <layer pass="0" class="SimpleLine" locked="0">
+          <prop k="capstyle" v="square"/>
+          <prop k="customdash" v="5;2"/>
+          <prop k="customdash_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="customdash_unit" v="MM"/>
+          <prop k="draw_inside_polygon" v="0"/>
+          <prop k="joinstyle" v="bevel"/>
+          <prop k="line_color" v="203,16,23,255"/>
+          <prop k="line_style" v="solid"/>
+          <prop k="line_width" v="1.2"/>
+          <prop k="line_width_unit" v="MM"/>
+          <prop k="offset" v="0"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="use_custom_dash" v="0"/>
+          <prop k="width_map_unit_scale" v="0,0,0,0,0,0"/>
+        </layer>
+        <layer pass="0" class="MarkerLine" locked="0">
+          <prop k="interval" v="3"/>
+          <prop k="interval_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="interval_unit" v="MM"/>
+          <prop k="offset" v="3"/>
+          <prop k="offset_along_line" v="0"/>
+          <prop k="offset_along_line_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_along_line_unit" v="MM"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="placement" v="lastvertex"/>
+          <prop k="rotate" v="1"/>
+          <symbol alpha="1" clip_to_extent="1" type="marker" name="@0 at 1">
+            <layer pass="0" class="SimpleMarker" locked="0">
+              <prop k="angle" v="0"/>
+              <prop k="color" v="203,16,23,255"/>
+              <prop k="horizontal_anchor_point" v="1"/>
+              <prop k="name" v="filled_arrowhead"/>
+              <prop k="offset" v="2,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,0"/>
+              <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="7"/>
+              <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>
+        </layer>
+      </symbol>
+      <symbol alpha="1" clip_to_extent="1" type="line" name="1">
+        <layer pass="0" class="SimpleLine" locked="0">
+          <prop k="capstyle" v="square"/>
+          <prop k="customdash" v="5;2"/>
+          <prop k="customdash_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="customdash_unit" v="MM"/>
+          <prop k="draw_inside_polygon" v="0"/>
+          <prop k="joinstyle" v="bevel"/>
+          <prop k="line_color" v="0,0,0,255"/>
+          <prop k="line_style" v="solid"/>
+          <prop k="line_width" v="1.2"/>
+          <prop k="line_width_unit" v="MM"/>
+          <prop k="offset" v="0"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="use_custom_dash" v="0"/>
+          <prop k="width_map_unit_scale" v="0,0,0,0,0,0"/>
+        </layer>
+        <layer pass="0" class="MarkerLine" locked="0">
+          <prop k="interval" v="3"/>
+          <prop k="interval_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="interval_unit" v="MM"/>
+          <prop k="offset" v="3"/>
+          <prop k="offset_along_line" v="0"/>
+          <prop k="offset_along_line_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_along_line_unit" v="MM"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="placement" v="lastvertex"/>
+          <prop k="rotate" v="1"/>
+          <symbol alpha="1" clip_to_extent="1" type="marker" name="@1 at 1">
+            <layer pass="0" class="SimpleMarker" locked="0">
+              <prop k="angle" v="0"/>
+              <prop k="color" v="0,0,0,255"/>
+              <prop k="horizontal_anchor_point" v="1"/>
+              <prop k="name" v="filled_arrowhead"/>
+              <prop k="offset" v="2,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,0"/>
+              <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="7"/>
+              <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>
+        </layer>
+      </symbol>
+      <symbol alpha="1" clip_to_extent="1" type="line" name="2">
+        <layer pass="0" class="SimpleLine" locked="0">
+          <prop k="capstyle" v="square"/>
+          <prop k="customdash" v="5;2"/>
+          <prop k="customdash_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="customdash_unit" v="MM"/>
+          <prop k="draw_inside_polygon" v="0"/>
+          <prop k="joinstyle" v="bevel"/>
+          <prop k="line_color" v="203,16,23,255"/>
+          <prop k="line_style" v="solid"/>
+          <prop k="line_width" v="1.2"/>
+          <prop k="line_width_unit" v="MM"/>
+          <prop k="offset" v="0"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="use_custom_dash" v="0"/>
+          <prop k="width_map_unit_scale" v="0,0,0,0,0,0"/>
+        </layer>
+        <layer pass="0" class="MarkerLine" locked="0">
+          <prop k="interval" v="3"/>
+          <prop k="interval_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="interval_unit" v="MM"/>
+          <prop k="offset" v="-3"/>
+          <prop k="offset_along_line" v="0"/>
+          <prop k="offset_along_line_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_along_line_unit" v="MM"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="placement" v="lastvertex"/>
+          <prop k="rotate" v="1"/>
+          <symbol alpha="1" clip_to_extent="1" type="marker" name="@2 at 1">
+            <layer pass="0" class="SimpleMarker" locked="0">
+              <prop k="angle" v="0"/>
+              <prop k="color" v="203,16,23,255"/>
+              <prop k="horizontal_anchor_point" v="1"/>
+              <prop k="name" v="filled_arrowhead"/>
+              <prop k="offset" v="2,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,0"/>
+              <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="7"/>
+              <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>
+        </layer>
+      </symbol>
+      <symbol alpha="1" clip_to_extent="1" type="line" name="3">
+        <layer pass="0" class="SimpleLine" locked="0">
+          <prop k="capstyle" v="square"/>
+          <prop k="customdash" v="5;2"/>
+          <prop k="customdash_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="customdash_unit" v="MM"/>
+          <prop k="draw_inside_polygon" v="0"/>
+          <prop k="joinstyle" v="bevel"/>
+          <prop k="line_color" v="0,0,0,255"/>
+          <prop k="line_style" v="solid"/>
+          <prop k="line_width" v="1.2"/>
+          <prop k="line_width_unit" v="MM"/>
+          <prop k="offset" v="0"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="use_custom_dash" v="0"/>
+          <prop k="width_map_unit_scale" v="0,0,0,0,0,0"/>
+        </layer>
+        <layer pass="0" class="MarkerLine" locked="0">
+          <prop k="interval" v="3"/>
+          <prop k="interval_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="interval_unit" v="MM"/>
+          <prop k="offset" v="-3"/>
+          <prop k="offset_along_line" v="0"/>
+          <prop k="offset_along_line_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_along_line_unit" v="MM"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="placement" v="lastvertex"/>
+          <prop k="rotate" v="1"/>
+          <symbol alpha="1" clip_to_extent="1" type="marker" name="@3 at 1">
+            <layer pass="0" class="SimpleMarker" locked="0">
+              <prop k="angle" v="0"/>
+              <prop k="color" v="0,0,0,255"/>
+              <prop k="horizontal_anchor_point" v="1"/>
+              <prop k="name" v="filled_arrowhead"/>
+              <prop k="offset" v="2,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,0"/>
+              <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="7"/>
+              <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>
+        </layer>
+      </symbol>
+    </symbols>
+    <source-symbol>
+      <symbol alpha="1" clip_to_extent="1" type="line" name="0">
+        <layer pass="0" class="SimpleLine" locked="0">
+          <prop k="capstyle" v="square"/>
+          <prop k="customdash" v="5;2"/>
+          <prop k="customdash_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="customdash_unit" v="MM"/>
+          <prop k="draw_inside_polygon" v="0"/>
+          <prop k="joinstyle" v="bevel"/>
+          <prop k="line_color" v="0,0,0,255"/>
+          <prop k="line_style" v="solid"/>
+          <prop k="line_width" v="1.2"/>
+          <prop k="line_width_unit" v="MM"/>
+          <prop k="offset" v="0"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="use_custom_dash" v="0"/>
+          <prop k="width_map_unit_scale" v="0,0,0,0,0,0"/>
+        </layer>
+        <layer pass="0" class="MarkerLine" locked="0">
+          <prop k="interval" v="3"/>
+          <prop k="interval_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="interval_unit" v="MM"/>
+          <prop k="offset" v="-3"/>
+          <prop k="offset_along_line" v="0"/>
+          <prop k="offset_along_line_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_along_line_unit" v="MM"/>
+          <prop k="offset_map_unit_scale" v="0,0,0,0,0,0"/>
+          <prop k="offset_unit" v="MM"/>
+          <prop k="placement" v="lastvertex"/>
+          <prop k="rotate" v="1"/>
+          <symbol alpha="1" clip_to_extent="1" type="marker" name="@0 at 1">
+            <layer pass="0" class="SimpleMarker" locked="0">
+              <prop k="angle" v="0"/>
+              <prop k="color" v="0,0,0,255"/>
+              <prop k="horizontal_anchor_point" v="1"/>
+              <prop k="name" v="filled_arrowhead"/>
+              <prop k="offset" v="2,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="7"/>
+              <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>
+        </layer>
+      </symbol>
+    </source-symbol>
+    <colorramp type="randomcolors" name="[source]"/>
+    <invertedcolorramp value="0"/>
+    <rotation/>
+    <sizescale scalemethod="diameter"/>
+  </renderer-v2>
+</qgis>

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