diff --git a/src/location/declarativemaps/qdeclarativegeomap.cpp b/src/location/declarativemaps/qdeclarativegeomap.cpp
index 57f127efdd6eef98700dd10491cf3c12c8ba3ba0..1c0815ca39c514a77a217e33a8637e772033f0d6 100644
--- a/src/location/declarativemaps/qdeclarativegeomap.cpp
+++ b/src/location/declarativemaps/qdeclarativegeomap.cpp
@@ -832,8 +832,8 @@ QDeclarativeGeoServiceProvider *QDeclarativeGeoMap::plugin() const
 */
 void QDeclarativeGeoMap::setMinimumZoomLevel(qreal minimumZoomLevel, bool userSet)
 {
-
     if (minimumZoomLevel >= 0) {
+        qreal oldUserMinimumZoomLevel = m_userMinimumZoomLevel;
         if (userSet)
             m_userMinimumZoomLevel = minimumZoomLevel;
         qreal oldMinimumZoomLevel = this->minimumZoomLevel();
@@ -842,12 +842,15 @@ void QDeclarativeGeoMap::setMinimumZoomLevel(qreal minimumZoomLevel, bool userSe
         if (m_map)
              minimumZoomLevel = qMax<qreal>(minimumZoomLevel, m_map->minimumZoom());
 
+        // minimumZoomLevel is, at this point, the implicit minimum zoom level
         m_gestureArea->setMinimumZoomLevel(minimumZoomLevel);
 
         if (zoomLevel() < minimumZoomLevel && (m_gestureArea->enabled() || !m_cameraCapabilities.overzoomEnabled()))
             setZoomLevel(minimumZoomLevel);
 
-        if (oldMinimumZoomLevel != minimumZoomLevel)
+        if (qIsNaN(m_userMinimumZoomLevel) && oldMinimumZoomLevel != minimumZoomLevel)
+            emit minimumZoomLevelChanged();
+        else if (userSet && oldUserMinimumZoomLevel != m_userMinimumZoomLevel)
             emit minimumZoomLevelChanged();
     }
 }
@@ -867,10 +870,29 @@ void QDeclarativeGeoMap::setMinimumZoomLevel(qreal minimumZoomLevel, bool userSe
 */
 
 qreal QDeclarativeGeoMap::minimumZoomLevel() const
+{
+    if (!qIsNaN(m_userMinimumZoomLevel))
+        return m_userMinimumZoomLevel;
+    else
+        return m_gestureArea->minimumZoomLevel();
+}
+
+/*!
+    \internal
+*/
+qreal QDeclarativeGeoMap::implicitMinimumZoomLevel() const
 {
     return m_gestureArea->minimumZoomLevel();
 }
 
+/*!
+    \internal
+*/
+qreal QDeclarativeGeoMap::effectiveMinimumZoomLevel() const
+{
+    return qMax<qreal>(minimumZoomLevel(), implicitMinimumZoomLevel());
+}
+
 /*!
     \internal
     Sets the gesture areas maximum zoom level. If the camera capabilities
@@ -936,14 +958,15 @@ void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel)
 */
 void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel, bool overzoom)
 {
-    if (m_cameraData.zoomLevel() == zoomLevel || zoomLevel < 0)
+    const qreal oldZoom = m_cameraData.zoomLevel();
+    if (oldZoom == zoomLevel || zoomLevel < 0)
         return;
 
     //small optimization to avoid double setCameraData
     bool centerHasChanged = false;
 
     if (m_initialized) {
-        m_cameraData.setZoomLevel(qBound<qreal>(overzoom ? m_map->minimumZoom() : minimumZoomLevel(),
+        m_cameraData.setZoomLevel(qBound<qreal>(overzoom ? m_map->minimumZoom() : effectiveMinimumZoomLevel(),
                                                 zoomLevel,
                                                 overzoom ? 30 : maximumZoomLevel()));
         m_maximumViewportLatitude = m_map->maximumCenterLatitudeAtZoom(m_cameraData);
@@ -960,7 +983,8 @@ void QDeclarativeGeoMap::setZoomLevel(qreal zoomLevel, bool overzoom)
 
     if (centerHasChanged)
         emit centerChanged(m_cameraData.center());
-    emit zoomLevelChanged(m_cameraData.zoomLevel());
+    if (oldZoom != m_cameraData.zoomLevel())
+        emit zoomLevelChanged(m_cameraData.zoomLevel());
 }
 
 qreal QDeclarativeGeoMap::zoomLevel() const
diff --git a/src/location/declarativemaps/qdeclarativegeomap_p.h b/src/location/declarativemaps/qdeclarativegeomap_p.h
index 0d5ae481c8a2ecd9998cf7d5e35193323b920ff8..cb8fed08513d3ea62ab5870a3c4574eb9069c616 100644
--- a/src/location/declarativemaps/qdeclarativegeomap_p.h
+++ b/src/location/declarativemaps/qdeclarativegeomap_p.h
@@ -116,6 +116,8 @@ public:
 
     void setMinimumZoomLevel(qreal minimumZoomLevel, bool userSet = true);
     qreal minimumZoomLevel() const;
+    qreal implicitMinimumZoomLevel() const;
+    qreal effectiveMinimumZoomLevel() const;
 
     void setMaximumZoomLevel(qreal maximumZoomLevel, bool userSet = true);
     qreal maximumZoomLevel() const;