diff --git a/htiled.cabal b/htiled.cabal
--- a/htiled.cabal
+++ b/htiled.cabal
@@ -1,5 +1,5 @@
 Name:                htiled
-Version:             0.1.1.2
+Version:             0.1.2.0
 Synopsis:            Import from the Tiled map editor.
 Description:         Import maps from the .tmx map format generated by Tiled,
                      <http://www.mapeditor.org>.
diff --git a/src/Data/Tiled/Load.hs b/src/Data/Tiled/Load.hs
--- a/src/Data/Tiled/Load.hs
+++ b/src/Data/Tiled/Load.hs
@@ -18,6 +18,7 @@
 
 import qualified Codec.Compression.GZip     as GZip
 import qualified Codec.Compression.Zlib     as Zlib
+import           System.FilePath            (dropFileName, (</>))
 import           Text.XML.HXT.Core
 
 import           Data.Tiled.Types
@@ -62,7 +63,7 @@
     mapTileWidth   ← getAttrR "tilewidth"  ⤙ m
     mapTileHeight  ← getAttrR "tileheight" ⤙ m
     mapProperties  ← properties            ⤙ m
-    mapTilesets    ← tilesets              ⤙ m
+    mapTilesets    ← tilesets mapPath      ⤙ m
     mapLayers      ← layers                ⤙ (m, (mapWidth, mapHeight))
     returnA        ⤙ TiledMap {..}
 
@@ -156,22 +157,32 @@
         returnA ⤙ case x of Left  layerData    → Layer {..}
                             Right layerObjects → ObjectLayer {..}
 
-tilesets ∷ IOSArrow XmlTree [Tileset]
-tilesets = listA $ getChildren >>> isElem >>> hasName "tileset"
-         >>> proc ts → do
-              tsName        ← getAttrValue "name"     ⤙ ts
-              tsInitialGid  ← getAttrR "firstgid"     ⤙ ts
-              tsTileWidth   ← getAttrR "tilewidth"    ⤙ ts
-              tsTileHeight  ← getAttrR "tileheight"   ⤙ ts
-              tsMargin      ← (arr $ fromMaybe 0) . getAttrMaybe "margin" ⤙ ts
-              tsSpacing     ← (arr $ fromMaybe 0) . getAttrMaybe "spacing" ⤙ ts
-              tsImages      ← images                  ⤙ ts
-              tsTileProperties ← listA tileProperties ⤙ ts
-              returnA ⤙ Tileset {..}
+tilesets ∷ FilePath → IOSArrow XmlTree [Tileset]
+tilesets fp =
+  listA $ getChildren >>> isElem >>> hasName "tileset"
+  >>> getAttrR "firstgid" &&& ifA (hasAttr "source") (externalTileset fp) id
+  >>> tileset
+
+externalTileset ∷ FilePath → IOSArrow XmlTree XmlTree
+externalTileset mapPath =
+  arr (const (dropFileName mapPath)) &&& getAttrValue "source"
+  >>> arr (uncurry (</>))
+  >>> readFromDocument [ withValidate no, withWarnings yes ]
+  >>> getChildren >>> isElem >>> hasName "tileset"
+
+tileset ∷ IOSArrow (Word32, XmlTree) Tileset
+tileset = proc (tsInitialGid, ts) → do
+  tsName           ← getAttrValue "name"                        ⤙ ts
+  tsTileWidth      ← getAttrR "tilewidth"                       ⤙ ts
+  tsTileHeight     ← getAttrR "tileheight"                      ⤙ ts
+  tsMargin         ← arr (fromMaybe 0) . getAttrMaybe "margin"  ⤙ ts
+  tsSpacing        ← arr (fromMaybe 0) . getAttrMaybe "spacing" ⤙ ts
+  tsImages         ← images                                     ⤙ ts
+  tsTileProperties ← listA tileProperties                       ⤙ ts
+  returnA ⤙ Tileset {..}
   where tileProperties ∷ IOSArrow XmlTree (Word32, Properties)
         tileProperties = getChildren >>> isElem >>> hasName "tile"
-                     >>> getAttrR "id" &&& properties
-
+                         >>> getAttrR "id" &&& properties
         images = listA (getChildren >>> image)
 
 image ∷ IOSArrow XmlTree Image
