diff --git a/src/module_vmap/module/javascript/app/vmap/tools/insert.js b/src/module_vmap/module/javascript/app/vmap/tools/insert.js
index 36e8096d1d253a017a391572046c43214b9582c5..6e01c71fad23a4a0c796cc4cafe41ee526e0c131 100644
--- a/src/module_vmap/module/javascript/app/vmap/tools/insert.js
+++ b/src/module_vmap/module/javascript/app/vmap/tools/insert.js
@@ -1069,9 +1069,11 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.startDrawi
     var this_ = this;
     this.draw_.on('drawend',
             function (evt) {
-                // Si la géométrie est un cercle, alors elle est remplacée par un polygone à 32 côtés
                 var feature = evt.feature;
+                // Si la géométrie est un cercle, alors elle est remplacée par un polygone à 32 côtés
                 feature = this_.updateCircleGeoms(feature);
+                // Évite les intersections avec les autres couches si besoin
+                feature = this_.avoidIntersections(feature);
             }, this);
 
 
@@ -1142,6 +1144,105 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.updateCirc
     return feature;
 };
 
+
+/**
+ * Edit the given feature to avoid intersections with layers defined in snapOptions.avoidIntersections
+ * @param {ol.Feature} olFeature
+ * @returns {ol.Feature}
+ */
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.avoidIntersections = function (olFeature) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.avoidIntersections');
+
+    // Objets métiers à intersecter
+    var aIntersectionBos = [];
+    for (var bo_id in this['snapOptions']['avoidIntersections']) {
+        if (this['snapOptions']['avoidIntersections'][bo_id] === true) {
+            aIntersectionBos.push(bo_id);
+        }
+    }
+
+    // Remplace la géométrie par celle calculée
+    if (aIntersectionBos.length > 0) {
+        this.setDiffGeom_(aIntersectionBos, olFeature)
+    }
+}
+
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.setDiffGeom_ = function (aIntersectionBos, olFeature, opt_options) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.setDiffGeom_');
+
+    if (!goog.isArray(aIntersectionBos)) {
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(olFeature)) {
+        return 0;
+    }
+    if (!goog.isDefAndNotNull(opt_options)) {
+        opt_options = {
+            bo_index: 0
+        }
+    }
+
+    var this_ = this;
+    var sEWKTGeom = oVmap.getEWKTFromGeom(olFeature.getGeometry());
+
+    this.getDiffGeom_(aIntersectionBos[opt_options.bo_index], sEWKTGeom).then(function(sNewEWKTGeom){
+
+        // Remplace la géométrie
+        olFeature.setGeometry(oVmap.getGeomFromEWKT(sNewEWKTGeom));
+
+        // Relance la fonction pour les autres objets métiers
+        opt_options.bo_index ++;
+        if (opt_options.bo_index < aIntersectionBos.length) {
+            this_.setDiffGeom_(aIntersectionBos, olFeature, opt_options);
+        }
+    }, function(err){
+        console.log('Cannot get the diff geom: ', err)
+    });
+
+}
+
+nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.getDiffGeom_ = function (sBoId, sEWKTGeom) {
+    oVmap.log('nsVmap.nsToolsManager.Insert.inserttoolController.getDiffGeom_');
+
+    var deferred = this.$q_.defer();
+    ajaxRequest({
+        'method': 'POST',
+        'url': oVmap['properties']['api_url'] + '/vmap/querys/' + sBoId + '/diff_geometry',
+        'headers': {
+            'X-HTTP-Method-Override': 'GET',
+            'Accept': 'application/x-vm-json'
+        },
+        'data': {
+            'intersect_geom': sEWKTGeom
+        },
+        'scope': this.$scope_,
+        'success': function (response) {
+
+            if (!goog.isDefAndNotNull(response['data'])) {
+                deferred.reject('response.data not defined');
+                return 0;
+            }
+            if (goog.isDefAndNotNull(response['data']['errorMessage'])) {
+                deferred.reject(response['data']['errorMessage']);
+                return 0;
+            }
+            if (!goog.isDefAndNotNull(response['data'][0])) {
+                deferred.reject('response.data[0] not defined');
+                return 0;
+            }
+            if (!goog.isDefAndNotNull(response['data'][0]['diff_geom'])) {
+                deferred.reject('response.data[0].diff_geom not defined');
+                return 0;
+            }
+            deferred.resolve(response['data'][0]['diff_geom']);
+        },
+        'error': function (response) {
+            deferred.reject(response);
+        }
+    });
+    return deferred.promise;
+}
+
 /**
  * Update feature for scope.oInsertObject
  */
@@ -1608,6 +1709,10 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadBoVect
                     oBo['bo_snapping_loaded'] = null;
                     return 0;
                 }
+                if (!goog.isDefAndNotNull(response['data'][0])) {
+                    oBo['bo_snapping_loaded'] = null;
+                    return 0;
+                }
                 if (response['data'][0]['count'] > this_['snapOptions']['snappingObjectsLimit']) {
                     oBo['bo_snapping_loaded'] = null;
                     var text = 'Limit de points atteinte pour object ';
@@ -1620,7 +1725,8 @@ nsVmap.nsToolsManager.Insert.prototype.inserttoolController.prototype.loadBoVect
                     if (goog.isDefAndNotNull(response['data'][i]['geom'])) {
                         geom = response['data'][i]['geom'];
                         aFeatures.push(new ol.Feature({
-                            geometry: oVmap.getGeomFromEWKT(geom)
+                            geometry: oVmap.getGeomFromEWKT(geom),
+                            'bo_id': bo_id
                         }));
                     }
                 }