diff --git a/geolocation.libraries.yml b/geolocation.libraries.yml
index ca41a92..140f365 100644
--- a/geolocation.libraries.yml
+++ b/geolocation.libraries.yml
@@ -109,6 +109,18 @@ geolocation.markerclusterer:
   js:
     https://cdn.rawgit.com/googlemaps/js-marker-clusterer/gh-pages/src/markerclusterer.js: { type: external }
 
+# External OverlappingMarkerSpiderfier
+geolocation.overlappingmarkerspiderfier:
+  remote: https://github.com/jawj/OverlappingMarkerSpiderfier
+  version: 1.x
+  license:
+    name: MIT licence
+    url: http://www.opensource.org/licenses/mit-license.php
+    gpl-compatible: true
+  js:
+    https://cdnjs.cloudflare.com/ajax/libs/OverlappingMarkerSpiderfier/1.0.3/oms.min.js: { type: external }
+
+
 # Form element library.
 geolocation.google_map_form_element:
   js:
diff --git a/js/geolocation-common-map.js b/js/geolocation-common-map.js
index a318c32..7ab8180 100644
--- a/js/geolocation-common-map.js
+++ b/js/geolocation-common-map.js
@@ -351,6 +351,23 @@
         var bounds = new google.maps.LatLngBounds();
         Drupal.geolocation.removeMapMarker(geolocationMap);
 
+        var oms = null;
+        /**
+         * OverlappingMarkerSpiderfier handling.
+         */
+        if (
+          typeof commonMapSettings.overlappingMarkerSpiderfier !== 'undefined'
+          && commonMapSettings.overlappingMarkerSpiderfier.enable
+          && typeof OverlappingMarkerSpiderfier !== 'undefined'
+        ) {
+          oms = new OverlappingMarkerSpiderfier(geolocationMap.googleMap, {
+            markersWontMove: true,
+            markersWontHide: true,
+            basicFormatEvents: true,
+            keepSpiderfied: true
+          });
+        }
+
         /*
          * Add the locations to the map.
          */
@@ -388,6 +405,19 @@
 
           var marker = Drupal.geolocation.setMapMarker(geolocationMap, markerConfig, skipInfoWindow);
 
+          if (oms) {
+            $.each(
+              marker.geolocation.listeners,
+              function (index, listener) {
+                if (listener.e == 'click') {
+                  google.maps.event.removeListener(listener.listener);
+                  marker.addListener('spider_click', listener.f);
+                }
+              }
+            );
+            oms.addMarker(marker);
+          }
+
           marker.addListener('click', function () {
             if (commonMapSettings.markerScrollToResult === true) {
               var target = $('[data-location-id="' + location.data('location-id') + '"]:visible').first();
@@ -482,7 +512,6 @@
         ) {
 
           /* global MarkerClusterer */
-
           var imagePath = '';
           if (commonMapSettings.markerClusterer.imagePath) {
             imagePath = commonMapSettings.markerClusterer.imagePath;
@@ -501,7 +530,8 @@
             geolocationMap.mapMarkers,
             {
               imagePath: imagePath,
-              styles: markerClustererStyles
+              styles: markerClustererStyles,
+              maxZoom: commonMapSettings.markerClusterer.maxZoom
             }
           );
         }
diff --git a/js/geolocation-google-maps-api.js b/js/geolocation-google-maps-api.js
index 69e0be4..cec18de 100644
--- a/js/geolocation-google-maps-api.js
+++ b/js/geolocation-google-maps-api.js
@@ -396,6 +396,8 @@
     // Add the marker to the map.
     /** @type {GoogleMarker} */
     var currentMarker = new google.maps.Marker(markerSettings);
+    currentMarker.geolocation = currentMarker.geolocation || [];
+    currentMarker.geolocation.listeners = currentMarker.geolocation.listeners || []
 
     if (skipInfoWindow !== true) {
 
@@ -405,7 +407,9 @@
         disableAutoPan: map.settings.google_map_settings.disableAutoPan
       });
 
-      currentMarker.addListener('click', function () {
+      var listener = {};
+      listener.e = 'click';
+      listener.f = function () {
         if (markerSettings.infoWindowSolitary) {
           if (typeof map.infoWindow !== 'undefined') {
             map.infoWindow.close();
@@ -413,7 +417,10 @@
           map.infoWindow = currentInfoWindow;
         }
         currentInfoWindow.open(map.googleMap, currentMarker);
-      });
+      }
+      listener.listener = currentMarker.addListener('click', listener.f);
+
+      currentMarker.geolocation.listeners.push(listener);
 
       if (map.settings.google_map_settings.info_auto_display) {
         google.maps.event.addListenerOnce(map.googleMap, 'tilesloaded', function () {
diff --git a/src/Plugin/views/style/CommonMap.php b/src/Plugin/views/style/CommonMap.php
index 893742a..c812435 100644
--- a/src/Plugin/views/style/CommonMap.php
+++ b/src/Plugin/views/style/CommonMap.php
@@ -164,12 +164,22 @@ class CommonMap extends StylePluginBase {
       $build['#attached']['drupalSettings']['geolocation']['commonMap'][$map_id]['markerClusterer'] = [];
       $build['#attached']['drupalSettings']['geolocation']['commonMap'][$map_id]['markerClusterer']['enable'] = TRUE;
       $build['#attached']['drupalSettings']['geolocation']['commonMap'][$map_id]['markerClusterer']['imagePath'] = $this->options['marker_clusterer_image_path'];
+      $build['#attached']['drupalSettings']['geolocation']['commonMap'][$map_id]['markerClusterer']['maxZoom'] = $this->options['marker_clusterer_max_zoom'];
       if (!empty($this->options['marker_clusterer_styles'])) {
         $build['#attached']['drupalSettings']['geolocation']['commonMap'][$map_id]['markerClusterer']['styles'] = json_decode($this->options['marker_clusterer_styles']);
       }
     }
 
     /*
+     * OverlappingMarkerSpiderfier
+     */
+    if (!empty($this->options['overlapping_marker_spiderfier'])) {
+      $build['#attached']['library'][] = 'geolocation/geolocation.overlappingmarkerspiderfier';
+      $build['#attached']['drupalSettings']['geolocation']['commonMap'][$map_id]['overlappingMarkerSpiderfier'] = [];
+      $build['#attached']['drupalSettings']['geolocation']['commonMap'][$map_id]['overlappingMarkerSpiderfier']['enable'] = TRUE;
+    }
+
+    /*
      * Dynamic map handling.
      */
     if (!empty($this->options['dynamic_map']['enabled'])) {
@@ -456,7 +466,9 @@ class CommonMap extends StylePluginBase {
     $options['id_field'] = ['default' => ''];
     $options['marker_clusterer'] = ['default' => 0];
     $options['marker_clusterer_image_path'] = ['default' => ''];
+    $options['marker_clusterer_max_zoom'] = ['default' => 15];
     $options['marker_clusterer_styles'] = ['default' => []];
+    $options['overlapping_marker_spiderfier'] = ['default' => 0];
     $options['dynamic_map'] = [
       'contains' => [
         'enabled' => ['default' => 0],
@@ -835,6 +847,20 @@ class CommonMap extends StylePluginBase {
         ],
       ],
     ];
+    $form['marker_clusterer_max_zoom'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Max Zoom'),
+      '#options' => range(static::$MINZOOMLEVEL, static::$MAXZOOMLEVEL),
+      '#default_value' => $this->options['marker_clusterer_max_zoom'],
+      '#group' => 'style_options][marker_clusterer_settings',
+      '#process' => [
+        ['\Drupal\Core\Render\Element\RenderElement', 'processGroup'],
+        ['\Drupal\Core\Render\Element\Select', 'processSelect'],
+      ],
+      '#pre_render' => [
+        ['\Drupal\Core\Render\Element\RenderElement', 'preRenderGroup'],
+      ],
+    ];
     $form['marker_clusterer_styles'] = [
       '#group' => 'style_options][marker_clusterer_settings',
       '#title' => $this->t('Styles of the Cluster'),
@@ -853,10 +879,22 @@ class CommonMap extends StylePluginBase {
       ],
     ];
 
+    $form['overlapping_marker_spiderfier_settings'] = [
+      '#type' => 'details',
+      '#title' => $this->t('Overlapping Marker Spiderfier'),
+    ];
+    $form['overlapping_marker_spiderfier'] = [
+      '#group' => 'style_options][overlapping_marker_spiderfier_settings',
+      '#title' => $this->t('Spider markers'),
+      '#type' => 'checkbox',
+      //'#description' => $this->t('Various <a href=":url">examples</a> are available.', [':url' => 'https://developers.google.com/maps/documentation/javascript/marker-clustering']),
+      '#default_value' => $this->options['overlapping_marker_spiderfier'],
+    ];
+
+
     /*
      * Google Maps settings
      */
-
     $form += $this->getGoogleMapsSettingsForm($this->options, 'style_options][');
   }
 
