diff --git a/server/trackdirect/TrackDirectDataCollector.py b/server/trackdirect/TrackDirectDataCollector.py
index 56188c9ae51d899a649b528c4054aacb3e2bcaa1..cea4ebd3f25e33c4da0a8c7a8e8105c0bfdaba80 100644
--- a/server/trackdirect/TrackDirectDataCollector.py
+++ b/server/trackdirect/TrackDirectDataCollector.py
@@ -78,6 +78,7 @@ class TrackDirectDataCollector():
         connection = AprsISConnection(
             self.callsign, self.passcode, self.sourceHostname, self.sourcePort)
         connection.setFrequencyLimit(self.hardFrequencyLimit)
+        connection.setSourceId(self.sourceId)
 
         def onPacketRead(line):
             if (not reactor.running):
@@ -246,7 +247,14 @@ class TrackDirectDataCollector():
             Boolean
         """
         if (packet.mapId in [1, 5, 7, 9] and packet.isMoving == 1):
-            if (packet.timestamp - int(self.frequencyLimit) < packet.markerPrevPacketTimestamp):
+            frequencyLimitToApply = int(self.frequencyLimit)
+
+            if (packet.ogn is not None and packet.ogn.ognTurnRate is not None):
+                turnRate = abs(float(packet.ogn.ognTurnRate))
+                if (turnRate > 0) :
+                    frequencyLimitToApply = int(frequencyLimitToApply / (1+turnRate))
+
+            if ((packet.timestamp - frequencyLimitToApply) < packet.markerPrevPacketTimestamp):
                 # This station is sending faster than config limit
                 return True
 
diff --git a/server/trackdirect/parser/AprsISConnection.py b/server/trackdirect/parser/AprsISConnection.py
index 7cda20c74b9f0b9667cf6056c27e42b6b5ebbae2..d4613f6a11257c1c7ad1ff25498196815fc3010a 100644
--- a/server/trackdirect/parser/AprsISConnection.py
+++ b/server/trackdirect/parser/AprsISConnection.py
@@ -5,6 +5,7 @@ import collections
 import psycopg2
 import datetime
 import time
+import re
 
 
 class AprsISConnection(aprslib.IS):
@@ -25,6 +26,7 @@ class AprsISConnection(aprslib.IS):
         self.logger = logging.getLogger("aprslib.IS")
         self.frequencyLimit = None
         self.stationHashTimestamps = {}
+        self.sourceId = 1
 
     def setFrequencyLimit(self, frequencyLimit):
         """Set frequency limit
@@ -42,6 +44,14 @@ class AprsISConnection(aprslib.IS):
         """
         return self.frequencyLimit
 
+    def setSourceId(self, sourceId):
+        """Set what source packet is from (APRS, CWOP ...)
+
+        Args:
+            sourceId (int):  Id that corresponds to id in source-table
+        """
+        self.sourceId = sourceId
+
     def filteredConsumer(self, callback, blocking=True, raw=False):
         """The filtered consume method
 
@@ -86,11 +96,22 @@ class AprsISConnection(aprslib.IS):
             except:
                 return False
 
+            # Try to find turn rate and reduce frequency limit if high turn rate
+            frequencyLimitToApply = int(self.frequencyLimit)
+            if (self.sourceId == 5) :
+                match = re.search("(\+|\-)(\d\.\d)rot ", line)
+                try:
+                    turnRate = abs(float(match.group(2)))
+                    if (turnRate > 0) :
+                        frequencyLimitToApply = int(frequencyLimitToApply / (1+turnRate))
+                except:
+                    pass
+
             latestTimestampOnMap = 0
             if (name in self.stationHashTimestamps):
                 latestTimestampOnMap = self.stationHashTimestamps[name]
 
-                if ((int(time.time()) - 1) - int(self.frequencyLimit) < latestTimestampOnMap):
+                if (((int(time.time()) - 1) - frequencyLimitToApply) < latestTimestampOnMap):
                     # This sender is sending faster than config limit
                     return True
             self.stationHashTimestamps[name] = int(time.time()) - 1