diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/FileFilterDefinitionElement.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/FileFilterDefinitionElement.java
index 9af726a48552dc07b1fce7cc930ba0a45b153dd4..cbeedac7eb86b9b963f32c589ae090667e2469f8 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/FileFilterDefinitionElement.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/FileFilterDefinitionElement.java
@@ -1,5 +1,6 @@
 package net.i2p.i2ptunnel.access;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import java.io.File;
@@ -18,6 +19,7 @@ import net.i2p.data.Hash;
 class FileFilterDefinitionElement extends FilterDefinitionElement {
 
     private final File file;
+    private final Map<Hash, DestTracker> lastLoaded = new HashMap<>();
     private volatile long lastLoading;
 
     /**
@@ -31,18 +33,36 @@ class FileFilterDefinitionElement extends FilterDefinitionElement {
 
     @Override
     public void update(Map<Hash, DestTracker> map) throws IOException {
-        if (!(file.exists() && file.isFile() && file.lastModified() > lastLoading))
+        if (!(file.exists() && file.isFile()))
             return;
+        if (file.lastModified() <= lastLoading) {
+            synchronized (lastLoaded) {
+                for (Map.Entry<Hash, DestTracker> entry : lastLoaded.entrySet()) {
+                    if (!map.containsKey(entry.getKey()))
+                        map.put(entry.getKey(),entry.getValue());
+                }
+            }
+            return;
+        }
+
         lastLoading = System.currentTimeMillis();
-        BufferedReader reader = null; 
+        synchronized (lastLoaded) {
+            lastLoaded.clear();
+        }
+
+        BufferedReader reader = null;
         try {
-            reader = new BufferedReader(new FileReader(file)); 
+            reader = new BufferedReader(new FileReader(file));
             String b32;
             while((b32 = reader.readLine()) != null) {
                 Hash hash = fromBase32(b32);
                 if (map.containsKey(hash))
                     continue;
-                map.put(hash, new DestTracker(hash, threshold));
+                DestTracker newTracker = new DestTracker(hash, threshold);
+                map.put(hash, newTracker);
+                synchronized (lastLoaded) {
+                    lastLoaded.put(hash, newTracker);
+                }
             }
         } catch (InvalidDefinitionException bad32) {
             throw new IOException("invalid access list entry", bad32);