Index: core/src/main/java/quickfix/SessionState.java =================================================================== --- core/src/main/java/quickfix/SessionState.java (revision 923) +++ core/src/main/java/quickfix/SessionState.java (working copy) @@ -105,7 +105,8 @@ public boolean isHeartBeatNeeded() { long millisSinceLastSentTime = SystemTime.currentTimeMillis() - getLastSentTime(); - return millisSinceLastSentTime >= getHeartBeatMillis() && getTestRequestCounter() == 0; + // allow 10 ms leeway since exact comparison causes skipped heartbeats occasionally + return millisSinceLastSentTime + 10 > getHeartBeatMillis() && getTestRequestCounter() == 0; } public boolean isInitiator() {