diff --git a/lib/Properties.hs b/lib/Properties.hs
index ba78fcaab8dcd7fa1a812a038b5ea0d5349a9cc8..07b4397ec3bfb377e018b5e8ae86281d79665221 100644
--- a/lib/Properties.hs
+++ b/lib/Properties.hs
@@ -14,7 +14,8 @@ import           Control.Monad (forM_, unless, when)
 import           Data.Text     (Text, isPrefixOf)
 import qualified Data.Vector   as V
 import           Tiled         (Layer (..), Object (..), Property (..),
-                                PropertyValue (..), Tiledmap (..), Tileset (..))
+                                PropertyValue (..), Tile (..), Tiledmap (..),
+                                Tileset (..))
 import           TiledAbstract (HasName (..), HasProperties (..),
                                 HasTypeName (..), IsProperty (..))
 import           Util          (layerIsEmpty, mkProxy, naiveEscapeHTML,
@@ -368,13 +369,18 @@ refuseDoubledNames
   => (Foldable t, Functor t)
   => t a
   -> LintWriter b
-refuseDoubledNames things = foldr folding base things mempty
+refuseDoubledNames things = foldr folding base things (mempty,mempty)
   where
-    -- this accumulates a function that complains about things it's already seen
-    folding thing cont seen = do
-      when (name `elem` seen)
-        $ complain $ "cannot use " <> typeName (mkProxy thing) <> " name \"" <> name <> "\" twice"
-      cont (S.insert name seen)
+    -- this accumulates a function that complains about things it's
+    -- already seen, except if they've already occured twice and then
+    -- occur again …
+    folding thing cont (seen, twice)
+      | name `elem` seen && name `notElem` twice = do
+        complain $ "cannot use " <> typeName (mkProxy thing)
+                  <> " name \"" <> name <> "\" multiple times."
+        cont (seen, S.insert name twice)
+      | otherwise =
+        cont (S.insert name seen, twice)
       where name = getName thing
     base _ = pure ()