diff --git a/libraries/AP_Terrain/AP_Terrain.h b/libraries/AP_Terrain/AP_Terrain.h
index adc63f0a7319dc1b662ab2bbda9ee68060a8b20b..df81003c5326b6fb8355e7fbfe43cbf53a251669 100644
--- a/libraries/AP_Terrain/AP_Terrain.h
+++ b/libraries/AP_Terrain/AP_Terrain.h
@@ -385,6 +385,9 @@ private:
     // next mission command to check
     uint16_t next_mission_index;
 
+    // next mission position to check
+    uint8_t next_mission_pos;
+
     // last time the mission changed
     uint32_t last_mission_change_ms;
 
diff --git a/libraries/AP_Terrain/TerrainMission.cpp b/libraries/AP_Terrain/TerrainMission.cpp
index 45e851de3b2604e95167c538bd21b4a65b8ccb0f..fbb7350c3091749812e76be2cf7535aebe1885df 100644
--- a/libraries/AP_Terrain/TerrainMission.cpp
+++ b/libraries/AP_Terrain/TerrainMission.cpp
@@ -37,6 +37,7 @@ void AP_Terrain::update_mission_data(void)
         last_mission_spacing != grid_spacing) {
         // the mission has changed - start again
         next_mission_index = 1;
+        next_mission_pos = 0;
         last_mission_change_ms = mission.last_change_time_ms();
         last_mission_spacing = grid_spacing;
     }
@@ -47,7 +48,7 @@ void AP_Terrain::update_mission_data(void)
 
     uint16_t pending, loaded;
     get_statistics(pending, loaded);
-    if (pending) {
+    if (pending && ahrs.get_gps().status() >= AP_GPS::GPS_OK_FIX_3D) {
         // wait till we have fully filled the current set of grids
         return;
     }
@@ -72,10 +73,18 @@ void AP_Terrain::update_mission_data(void)
             if (!mission.read_cmd_from_storage(next_mission_index, cmd)) {
                 // nothing more to do
                 next_mission_index = 0;
+                next_mission_pos = 0;
                 return;
             }
         }
 
+        // we will fetch 5 points around the waypoint. Four at 10 grid
+        // spacings away at 45, 135, 225 and 315 degrees, and the
+        // point itself
+        if (next_mission_pos != 4) {
+            location_update(cmd.content.location, 45+90*next_mission_pos, grid_spacing.get() * 10);
+        }
+
         // we have a mission command to check
         float height;
         if (!height_amsl(cmd.content.location, height)) {
@@ -84,12 +93,16 @@ void AP_Terrain::update_mission_data(void)
             return;
         }
 
+        next_mission_pos++;
+        if (next_mission_pos == 5) {
 #if TERRAIN_DEBUG
-        hal.console->printf("checked waypoint %u\n", (unsigned)next_mission_index);
+            hal.console->printf("checked waypoint %u\n", (unsigned)next_mission_index);
 #endif
 
-        // move to next waypoint
-        next_mission_index++;
+            // move to next waypoint
+            next_mission_index++;
+            next_mission_pos = 0;
+        }
     }
 }
 
@@ -112,7 +125,7 @@ void AP_Terrain::update_rally_data(void)
 
     uint16_t pending, loaded;
     get_statistics(pending, loaded);
-    if (pending) {
+    if (pending && ahrs.get_gps().status() >= AP_GPS::GPS_OK_FIX_3D) {
         // wait till we have fully filled the current set of grids
         return;
     }