diff --git a/TreeCacher/Program.cs b/TreeCacher/Program.cs
index 66a88da2ed5889153ec3fa6d89a80555b37bc1b3..cea029a3e4a7e13185af77bc8934d03684e54bfa 100644
--- a/TreeCacher/Program.cs
+++ b/TreeCacher/Program.cs
@@ -1,5 +1,6 @@
 using System.Numerics;
 using Wander;
+using static System.Net.Mime.MediaTypeNames;
 
 
 while (true)
@@ -31,7 +32,6 @@ public class TreeCacher
         public int numAttempts;
         public int x;
         public int y;
-        public string filepath;
         public float dist;
         public int dx;
         public int dy;
@@ -39,9 +39,11 @@ public class TreeCacher
 
 
     public string folder;
+    public string invalidFolder;
     public int numImages;
     public int numImagesFinished;
     public int numImagesFailed;
+    public int numImagesInvalid;
     public List<string> errorCodes;
 
     public double lat = 52.282842;
@@ -79,16 +81,25 @@ public class TreeCacher
 
     internal void Run()
     {
-        folder = Environment.CurrentDirectory.Combine( "Trees" );
+        folder = Environment.CurrentDirectory.Combine( "Trees" ).NormalizePath();
         if (!Directory.Exists( folder ))
+        {
             Directory.CreateDirectory( folder );
+        }
+        invalidFolder = Environment.CurrentDirectory.Combine( "Trees/Invalid" ).NormalizePath();
+        if (!Directory.Exists( invalidFolder ))
+        {
+            Directory.CreateDirectory( invalidFolder );
+        }
         treeRequests = null;
         numImages    = 0;
         numImagesFailed = 0;
         numImagesFinished = 0;
+        numImagesInvalid = 0;
         client = new HttpClient();
         activeRequests = new List<TreeImageTile>();
         treeRequests = new List<TreeImageTile>();
+        errorCodes = new List<string>();
         CreateRequests();
         while ( true )
         {
@@ -113,7 +124,6 @@ public class TreeCacher
                 var image = new TreeImageTile();
                 image.x = cx -numTilesWide/2 + x;
                 image.y = cy +numTilesTall/2 - y;
-                image.filepath = folder.Combine( $"tree_{zoom}_{image.x}_{image.y}.png" ).NormalizePath();
                 treeRequests.Add( image );
             }
         }
@@ -130,20 +140,12 @@ public class TreeCacher
         {
             return MathF.Sign( b.dist-a.dist );
         } );
-
-
-        int count = Math.Min(numSimultanousDownloads, treeRequests.Count);
-        for (int i = 0; i<count;i++)
-        {
-            activeRequests.Add( treeRequests[treeRequests.Count-1] );
-            treeRequests.RemoveAt( treeRequests.Count-1 );
-        }
-            
+ 
     }
 
     void DownloadAndStoreImages()
     {
-        if (activeRequests == null || activeRequests.Count==0) // Happens when switching to Debug/Release unity while running.
+        if (activeRequests == null) // Happens when switching to Debug/Release unity while running.
         {
             return;
         }
@@ -166,14 +168,24 @@ public class TreeCacher
                     {
                         var data = web.Result.Content.ReadAsByteArrayAsync();
                         await data;
+                        var filename = $"tree_{tt.zoom}_{tree.x}_{tree.y}.png";
                         if (data.Result.Length>2300) // otherwise so little pixel info, is empty or no tree found
                         {
-                            await File.WriteAllBytesAsync( tree.filepath, data.Result );
+                            filename     = folder.Combine( filename ).NormalizePath();
+                            await File.WriteAllBytesAsync( filename, data.Result );
                             tt.numImagesFinished++;
-                            Console.Clear();
-                            Console.WriteLine( $"numFinished: {tt.numImagesFinished}" );
-                            Console.WriteLine( $"numFaailed: {tt.numImagesFailed}" );
                         }
+                        else
+                        {
+                            
+                            filename = invalidFolder.Combine( filename ).NormalizePath();
+                            await File.WriteAllBytesAsync( filename, data.Result );
+                            tt.numImagesInvalid++;
+                        }
+                        Console.Clear();
+                        Console.WriteLine( $"numFinished: {tt.numImagesFinished}" );
+                        Console.WriteLine( $"numInvalid: {tt.numImagesInvalid}" );
+                        Console.WriteLine( $"numDLFailed: {tt.numImagesFailed}" );
                     } );
                     remove = true;
                 }
@@ -196,20 +208,24 @@ public class TreeCacher
                 activeRequests.RemoveAt( i );
                 i--;
             }
+        }
+
 
-            if (activeRequests.Count < numSimultanousDownloads )
+        if (activeRequests.Count < numSimultanousDownloads)
+        {
+            while (treeRequests.Count != 0)
             {
-                while (treeRequests.Count != 0)
+                var potentialNew = treeRequests[treeRequests.Count-1];
+                treeRequests.RemoveAt( treeRequests.Count-1 );
+                var filename = $"tree_{zoom}_{potentialNew.x}_{potentialNew.y}.png";
+                var valid   = folder.Combine( filename ).NormalizePath();
+                var invalid = invalidFolder.Combine( filename ).NormalizePath();
+                if (!File.Exists( valid  ) && !File.Exists( invalid ))
                 {
-                    var potentialNew = treeRequests[treeRequests.Count-1];
-                    treeRequests.RemoveAt( treeRequests.Count-1 );
-                    if (!File.Exists( potentialNew.filepath ))
-                    {
-                        activeRequests.Add( potentialNew );
-                        break;
-                    }
+                    activeRequests.Add( potentialNew );
+                    break;
                 }
-            }   
+            }
         }
     }
 }