diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_fixedwingdrone_js.js b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_fixedwingdrone_js.js
index 8739ee605b976fefdef88ddaa4efde13ad72278d..ff3ccbddf59dcb4842a03caa9cfe097864929318 100644
--- a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_fixedwingdrone_js.js
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_fixedwingdrone_js.js
@@ -93,7 +93,7 @@ var FixedWingDroneAPI = /** @class */ (function () {
   ** Function called on every drone update, right before onUpdate AI script
   */
   FixedWingDroneAPI.prototype.internal_update = function (context, delta_time) {
-    var diff, newrot, orientationValue, rotStep, updateSpeed;
+    var diff, newrot, orientationValue, rotStep;
 
     //TODO rotation
     if (context._rotationTarget) {
@@ -117,18 +117,8 @@ var FixedWingDroneAPI = /** @class */ (function () {
     }
 
     this._updateSpeed(context, delta_time);
-    this._updateDirection(context, delta_time);
+    this._updatePosition(context, delta_time);
 
-    updateSpeed = context._speed * delta_time / 1000;
-    if (context._direction.x !== 0 ||
-        context._direction.y !== 0 ||
-        context._direction.z !== 0) {
-      context._controlMesh.position.addInPlace(new BABYLON.Vector3(
-        context._direction.x * updateSpeed,
-        context._direction.y * updateSpeed,
-        context._direction.z * updateSpeed
-      ));
-    }
     //TODO rotation
     orientationValue = context._maxOrientation *
       (context._speed / context._maxSpeed);
@@ -181,66 +171,111 @@ var FixedWingDroneAPI = /** @class */ (function () {
     }
   };
 
-  FixedWingDroneAPI.prototype._updateDirection = function (drone, delta_time) {
-    var horizontalCoeff, newX, newY, newZ, tangentYaw;
+  FixedWingDroneAPI.prototype._updatePosition = function (drone, delta_time) {
+    var R = 6371e3,
+      currentGeoCoordinates = this._mapManager.convertToGeoCoordinates(
+        drone.position.x,
+        drone.position.y,
+        drone.position.z
+      ),
+      targetCoordinates = this._mapManager.convertToGeoCoordinates(
+        drone._targetCoordinates.x,
+        drone._targetCoordinates.y,
+        drone._targetCoordinates.z
+      ),
+      bearing = this._computeBearing(
+        currentGeoCoordinates.x,
+        currentGeoCoordinates.y,
+        targetCoordinates.x,
+        targetCoordinates.y
+      ),
+      currentCosLat,
+      currentLatRad,
+      distance,
+      distanceCos,
+      distanceSin,
+      currentSinLat,
+      currentLonRad,
+      groundSpeed,
+      newCoordinates,
+      newLatRad,
+      newLonRad,
+      newYaw,
+      newYawRad,
+      verticalSpeed,
+      yawToDirection;
 
     if (this._loiter_mode && Math.sqrt(
       Math.pow(drone._targetCoordinates.x - drone.position.x, 2) +
       Math.pow(drone._targetCoordinates.y - drone.position.y, 2)
     ) <= this._loiter_radius) {
-      tangentYaw = this._computeBearing(
-        drone.position.x,
-        drone.position.y,
-        drone._targetCoordinates.x,
-        drone._targetCoordinates.y
-      ) - 90;
-      // trigonometric circle is east oriented, yaw angle is clockwise
-      tangentYaw = this._toRad(-tangentYaw + 90);
-      newX = Math.cos(tangentYaw);
-      newZ = Math.sin(tangentYaw);
+      newYaw = bearing - 90;
     } else {
-      [newX, newZ] = this._getNewYaw(drone, delta_time);
+      newYaw = this._getNewYaw(drone, bearing, delta_time);
     }
-    newY = this._getNewAltitude(drone);
+    newYawRad = this._toRad(newYaw);
+
+    currentLatRad = this._toRad(currentGeoCoordinates.x);
+    currentCosLat = Math.cos(currentLatRad);
+    currentSinLat = Math.sin(currentLatRad);
+    currentLonRad = this._toRad(currentGeoCoordinates.y);
 
-    horizontalCoeff = Math.sqrt(
-      (
-        Math.pow(drone.getAirSpeed(), 2) - Math.pow(newY, 2)
-      ) / (
-        Math.pow(newX, 2) + Math.pow(newZ, 2)
-      )
+    verticalSpeed = this._getVerticalSpeed(drone);
+    groundSpeed = Math.sqrt(
+      Math.pow(drone.getAirSpeed(), 2) - Math.pow(verticalSpeed, 2)
     );
-    newX *= horizontalCoeff;
-    newZ *= horizontalCoeff;
-    // swap y and z axis so z axis represents altitude
-    drone.setDirection(newX, newZ, newY);
-  };
 
-  FixedWingDroneAPI.prototype._getNewYaw = function (drone, delta_time) {
-    // swap y and z axis so z axis represents altitude
-    var bearing = this._computeBearing(
-        drone.position.x,
-        drone.position.y,
-        drone._targetCoordinates.x,
-        drone._targetCoordinates.y
-      ),
-      yaw = drone.getYaw(),
-      yawDiff = this._computeYawDiff(yaw, bearing),
-      yawUpdate = this.getYawVelocity(drone) * delta_time / 1000;
+    distance = (groundSpeed * delta_time / 1000) / R;
+    distanceCos = Math.cos(distance);
+    distanceSin = Math.sin(distance);
 
-    if (yawUpdate >= Math.abs(yawDiff)) {
-      yawUpdate = yawDiff;
-    } else if (yawDiff < 0) {
-      yawUpdate *= -1;
-    }
-    yaw += yawUpdate;
+    newLatRad = Math.asin(
+      currentSinLat * distanceCos +
+      currentCosLat * distanceSin * Math.cos(newYawRad)
+    );
+    newLonRad = currentLonRad + Math.atan2(
+      Math.sin(newYawRad) * distanceSin * currentCosLat,
+      distanceCos - currentSinLat * Math.sin(newLatRad)
+    );
 
-    // trigonometric circle is east oriented, yaw angle is clockwise
-    yaw = this._toRad(-yaw + 90);
-    return [Math.cos(yaw), Math.sin(yaw)];
+    newCoordinates = this._mapManager.convertToLocalCoordinates(
+      this._toDeg(newLatRad),
+      this._toDeg(newLonRad),
+      drone.position.z
+    );
+
+    // swap y and z axis so z axis represents altitude
+    drone._controlMesh.position.addInPlace(new BABYLON.Vector3(
+      Math.abs(newCoordinates.x - drone.position.x) *
+      (newCoordinates.x < drone.position.x ? -1 : 1),
+      verticalSpeed * delta_time / 1000,
+      Math.abs(newCoordinates.y - drone.position.y) *
+      (newCoordinates.y < drone.position.y ? -1 : 1)
+    ));
+    yawToDirection = this._toRad(-newYaw + 90);
+    drone.setDirection(
+      groundSpeed * Math.cos(yawToDirection),
+      groundSpeed * Math.sin(yawToDirection),
+      verticalSpeed
+    );
   };
 
-  FixedWingDroneAPI.prototype._getNewAltitude = function (drone) {
+  FixedWingDroneAPI.prototype._getNewYaw =
+    function (drone, bearing, delta_time) {
+      // swap y and z axis so z axis represents altitude
+      var yaw = drone.getYaw(),
+        yawDiff = this._computeYawDiff(yaw, bearing),
+        yawUpdate = this.getYawVelocity(drone) * delta_time / 1000;
+
+      if (yawUpdate >= Math.abs(yawDiff)) {
+        yawUpdate = yawDiff;
+      } else if (yawDiff < 0) {
+        yawUpdate *= -1;
+      }
+      return yaw + yawUpdate;
+    };
+
+  FixedWingDroneAPI.prototype._getVerticalSpeed = function (drone) {
     // swap y and z axis so z axis represents altitude
     var altitudeDiff = drone._targetCoordinates.z - drone.position.z,
       verticalSpeed;
@@ -356,20 +391,16 @@ var FixedWingDroneAPI = /** @class */ (function () {
     if (isNaN(lat) || isNaN(lon) || isNaN(z)) {
       throw new Error('Target coordinates must be numbers');
     }
-    var point = this._mapManager.toLocalCoordinates(lat, lon,
-                                                    this._map_dict.map_size),
-      position = this._mapManager.normalize(point.x, point.y, this._map_dict);
-    if (z > this._map_dict.start_AMSL) {
-      z -= this._map_dict.start_AMSL;
+    var processed_coordinates =
+      this._mapManager.convertToLocalCoordinates(lat, lon, z);
+    if (processed_coordinates.z > this._map_dict.start_AMSL) {
+      processed_coordinates.z -= this._map_dict.start_AMSL;
     }
-    return {
-      x: position[0],
-      y: position[1],
-      z: z
-    };
+    return processed_coordinates;
   };
+
   FixedWingDroneAPI.prototype.getCurrentPosition = function (x, y, z) {
-    return this._mapManager.convertToGeoCoordinates(x, y, z, this._map_dict);
+    return this._mapManager.convertToGeoCoordinates(x, y, z);
   };
   FixedWingDroneAPI.prototype.getDroneViewInfo = function (drone) {
     var context = this, result = { "obstacles": [], "drones": [] }, distance,
@@ -455,11 +486,18 @@ var FixedWingDroneAPI = /** @class */ (function () {
   };
   FixedWingDroneAPI.prototype.getYaw = function (drone) {
     var direction = drone.worldDirection;
-    return this._computeBearing(0, 0, direction.x, direction.z);
-  };
-  FixedWingDroneAPI.prototype._computeBearing = function (x1, z1, x2, z2) {
-    return this._toDeg(Math.atan2(x2 - x1, z2 - z1));
-  };
+    return this._toDeg(Math.atan2(direction.x, direction.z));
+  };
+  FixedWingDroneAPI.prototype._computeBearing =
+    function (lat1, lon1, lat2, lon2) {
+      var dLon = this._toRad(lon2 - lon1),
+        lat1Rad = this._toRad(lat1),
+        lat2Rad = this._toRad(lat2),
+        x = Math.cos(lat2Rad) * Math.sin(dLon),
+        y = Math.cos(lat1Rad) * Math.sin(lat2Rad) -
+          Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(dLon);
+      return this._toDeg(Math.atan2(x, y));
+    };
   FixedWingDroneAPI.prototype._computeYawDiff = function (yaw1, yaw2) {
     var diff = yaw2 - yaw1;
     diff += (diff > 180) ? -360 : (diff < -180) ? 360 : 0;
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_fixedwingdrone_js.xml b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_fixedwingdrone_js.xml
index c7c76f47bb945fc717faec379d8f1f8590d67024..d0e4a7a2f256ce62055688f07e59612f42377324 100644
--- a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_fixedwingdrone_js.xml
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_fixedwingdrone_js.xml
@@ -246,7 +246,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>1010.5034.64121.33006</string> </value>
+                      <value> <string>1010.22181.14558.58982</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -266,7 +266,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1690565260.64</float>
+                              <float>1691593350.04</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.js b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.js
index 9b71aee56243361a7a73666c21bcbb93ae58349b..ff8c15e03f4d06725fedbe58497af43f29e833a3 100644
--- a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.js
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.js
@@ -408,70 +408,15 @@ var DroneManager = /** @class */ (function () {
 
 var MapManager = /** @class */ (function () {
   "use strict";
-  //random geo-point:
-  var MIN_LAT = 45.64,
-      MIN_LON = 14.253,
-      EPSILON = 9.9,
+  var EPSILON = 9.9,
       START_Z = 15,
       R = 6371e3;
-  function calculateMapInfo(map, map_dict) {
-    var min_lat = map_dict.min_lat || MIN_LAT,
-      min_lon =  map_dict.min_lon || MIN_LON,
-      offset = map.latLonOffset(min_lat, min_lon, map_dict.map_size),
-      max_lat = offset[0],
-      max_lon = offset[1],
-      starting_point = map_dict.map_size / 2 * -0.75,
-      local_min = map.toLocalCoordinates(min_lat, min_lon, map_dict.map_size),
-      local_max = map.toLocalCoordinates(max_lat, max_lon, map_dict.map_size);
-    map.map_info = {
-      "depth": map_dict.map_size,
-      "width": map_dict.map_size,
-      "map_size": map_dict.map_size,
-      "min_lat": min_lat,
-      "min_lon": min_lon,
-      "max_lat": max_lat,
-      "max_lon": max_lon,
-      "min_x": local_min.x,
-      "min_y": local_min.y,
-      "max_x": local_max.x,
-      "max_y": local_max.y,
-      "height": map_dict.height,
-      "start_AMSL": map_dict.start_AMSL,
-      "flag_list": map_dict.flag_list,
-      "geo_flag_list": [],
-      "flag_distance_epsilon": map_dict.flag_distance_epsilon || EPSILON,
-      "obstacle_list": map_dict.obstacle_list,
-      "geo_obstacle_list": [],
-      "initial_position": {
-        "x": 0,
-        "y": starting_point,
-        "z": START_Z
-      }
-    };
-    map_dict.flag_list.forEach(function (flag_info, index) {
-      map.map_info.geo_flag_list.push(map.convertToGeoCoordinates(
-        flag_info.position.x,
-        flag_info.position.y,
-        flag_info.position.z
-      ));
-    });
-    map_dict.obstacle_list.forEach(function (obstacle_info, index) {
-      var geo_obstacle = {};
-      Object.assign(geo_obstacle, obstacle_info);
-      geo_obstacle.position = map.convertToGeoCoordinates(
-        obstacle_info.position.x,
-        obstacle_info.position.y,
-        obstacle_info.position.z
-      );
-      map.map_info.geo_obstacle_list.push(geo_obstacle);
-    });
-  }
   //** CONSTRUCTOR
   function MapManager(scene) {
     var _this = this, max_sky, skybox, skyboxMat, largeGroundMat, flag_material,
       largeGroundBottom, width, depth, terrain, max, flag_a, flag_b, mast, flag,
       count = 0, new_obstacle;
-    calculateMapInfo(_this, GAMEPARAMETERS.map);
+    this.setMapInfo(GAMEPARAMETERS.map, GAMEPARAMETERS.initialPosition);
     max = _this.map_info.width;
     if (_this.map_info.depth > max) {
       max = _this.map_info.depth;
@@ -612,22 +557,74 @@ var MapManager = /** @class */ (function () {
       _this._flag_list.push(flag);
     });
   }
+  MapManager.prototype.setMapInfo = function (map_dict, initial_position) {
+    var max_width = this.latLonDistance([map_dict.min_lat, map_dict.min_lon],
+                                     [map_dict.min_lat, map_dict.max_lon]),
+      max_height = this.latLonDistance([map_dict.min_lat, map_dict.min_lon],
+                                     [map_dict.max_lat, map_dict.min_lon]),
+      map_size = Math.ceil(Math.max(max_width, max_height)),
+      starting_point = map_size / 2 * -0.75;
+    console.log("max_width:",max_width);
+    console.log("max_height:",max_height);
+    console.log("map_size:",map_size);
+    this.map_info = {
+      "depth": map_size,
+      "height": map_dict.height,
+      "width": map_size,
+      "map_size": map_size,
+      "start_AMSL": map_dict.start_AMSL,
+      "flag_list": map_dict.flag_list,
+      "geo_flag_list": [],
+      "flag_distance_epsilon": map_dict.flag_distance_epsilon || EPSILON,
+      "obstacle_list": map_dict.obstacle_list,
+      "geo_obstacle_list": [],
+      "initial_position": {
+        "x": 0,
+        "y": starting_point,
+        "z": START_Z
+      }
+    };
+    this.map_info.min_x = this.longitudToX(map_dict.min_lon);
+    this.map_info.min_y = this.latitudeToY(map_dict.min_lat);
+    this.map_info.max_x = this.longitudToX(map_dict.max_lon);
+    this.map_info.max_y = this.latitudeToY(map_dict.max_lat);
+    var map = this;
+    map_dict.flag_list.forEach(function (flag_info, index) {
+      map.map_info.geo_flag_list.push(map.convertToGeoCoordinates(
+        flag_info.position.x,
+        flag_info.position.y,
+        flag_info.position.z
+      ));
+    });
+    map_dict.obstacle_list.forEach(function (obstacle_info, index) {
+      var geo_obstacle = {};
+      Object.assign(geo_obstacle, obstacle_info);
+      geo_obstacle.position = map.convertToGeoCoordinates(
+        obstacle_info.position.x,
+        obstacle_info.position.y,
+        obstacle_info.position.z
+      );
+      map.map_info.geo_obstacle_list.push(geo_obstacle);
+    });
+  };
   MapManager.prototype.getMapInfo = function () {
     return this.map_info;
   };
-  MapManager.prototype.latLonOffset = function (lat, lon, offset_in_mt) {
+  MapManager.prototype.longitudToX = function (lon) {
+    return (this.map_info.map_size / 360.0) * (180 + lon);
+  };
+  MapManager.prototype.latitudeToY = function (lat) {
+    return (this.map_info.map_size / 180.0) * (90 - lat);
+  };
+  //TODO refactor latLonOffset, should be the reverse of lat-lon distance
+  //then map_size can be used as parameter (get max lat-lon from map_size)
+  /*MapManager.prototype.latLonOffset = function (lat, lon, offset_in_mt) {
     var R = 6371e3, //Earth radius
       lat_offset = offset_in_mt / R,
       lon_offset = offset_in_mt / (R * Math.cos(Math.PI * lat / 180));
     return [lat + lat_offset * 180 / Math.PI,
             lon + lon_offset * 180 / Math.PI];
-  };
-  MapManager.prototype.toLocalCoordinates = function (lat, lon, map_size) {
-    return {
-      "x": (map_size / 360.0) * (180 + lon),
-      "y": (map_size / 180.0) * (90 - lat)
-    };
-  };
+  };*/
   MapManager.prototype.latLonDistance = function (c1, c2) {
     var q1 = c1[0] * Math.PI / 180,
       q2 = c2[0] * Math.PI / 180,
@@ -639,24 +636,30 @@ var MapManager = /** @class */ (function () {
       c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
     return R * c;
   };
-  MapManager.prototype.normalize = function (x, y, map_dict) {
-    var n_x = (x - map_dict.min_x) / (map_dict.max_x - map_dict.min_x),
-      n_y = (y - map_dict.min_y) / (map_dict.max_y - map_dict.min_y);
-    return [n_x * 1000 - map_dict.width / 2,
-            n_y * 1000 - map_dict.depth / 2];
-  };
+  MapManager.prototype.convertToLocalCoordinates =
+    function (latitude, longitude, altitude) {
+      var map_info = this.map_info,
+        x = this.longitudToX(longitude),
+        y = this.latitudeToY(latitude);
+      return {
+        x: ((x - map_info.min_x) / (map_info.max_x - map_info.min_x)) *
+          1000 - map_info.width / 2,
+        y: ((y - map_info.min_y) / (map_info.max_y - map_info.min_y)) *
+          1000 - map_info.depth / 2,
+        z: altitude
+      };
+    };
   MapManager.prototype.convertToGeoCoordinates = function (x, y, z) {
-    var map_dict = this.map_info,
-      lon = x + map_dict.width / 2,
-      lat = y + map_dict.depth / 2;
+    var lon = x + this.map_info.width / 2,
+      lat = y + this.map_info.depth / 2;
     lon = lon / 1000;
-    lon = lon * (map_dict.max_x - map_dict.min_x) +
-      map_dict.min_x;
-    lon = lon / (map_dict.width / 360.0) - 180;
+    lon = lon * (this.map_info.max_x - this.map_info.min_x) +
+      this.map_info.min_x;
+    lon = lon / (this.map_info.map_size / 360.0) - 180;
     lat = lat / 1000;
-    lat = lat * (map_dict.max_y - map_dict.min_y) +
-      map_dict.min_y;
-    lat = 90 - lat / (map_dict.depth / 180.0);
+    lat = lat * (this.map_info.max_y - this.map_info.min_y) +
+      this.map_info.min_y;
+    lat = 90 - lat / (this.map_info.map_size / 180.0);
     return {
       x: lat,
       y: lon,
@@ -676,7 +679,7 @@ var GameManager = /** @class */ (function () {
   "use strict";
   // *** CONSTRUCTOR ***
   function GameManager(canvas, game_parameters_json) {
-    var drone, header_list, drone_count;
+    var drone, header_list, drone_count, i;
     this._canvas = canvas;
     this._canvas_width = canvas.width;
     this._canvas_height = canvas.height;
@@ -737,7 +740,7 @@ var GameManager = /** @class */ (function () {
       console.log = function () {
         baseLogFunction.apply(console, arguments);
         var args = Array.prototype.slice.call(arguments);
-        for (var i = 0;i < args.length;i++) {
+        for (i = 0;i < args.length;i++) {
           console_log += args[i] + "\n";
         }
       };
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.xml b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.xml
index 8badaa2df1a903c1ae7a6d8d7f813de647ca4a56..d5c4b8976bc4bc3394a7a45b27aae4ac3ff16a8d 100644
--- a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.xml
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/drone_capture_flag_logic_js.xml
@@ -246,7 +246,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>1010.5086.1058.34440</string> </value>
+                      <value> <string>1010.22324.3760.41318</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -266,7 +266,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1690567567.2</float>
+                              <float>1691601869.17</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_css.css b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_css.css
new file mode 100644
index 0000000000000000000000000000000000000000..cc66a4eb79868484bfb5b4c2f709b437058ac310
--- /dev/null
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_css.css
@@ -0,0 +1,62 @@
+/* DOCUMENTATION */
+
+.documentation p {
+  margin: 10px 0;
+  font-family: monospace;
+  color: #263238;
+  line-height: 18px;
+}
+.documentation pre {
+  line-height: 18px;
+  font-family: monospace;
+}
+.documentation h1 {
+  margin: 0 0 30px 0;
+  font-size: 2.3em;
+}
+.documentation h3 {
+  margin: 0 0 15px 0;
+  font-size: 1.6em;
+}
+.documentation h4 {
+  margin-top: 20px;
+}
+.documentation h5 {
+  font-weight: bold;
+}
+.documentation h4,
+.documentation h5 {
+  margin: 0;
+}
+
+.documentation .line {
+    width: 100%;
+    height: 1px;
+    background-color: lightgrey;
+    margin: 30px 0;
+}
+
+.documentation .item-param-1,
+.documentation .item-param-2 {
+    width: 25%;
+    display: inline-block;
+}
+
+.item-name {
+  background-color: #F8F8F8;
+  padding: 8px;
+  margin: 8px 0;
+  font-size: 1.2em; }
+
+.item-name span:first-of-type {
+  font-weight: bold; }
+
+.item-name span:last-of-type {
+  font-style: italic; }
+
+
+.line {
+  width: 100%;
+  height: 1px;
+  background-color: lightgrey;
+  margin: 30px 0; }
\ No newline at end of file
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_css.xml b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_css.xml
new file mode 100644
index 0000000000000000000000000000000000000000..004df63661c2dc8ba384fc9212d8541215cdc2ae
--- /dev/null
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_css.xml
@@ -0,0 +1,344 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Web Style" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_Access_contents_information_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Add_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Change_local_roles_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Modify_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_View_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_md5</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>gadget_erp5_page_drone_capture_flag_api_page.css</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>ojs_drone_capture_flag_API_page_css</string> </value>
+        </item>
+        <item>
+            <key> <string>language</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>short_title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Drone Capture Flag API Page CSS</string> </value>
+        </item>
+        <item>
+            <key> <string>version</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>workflow_history</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>document_publication_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>edit_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>processing_status_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>publish_alive</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>actor</string> </key>
+                      <value> <unicode>zope</unicode> </value>
+                  </item>
+                  <item>
+                      <key> <string>comment</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>error_message</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>time</string> </key>
+                      <value>
+                        <object>
+                          <klass>
+                            <global name="_reconstructor" module="copy_reg"/>
+                          </klass>
+                          <tuple>
+                            <global name="DateTime" module="DateTime.DateTime"/>
+                            <global name="object" module="__builtin__"/>
+                            <none/>
+                          </tuple>
+                          <state>
+                            <tuple>
+                              <float>1691176318.47</float>
+                              <string>UTC</string>
+                            </tuple>
+                          </state>
+                        </object>
+                      </value>
+                  </item>
+                  <item>
+                      <key> <string>validation_state</string> </key>
+                      <value> <string>published_alive</string> </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>edit</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>actor</string> </key>
+                      <value> <unicode>zope</unicode> </value>
+                  </item>
+                  <item>
+                      <key> <string>comment</string> </key>
+                      <value>
+                        <none/>
+                      </value>
+                  </item>
+                  <item>
+                      <key> <string>error_message</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>serial</string> </key>
+                      <value> <string>1010.15231.63877.58538</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>state</string> </key>
+                      <value> <string>current</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>time</string> </key>
+                      <value>
+                        <object>
+                          <klass>
+                            <global name="_reconstructor" module="copy_reg"/>
+                          </klass>
+                          <tuple>
+                            <global name="DateTime" module="DateTime.DateTime"/>
+                            <global name="object" module="__builtin__"/>
+                            <none/>
+                          </tuple>
+                          <state>
+                            <tuple>
+                              <float>1691176394.73</float>
+                              <string>UTC</string>
+                            </tuple>
+                          </state>
+                        </object>
+                      </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value>
+                        <none/>
+                      </value>
+                  </item>
+                  <item>
+                      <key> <string>actor</string> </key>
+                      <value> <unicode>zope</unicode> </value>
+                  </item>
+                  <item>
+                      <key> <string>comment</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>error_message</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>external_processing_state</string> </key>
+                      <value> <string>empty</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>serial</string> </key>
+                      <value> <string>0.0.0.0</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>time</string> </key>
+                      <value>
+                        <object>
+                          <klass>
+                            <global name="_reconstructor" module="copy_reg"/>
+                          </klass>
+                          <tuple>
+                            <global name="DateTime" module="DateTime.DateTime"/>
+                            <global name="object" module="__builtin__"/>
+                            <none/>
+                          </tuple>
+                          <state>
+                            <tuple>
+                              <float>1691176198.41</float>
+                              <string>UTC</string>
+                            </tuple>
+                          </state>
+                        </object>
+                      </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_html.html b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_html.html
new file mode 100644
index 0000000000000000000000000000000000000000..a1653a50e09dccecc5e752e8ea76d1a4c774f2de
--- /dev/null
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_html.html
@@ -0,0 +1,472 @@
+<html>
+
+  <head>
+      <link rel="stylesheet" type="text/css" href="gadget_erp5_page_drone_capture_flag_api_page.css">
+      <script src="gadget_erp5_page_drone_capture_flag_api_page.js"></script>
+      <title>Drone API Documentation</title>
+  </head>
+
+  <body>
+
+    <div class="documentation">
+
+      <h1>Fixed Wings Drone API</h1>
+
+      <h3>API functions</h3>
+
+      <h3>Functions called by game on event</h3>
+
+      <!-- Start -->
+      <h4 class="item-name" id="start"><span>onStart</span><span>: void</span></h4>
+      <p class="item-descr">Function called on game start.</p>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.onStart = function() {<br>
+        &nbsp;&nbsp;//one time execution code<br>
+        }
+      </p>
+
+      <div class="line"></div>
+
+      <!-- Update -->
+      <h4 class="item-name" id="update"><span>onUpdate</span><span>: void</span></h4>
+      <p class="item-descr">Function called on game update, 60 times / second. <br></p>
+
+      <div>
+        <h5 class="item-param-1">Param</h5>
+        <h5 class="item-param-2">Description</h5>
+      </div>
+
+      <div>
+        <p class="item-param-1">timestamp: Integer</p>
+        <p class="item-param-2">Timestamp in milliseconds from UNIX epoch</p>
+      </div>
+
+      <h5 class="item-param-1">Example</h5>
+
+      <p class="item-example">me.onUpdate = function() {<br>
+        &nbsp;&nbsp;//code executed 60 times per second<br>
+        }
+      </p>
+
+      <div class="line"></div>
+
+      <!-- Touched -->
+      <h4 class="item-name" id="touched"><span>onTouched</span><span>: void</span></h4>
+      <p class="item-descr">Function called when drone is touched by another drone.</p>
+
+      <h5 class="item-param-1">Example</h5>
+
+      <p class="item-example">me.onTouched = function() {<br>
+        &nbsp;&nbsp;//code executed when drone is touched<br>
+        }
+      </p>
+
+      <h5 class="item-param-1">Drones collision</h5>
+
+      <p class="item-example">
+        The collision between 2 drones is determined by a calculation based on each drone direction, exact position and collision angle, and resolves if one drone bumps the other of if both drones are set down.
+        <br><br>
+        The simulator engine checks if the drone control masks intersect, and then based on drones directions it calculates the collision angle between them. If the angle is too wide, both drones will fall. If not, the fastest drone will knockdown聽the slowest one.
+        <br><br>
+        The drone mask size is 0.5 x 0.5 (meters)
+      </p>
+
+      <div class="line"></div>
+
+      <!-- onDroneViewInfo -->
+      <h4 class="item-name" id="update"><span>onDroneViewInfo</span><span>: void</span></h4>
+      <p class="item-descr">Function called when a fired detection process finishes.<br>
+        (a detection process is started when a drone calls getDroneViewInfo method, see below)<br>
+      </p>
+
+      <div>
+        <h5 class="item-param-1">Param</h5>
+        <h5 class="item-param-2">Description</h5>
+      </div>
+
+      <div>
+        <p class="item-param-1">drone_view: dict</p>
+        <p class="item-param-2">Result of detection.</p>
+      </div>
+
+      <h5 class="item-param-1">Example</h5>
+      <p class="item-example">
+        me.getDroneViewInfo = function (drone_view) {<br>
+        &nbsp;&nbsp;//code executed when getDroneViewInfo finished<br>
+        }
+      </p>
+
+      <div class="line"></div>
+
+      <!-- GetMsg -->
+      <h4 class="item-name" id="getMsg"><span>onGetMsg</span><span>: void</span></h4>
+      <p class="item-descr">Function called when drone receives a message.</p>
+
+      <div>
+        <h5 class="item-param-1">Param</h5>
+        <h5 class="item-param-2">Description</h5>
+      </div>
+
+      <div>
+        <p class="item-param-1">msg: String</p>
+        <p class="item-param-2">Content of the message</p>
+      </div>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <div>
+        <p class="item-param-1">me.onGetMsg = function (msg) {<br>
+          &nbsp;&nbsp;//process the msg
+          <br> }
+        </p>
+      </div>
+
+      <div class="line"></div>
+
+      <h3>Function that drones can call</h3>
+
+      <div class="line"></div>
+
+      <!-- sendMsg -->
+      <h4 class="item-name" id="sendMsg"><span>sendMsg</span><span>: void</span></h4>
+      <p class="item-descr">Sends a message to another drone (or to all team drones).<p>
+
+      <div>
+        <h5 class="item-param-1">Param</h5>
+        <h5 class="item-param-2">Description</h5>
+      </div>
+
+      <div>
+        <p class="item-param-1">msg: String</p>
+        <p class="item-param-2">The message to send.</p>
+      </div>
+
+      <div>
+        <p class="item-param-1">id ?: Number</p>
+        <p class="item-param-2">ID of the recipient. Leave empty to send to all team drones.</p>
+      </div>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <div>
+        <p class="item-example">
+          me.sendMsg("My broadcast message");<br>
+          me.sendMsg("To my friend 0", 0);
+        </p>
+      </div>
+
+      <div class="line"></div>
+
+      <!-- getCurrentPosition -->
+      <h4 class="item-name" id="getCurrentPosition"><span>getCurrentPosition</span><span>: dictionary</span></h4>
+      <p class="item-descr">
+        Get drone current position geo-coordinates.<br>
+        {<br>
+        &nbsp;&nbsp;x: number, //latitude (in degrees)<br>
+        &nbsp;&nbsp;y: number, //longitude (in degrees)<br>
+        &nbsp;&nbsp;z: number  //altitude (in meters)<br>
+        }<br>
+      </p>
+
+      <h5 class="item-param-1">Example</h5>
+
+      <p class="item-example">
+        var current_position = me.getCurrentPosition();<br>
+        console.log(current_position);<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- getDroneViewInfo -->
+      <h4 class="item-name" id="getDroneViewInfo"><span>getDroneViewInfo</span><span>: void</span></h4>
+      <p class="item-descr">
+        By calling this method, the drone detection process is fired. It will get all the view information within its scope.<br>
+        Once the detection finishes (2 seconds) the event method onDroneViewInfo will be called.<br>
+      </p>
+
+      <h5 class="item-param-1">Example</h5>
+
+      <p class="item-example">
+        if (!me.ongoing_detection) {<br>
+        &nbsp;&nbsp;me.ongoing_detection = true;<br>
+        &nbsp;&nbsp;me.getDroneViewInfo();<br>
+        &nbsp;&nbsp;me.ongoing_detection = true;<br>
+        }<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- setTargetCoordinates -->
+      <h4 class="item-name" id="setTargetCoordinates"><span>setTargetCoordinates</span><span>: dictionary</span></h4>
+      <p class="item-descr">
+        Set a target point expressed in geo coordinates. The drone will move straight to this point.
+      </p>
+
+      <div>
+        <h5 class="item-param-1">Param</h5>
+        <h5 class="item-param-2">Description</h5>
+      </div>
+
+      <div>
+        <p class="item-param-1">X: Float</p>
+        <p class="item-param-2">X value - latitude (in degrees).</p>
+      </div>
+      <div>
+        <p class="item-param-1">Y: Float</p>
+        <p class="item-param-2">Y value - longitude (in degrees).</p>
+      </div>
+      <div>
+        <p class="item-param-1">Z: Float</p>
+        <p class="item-param-2">Z value - altitude (in meters).</p>
+      </div>
+
+      <div>
+      <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <div>
+        <p class="item-example">
+          me.setTargetCoordinates(lat, lon, altitude);<br>
+        </p>
+      </div>
+
+      <div class="line"></div>
+
+      <!-- setSpeed -->
+      <h4 class="item-name" id="setSpeed"><span>setSpeed</span><span>: void</span></h4>
+      <p class="item-descr">Set the drone speed in meters/second. The drone will move at the given value.</p>
+
+      <div>
+        <h5 class="item-param-1">Param</h5>
+        <h5 class="item-param-2">Description</h5>
+      </div>
+
+      <div>
+        <p class="item-param-1">altitude: Float</p>
+        <p class="item-param-2">Speed value</p>
+      </div>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.setSpeed(16);<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- loiter -->
+      <h4 class="item-name" id="loiter"><span>loiter</span><span>: void</span></h4>
+      <p class="item-descr">Set the drone to loiter mode, it will loiter around last target coordinates.</p>
+
+      <div>
+        <h5 class="item-param-1">Param</h5>
+        <h5 class="item-param-2">Description</h5>
+      </div>
+
+      <div>
+        <p class="item-param-1">altitude: Float</p>
+        <p class="item-param-2">altitude value</p>
+      </div>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.loiter(100);<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- exit -->
+      <h4 class="item-name" id="exit"><span>exit</span><span>: void</span></h4>
+      <p class="item-descr">Finishes the drone flight.</p>
+
+      <div>
+        <h5 class="item-param-1">Param</h5>
+        <h5 class="item-param-2">Description</h5>
+      </div>
+
+      <div>
+        <p class="item-param-1">exit_code: Integer</p>
+        <p class="item-param-2">Code to indicate exit status.</p>
+      </div>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.exit(0);<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- triggerParachute -->
+      <h4 class="item-name" id="triggerParachute"><span>triggerParachute</span><span>: void</span></h4>
+      <p class="item-descr">Indicates the drone to deploy the parachute to finish the landing.</p>
+
+      <div>
+        <h5 class="item-param-1">Param</h5>
+        <h5 class="item-param-2">Description</h5>
+      </div>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.doParachute();<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- landed -->
+      <h4 class="item-name" id="landed"><span>landed</span><span>: boolean</span></h4>
+      <p class="item-descr">Indicates if the drone has landed (reached the floor altitude).</p>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-example">
+        if (me.landed()) {<br>
+        &nbsp;&nbsp;//do something<br>
+        }<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- getInitialAltitude -->
+      <h4 class="item-name" id="getInitialAltitude"><span>getInitialAltitude</span><span>: Float</span></h4>
+      <p class="item-descr">Get drone startup altitude.</p>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.getInitialAltitude();<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- getYaw -->
+      <h4 class="item-name" id="getYaw"><span>getYaw</span><span>: Float</span></h4>
+      <p class="item-descr">Get drone yaw angle (angle between north and the projection of the aircraft longitudinal axis onto the horizontal plane, see https://en.wikipedia.org/wiki/Aircraft_flight_dynamics) in degrees (value is in [-180; 180]).<br>
+        Yaw angle can be different of heading (angle between north and the horizontal component of the velocity vector, which describes which direction the aircraft is moving relative to cardinal directions) when there is wind.<br>
+      </p>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.getYaw();<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- getSpeed -->
+      <h4 class="item-name" id="getSpeed"><span>getSpeed</span><span>: Float</span></h4>
+      <p class="item-descr">Get drone air speed in meters/second.</p>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.getSpeed();<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- getGroundSpeed -->
+      <h4 class="item-name" id="getGroundSpeed"><span>getGroundSpeed</span><span>: Float</span></h4>
+      <p class="item-descr">Get drone ground speed in meters/second.</p>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.getGroundSpeed();<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- getClimbRate -->
+      <h4 class="item-name" id="getClimbRate"><span>getClimbRate</span><span>: Float</span></h4>
+      <p class="item-descr">Get drone climb rate in meters/second.</p>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.getClimbRate();<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- getSinkRate -->
+      <h4 class="item-name" id="getSinkRate"><span>getSinkRate</span><span>: Float</span></h4>
+      <p class="item-descr">Get drone sink rate in meters/second.</p>
+
+      <div>
+        <h5 class="item-param-1">Example</h5>
+      </div>
+
+      <p class="item-param-1">me.getSinkRate();<br>
+      </p>
+
+      <div class="line"></div>
+
+      <h3>Drone properties</h3>
+
+      <div class="line"></div>
+
+      <!-- id -->
+      <h4 class="item-name" id="id"><span>id</span><span>: number</span></h4>
+      <p class="item-descr">Drone unique numeric identifier: from 0 to 9.</p>
+
+      <h5 class="item-param-1">Example</h5>
+
+      <p class="item-example">
+        var drone_id = me.id;<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!-- drone_dict -->
+      <h4 class="item-name" id="id"><span>drone_dict</span><span>: dictionary</span></h4>
+      <p class="item-descr">Access drones information dictionary. It contains one entry per drone:<br>
+        key-id: value-drone_dict<br>
+        {<br>
+          latitude: number, //latitude (in degrees)<br>
+          longitude: number, //longitude (in degrees)<br>
+          altitudeAbs: number  //altitude (in meters)<br>
+        }<br>
+      </p>
+
+      <h5 class="item-param-1">Example</h5>
+
+      <p class="item-example">
+        var leader = me.drone_dict[LEADER_ID];<br>
+        console.log("leader latitude:", leader.latitude);<br>
+        console.log("leader longitude:", leader.longitude);<br>
+        console.log("leader absolute altitude:", leader.altitudeAbs);<br>
+      </p>
+
+      <div class="line"></div>
+
+      <!--<h3 class="category-name">Drone Physics Schema</h3>
+      <center><img src="assets/schema.png"></center>
+
+      <div class="line"></div>-->
+
+    </div>
+
+  </body>
+</html>
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_html.xml b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_html.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5ceb482b01dc1f2fdaa0aed5e42b372d79638575
--- /dev/null
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_html.xml
@@ -0,0 +1,344 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Web Page" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_Access_contents_information_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Add_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Change_local_roles_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Modify_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_View_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_md5</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>text/html</string> </value>
+        </item>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>gadget_erp5_page_drone_capture_flag_api_page.html</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>ojs_drone_capture_flag_API_page_html</string> </value>
+        </item>
+        <item>
+            <key> <string>language</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Web Page</string> </value>
+        </item>
+        <item>
+            <key> <string>short_title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Drone Capture Flag API Page</string> </value>
+        </item>
+        <item>
+            <key> <string>version</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>workflow_history</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>document_publication_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>edit_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>processing_status_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>publish_alive</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>actor</string> </key>
+                      <value> <unicode>zope</unicode> </value>
+                  </item>
+                  <item>
+                      <key> <string>comment</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>error_message</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>time</string> </key>
+                      <value>
+                        <object>
+                          <klass>
+                            <global name="_reconstructor" module="copy_reg"/>
+                          </klass>
+                          <tuple>
+                            <global name="DateTime" module="DateTime.DateTime"/>
+                            <global name="object" module="__builtin__"/>
+                            <none/>
+                          </tuple>
+                          <state>
+                            <tuple>
+                              <float>1691175735.97</float>
+                              <string>UTC</string>
+                            </tuple>
+                          </state>
+                        </object>
+                      </value>
+                  </item>
+                  <item>
+                      <key> <string>validation_state</string> </key>
+                      <value> <string>published_alive</string> </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>edit</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>actor</string> </key>
+                      <value> <unicode>zope</unicode> </value>
+                  </item>
+                  <item>
+                      <key> <string>comment</string> </key>
+                      <value>
+                        <none/>
+                      </value>
+                  </item>
+                  <item>
+                      <key> <string>error_message</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>serial</string> </key>
+                      <value> <string>1010.22088.20940.23517</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>state</string> </key>
+                      <value> <string>current</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>time</string> </key>
+                      <value>
+                        <object>
+                          <klass>
+                            <global name="_reconstructor" module="copy_reg"/>
+                          </klass>
+                          <tuple>
+                            <global name="DateTime" module="DateTime.DateTime"/>
+                            <global name="object" module="__builtin__"/>
+                            <none/>
+                          </tuple>
+                          <state>
+                            <tuple>
+                              <float>1691587714.89</float>
+                              <string>UTC</string>
+                            </tuple>
+                          </state>
+                        </object>
+                      </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>detect_converted_file</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>actor</string> </key>
+                      <value> <unicode>zope</unicode> </value>
+                  </item>
+                  <item>
+                      <key> <string>comment</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>error_message</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>external_processing_state</string> </key>
+                      <value> <string>converted</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>serial</string> </key>
+                      <value> <string>0.0.0.0</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>time</string> </key>
+                      <value>
+                        <object>
+                          <klass>
+                            <global name="_reconstructor" module="copy_reg"/>
+                          </klass>
+                          <tuple>
+                            <global name="DateTime" module="DateTime.DateTime"/>
+                            <global name="object" module="__builtin__"/>
+                            <none/>
+                          </tuple>
+                          <state>
+                            <tuple>
+                              <float>1691175684.28</float>
+                              <string>UTC</string>
+                            </tuple>
+                          </state>
+                        </object>
+                      </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_js.js b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_js.js
new file mode 100644
index 0000000000000000000000000000000000000000..d4dd8f23368dedf0cfef51176decd99ed31cd0c3
--- /dev/null
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_js.js
@@ -0,0 +1,20 @@
+/*global window, rJS*/
+/*jslint indent:2, maxlen: 80, nomen: true */
+(function (window, rJS) {
+  "use strict";
+
+  rJS(window)
+    .declareAcquiredMethod('updateHeader', 'updateHeader')
+    .declareAcquiredMethod('getUrlFor', 'getUrlFor')
+    .declareMethod('render', function () {
+      var gadget = this;
+      return gadget.getUrlFor({'command': 'history_previous'})
+        .push(function (url) {
+          return gadget.updateHeader({
+            page_title: "Drone API Documentation",
+            selection_url: url
+          });
+        });
+    });
+
+}(window, rJS));
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_js.xml b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_js.xml
new file mode 100644
index 0000000000000000000000000000000000000000..09de2b52f17ec45a099a877347c2347da43d087d
--- /dev/null
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_API_page_js.xml
@@ -0,0 +1,346 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="Web Script" module="erp5.portal_type"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_Access_contents_information_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Add_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Change_local_roles_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_Modify_portal_content_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>_View_Permission</string> </key>
+            <value>
+              <tuple>
+                <string>Anonymous</string>
+                <string>Assignee</string>
+                <string>Assignor</string>
+                <string>Associate</string>
+                <string>Auditor</string>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_md5</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>default_reference</string> </key>
+            <value> <string>gadget_erp5_page_drone_capture_flag_api_page.js</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>ojs_drone_capture_flag_API_page_js</string> </value>
+        </item>
+        <item>
+            <key> <string>language</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Web Script</string> </value>
+        </item>
+        <item>
+            <key> <string>short_title</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Drone Capture Flag API Page JS</string> </value>
+        </item>
+        <item>
+            <key> <string>version</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>workflow_history</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="PersistentMapping" module="Persistence.mapping"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>document_publication_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>edit_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>processing_status_workflow</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>publish_alive</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>actor</string> </key>
+                      <value> <unicode>zope</unicode> </value>
+                  </item>
+                  <item>
+                      <key> <string>comment</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>error_message</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>time</string> </key>
+                      <value>
+                        <object>
+                          <klass>
+                            <global name="_reconstructor" module="copy_reg"/>
+                          </klass>
+                          <tuple>
+                            <global name="DateTime" module="DateTime.DateTime"/>
+                            <global name="object" module="__builtin__"/>
+                            <none/>
+                          </tuple>
+                          <state>
+                            <tuple>
+                              <float>1691176000.16</float>
+                              <string>UTC</string>
+                            </tuple>
+                          </state>
+                        </object>
+                      </value>
+                  </item>
+                  <item>
+                      <key> <string>validation_state</string> </key>
+                      <value> <string>published_alive</string> </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>edit</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>actor</string> </key>
+                      <value> <unicode>zope</unicode> </value>
+                  </item>
+                  <item>
+                      <key> <string>comment</string> </key>
+                      <value>
+                        <none/>
+                      </value>
+                  </item>
+                  <item>
+                      <key> <string>error_message</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>serial</string> </key>
+                      <value> <string>1010.15227.26072.45243</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>state</string> </key>
+                      <value> <string>current</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>time</string> </key>
+                      <value>
+                        <object>
+                          <klass>
+                            <global name="_reconstructor" module="copy_reg"/>
+                          </klass>
+                          <tuple>
+                            <global name="DateTime" module="DateTime.DateTime"/>
+                            <global name="object" module="__builtin__"/>
+                            <none/>
+                          </tuple>
+                          <state>
+                            <tuple>
+                              <float>1691176057.3</float>
+                              <string>UTC</string>
+                            </tuple>
+                          </state>
+                        </object>
+                      </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_log</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>action</string> </key>
+                      <value> <string>detect_converted_file</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>actor</string> </key>
+                      <value> <unicode>zope</unicode> </value>
+                  </item>
+                  <item>
+                      <key> <string>comment</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>error_message</string> </key>
+                      <value> <string></string> </value>
+                  </item>
+                  <item>
+                      <key> <string>external_processing_state</string> </key>
+                      <value> <string>converted</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>serial</string> </key>
+                      <value> <string>0.0.0.0</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>time</string> </key>
+                      <value>
+                        <object>
+                          <klass>
+                            <global name="_reconstructor" module="copy_reg"/>
+                          </klass>
+                          <tuple>
+                            <global name="DateTime" module="DateTime.DateTime"/>
+                            <global name="object" module="__builtin__"/>
+                            <none/>
+                          </tuple>
+                          <state>
+                            <tuple>
+                              <float>1691175985.71</float>
+                              <string>UTC</string>
+                            </tuple>
+                          </state>
+                        </object>
+                      </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_panel_js.js b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_panel_js.js
index d13d07715498685a7af8548e774d2849c95dbda5..4eaba1251b1b490eb96c9dab13b04260ffee9fdc 100644
--- a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_panel_js.js
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_panel_js.js
@@ -156,11 +156,13 @@
           .push(function () {
             return RSVP.hash({
               url_list: gadget.getUrlForList([
-                {command: 'display', options: {page: "drone_capture_flag_script_page"}}
+                {command: 'display', options: {page: "drone_capture_flag_script_page"}},
+                {command: 'display', options: {page: "drone_capture_flag_api_page"}}
               ]),
               translation_list: gadget.getTranslationList([
                 'Editable',
-                'Run Game'
+                'Run Game',
+                'API documentation'
               ])
             });
           })
@@ -168,7 +170,8 @@
             var editable_value = [],
               element_list = [],
               icon_and_key_list = [
-                'puzzle-piece', null
+                'puzzle-piece', null,
+                'paperclip', null
               ];
 
             for (i = 0; i < result_dict.url_list.length; i += 1) {
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_panel_js.xml b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_panel_js.xml
index 0a3f0c70ffeff7d39a7b5542a479949af0bd54ff..633a2523454c4c9d1daed90378d2e9ea3a26165f 100644
--- a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_panel_js.xml
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_panel_js.xml
@@ -256,7 +256,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1682444688.11</float>
+                              <float>1691175603.36</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_script_page_js.js b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_script_page_js.js
index a09bf696a788125a308cf6a9d4d0d3c80ed03fd5..24a0b92546daf7fda0bb8fadb017c415ad0d9cd7 100644
--- a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_script_page_js.js
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_script_page_js.js
@@ -6,7 +6,16 @@
   //Drone default values - TODO: get them from the drone API
   var SIMULATION_SPEED = 10,
     SIMULATION_TIME = 270,
-    MAP_SIZE = 600,
+    //HARDCODED map size: it is defined by min-max lat-lon distance
+    //this is done by the map manager (latLonDistance)
+    //but map_size is needed here for map randomization (location of objects)
+    //TODO refactor: or randomization is moved to map manager (seed as param)
+    //or randomization is done here but with geo-coordinates (not meters)
+    MAP_SIZE = 902,
+    min_lat = 45.6475,
+    max_lat = 45.65,
+    min_lon = 14.265,
+    max_lon = 14.2766,
     map_height = 700,
     start_AMSL = 595,
     DEFAULT_SPEED = 16,
@@ -291,7 +300,7 @@
                   "hidden": 0,
                   "type": "FloatField"
                 },
-                "my_map_size": {
+                /*"my_map_size": {
                   "description": "",
                   "title": "Map size",
                   "default": MAP_SIZE,
@@ -301,7 +310,7 @@
                   "key": "map_size",
                   "hidden": 0,
                   "type": "FloatField"
-                },
+                },*/
                 "my_start_AMSL": {
                   "description": "",
                   "title": "Start AMSL",
@@ -380,7 +389,7 @@
               group_list: [[
                 "left",
                 [["my_simulation_speed"], ["my_simulation_time"], ["my_number_of_drones"],
-                 ["my_map_size"], ["my_map_height"],// ["my_flag_weight"],
+                 /*["my_map_size"], */["my_map_height"],// ["my_flag_weight"],
                  ["my_start_AMSL"], ["my_map_seed"]]
               ], [
                 "right",
@@ -407,6 +416,7 @@
       var gadget = this, i,
         fragment = gadget.element.querySelector('.simulator_div'),
         game_parameters_json, map_json;
+      options.map_size = MAP_SIZE;
       DRONE_LIST = [];
       fragment = domsugar(gadget.element.querySelector('.simulator_div'),
                               [domsugar('div')]).firstElementChild;
@@ -429,8 +439,7 @@
         var seed_value = options.map_seed,
           random_seed = new Math.seedrandom(seed_value), i,
           n_enemies = randomIntFromInterval(5, 10, random_seed),
-          n_flags = randomIntFromInterval(Math.floor(DRONE_LIST.length / 2),
-                                          DRONE_LIST.length, random_seed),
+          n_flags = randomIntFromInterval(5, 10, random_seed),
           n_obstacles = randomIntFromInterval(5, 15, random_seed),
           flag_list = [], obstacle_list = [], enemy_list = [], random_position,
           obstacles_types = ["box"/*, "sphere"*/, "cylinder"], type,
@@ -511,6 +520,10 @@
         "map_size": parseFloat(options.map_size),
         "height": parseInt(options.map_height, 10),
         "start_AMSL": parseFloat(options.start_AMSL),
+        "min_lat": parseFloat(min_lat),
+        "max_lat": parseFloat(max_lat),
+        "min_lon": parseFloat(min_lon),
+        "max_lon": parseFloat(max_lon),
         "flag_list": [],
         "obstacle_list" : [],
         "drones": {
diff --git a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_script_page_js.xml b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_script_page_js.xml
index e577a837a4405c956cc862fba0497fb06d2e3c99..a608139669da6b8ee3143f2e3917ed7dd2a1be6d 100644
--- a/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_script_page_js.xml
+++ b/bt5/erp5_officejs_drone_capture_flag/PathTemplateItem/web_page_module/ojs_drone_capture_flag_script_page_js.xml
@@ -246,7 +246,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>1009.57725.14056.1911</string> </value>
+                      <value> <string>1010.22334.20227.40840</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -266,7 +266,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1689793877.59</float>
+                              <float>1691602475.06</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_officejs_drone_capture_flag/SkinTemplateItem/portal_skins/erp5_officejs_drone_capture_flag/WebSection_getDroneCaptureFlagPrecacheManifestList.py b/bt5/erp5_officejs_drone_capture_flag/SkinTemplateItem/portal_skins/erp5_officejs_drone_capture_flag/WebSection_getDroneCaptureFlagPrecacheManifestList.py
index 30c5ce6924cec0587c486b67709056d1c25cba1d..ea75e32ffd7e08131a139f9ff09487dfb6a019c8 100644
--- a/bt5/erp5_officejs_drone_capture_flag/SkinTemplateItem/portal_skins/erp5_officejs_drone_capture_flag/WebSection_getDroneCaptureFlagPrecacheManifestList.py
+++ b/bt5/erp5_officejs_drone_capture_flag/SkinTemplateItem/portal_skins/erp5_officejs_drone_capture_flag/WebSection_getDroneCaptureFlagPrecacheManifestList.py
@@ -8,6 +8,9 @@ url_list = [
   "gadget_erp5_panel_drone_capture_flag.js",
   "gadget_erp5_page_drone_capture_flag_fixedwingdrone.js",
   "gadget_erp5_page_drone_capture_flag_enemydrone.js",
+  "gadget_erp5_page_drone_capture_flag_api_page.html",
+  "gadget_erp5_page_drone_capture_flag_api_page.js",
+  "gadget_erp5_page_drone_capture_flag_api_page.css",
   "assets/map/terrain.jpg",
   "assets/map/map.babylon",
   "assets/drone/drone.babylon",
diff --git a/bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/web_page_module/test_capture_drone_flight_js.js b/bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/web_page_module/test_capture_drone_flight_js.js
index bf2c00551b76c1255313169caf2f0e3460dc24ce..8a58fcec59278e6bd17d5b7a2cee7b8a2fe88a7c 100644
--- a/bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/web_page_module/test_capture_drone_flight_js.js
+++ b/bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/web_page_module/test_capture_drone_flight_js.js
@@ -5,7 +5,11 @@
 
   var SIMULATION_SPEED = 10,
     SIMULATION_TIME = 270,
-    MAP_SIZE = 600,
+    MAP_SIZE = 1905,
+    min_lat = 45.6364,
+    max_lat = 45.65,
+    min_lon = 14.2521,
+    max_lon = 14.2766,
     map_height = 700,
     start_AMSL = 595,
     DEFAULT_SPEED = 16,
@@ -109,6 +113,10 @@
         "map_size": parseFloat(MAP_SIZE),
         "height": parseInt(map_height, 10),
         "start_AMSL": parseFloat(start_AMSL),
+        "min_lat": parseFloat(min_lat),
+        "max_lat": parseFloat(max_lat),
+        "min_lon": parseFloat(min_lon),
+        "max_lon": parseFloat(max_lon),
         "flag_list": [{
           "position": {
             "x": -27,
diff --git a/bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/web_page_module/test_capture_drone_flight_js.xml b/bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/web_page_module/test_capture_drone_flight_js.xml
index 991721a21162a380146d981b3b7e0932a8d08c48..e6cf0cfb253a032ce4486d2dc1e30f8bb819b480 100644
--- a/bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/web_page_module/test_capture_drone_flight_js.xml
+++ b/bt5/erp5_officejs_drone_capture_flag_test/PathTemplateItem/web_page_module/test_capture_drone_flight_js.xml
@@ -246,7 +246,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>1010.10600.362.51182</string> </value>
+                      <value> <string>1010.22211.26359.65484</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -266,7 +266,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1690983490.56</float>
+                              <float>1691595104.74</float>
                               <string>UTC</string>
                             </tuple>
                           </state>