diff --git a/Tools/Replay/Replay.pde b/Tools/Replay/Replay.pde
index 38ea893c0dbc9c3b1ce5f4a33e6b2d928e8815a3..62b7e16ffe2ee3837b82177079775b5a39d569cf 100644
--- a/Tools/Replay/Replay.pde
+++ b/Tools/Replay/Replay.pde
@@ -49,6 +49,9 @@
 #include <errno.h>
 #include <fenv.h>
 
+#define INT16_MIN -32768
+#define INT16_MAX 32767
+
 #include "LogReader.h"
 
 const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER;
@@ -509,15 +512,15 @@ void loop()
                     innovVT);
 
             // define messages for EKF4 data packet
-            int16_t sqrtvarV = (int16_t)(100*velVar);
-            int16_t sqrtvarP = (int16_t)(100*posVar);
-            int16_t sqrtvarH = (int16_t)(100*hgtVar);
-            int16_t sqrtvarMX = (int16_t)(100*magVar.x);
-            int16_t sqrtvarMY = (int16_t)(100*magVar.y);
-            int16_t sqrtvarMZ = (int16_t)(100*magVar.z);
-            int16_t sqrtvarVT = (int16_t)(100*tasVar);
-            int16_t offsetNorth = (int8_t)(offset.x);
-            int16_t offsetEast = (int8_t)(offset.y);
+            int16_t sqrtvarV = (int16_t)(constrain_float(100*velVar,INT16_MIN,INT16_MAX));
+            int16_t sqrtvarP = (int16_t)(constrain_float(100*posVar,INT16_MIN,INT16_MAX));
+            int16_t sqrtvarH = (int16_t)(constrain_float(100*hgtVar,INT16_MIN,INT16_MAX));
+            int16_t sqrtvarMX = (int16_t)(constrain_float(100*magVar.x,INT16_MIN,INT16_MAX));
+            int16_t sqrtvarMY = (int16_t)(constrain_float(100*magVar.y,INT16_MIN,INT16_MAX));
+            int16_t sqrtvarMZ = (int16_t)(constrain_float(100*magVar.z,INT16_MIN,INT16_MAX));
+            int16_t sqrtvarVT = (int16_t)(constrain_float(100*tasVar,INT16_MIN,INT16_MAX));
+            int16_t offsetNorth = (int8_t)(constrain_float(offset.x,INT16_MIN,INT16_MAX));
+            int16_t offsetEast = (int8_t)(constrain_float(offset.y,INT16_MIN,INT16_MAX));
 
             // print EKF4 data packet
             fprintf(ekf4f, "%.3f %d %d %d %d %d %d %d %d %d %d\n",