diff --git a/.gitignore b/.gitignore
index 6cd496af8ddd31e1e7419371d9ff55647c49eb5f..c1aea3809648776b73f98c9ef72aca779f724c80 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,5 @@ target
 Cargo.lock
 *.swp
 *.dll
-.vscode
\ No newline at end of file
+.vscode
+.idea
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f4e87efa7d08f3b2bcbe0ab64ddeed1b47728f29..b9fb0ed7280dd1973a6e82e304634ca92015a1b2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Added
 - Support for Wang sets.
 
+### Changed
+- `Loader` cache will be checked for matches before opening a file handle
+
 ## [0.10.2]
 ### Added
 - Map-wrapped chunks: `ChunkWrapper`.
diff --git a/src/loader.rs b/src/loader.rs
index 35e4953d8c88b7b17a5f620577a7a023457362f0..91c55437cf6cdf9243be9592d87dff412039b7ee 100644
--- a/src/loader.rs
+++ b/src/loader.rs
@@ -120,11 +120,15 @@ impl<Cache: ResourceCache> Loader<Cache> {
     ///
     /// If you need to parse a reader object instead, use [Loader::load_tsx_tileset_from()].
     pub fn load_tsx_tileset(&mut self, path: impl AsRef<Path>) -> Result<Tileset> {
-        let reader = File::open(path.as_ref()).map_err(|err| Error::CouldNotOpenFile {
-            path: path.as_ref().to_owned(),
-            err,
+        let tileset = self.cache.get_or_try_insert_tileset_with(path.as_ref().to_path_buf(), || {
+            let reader = File::open(path.as_ref()).map_err(|err| Error::CouldNotOpenFile {
+                path: path.as_ref().to_owned(),
+                err,
+            })?;
+            crate::parse::xml::parse_tileset(reader, path.as_ref())
         })?;
-        crate::parse::xml::parse_tileset(reader, path.as_ref())
+
+        Ok((*tileset).clone())
     }
 
     /// Parses a tileset out of a reader hopefully containing the contents of a Tiled tileset.
@@ -151,12 +155,15 @@ impl<Cache: ResourceCache> Loader<Cache> {
     /// assert_eq!(tileset.image.unwrap().source, PathBuf::from("assets/tilesheet.png"));
     /// ```
     pub fn load_tsx_tileset_from(
-        &self,
+        &mut self,
         reader: impl Read,
         path: impl AsRef<Path>,
     ) -> Result<Tileset> {
-        // This function doesn't need the cache right now, but will do once template support is in
-        crate::parse::xml::parse_tileset(reader, path.as_ref())
+       let tileset = self.cache.get_or_try_insert_tileset_with(path.as_ref().to_path_buf(), || {
+            crate::parse::xml::parse_tileset(reader, path.as_ref())
+        })?;
+
+        Ok((*tileset).clone())
     }
 
     /// Returns a reference to the loader's internal [`ResourceCache`].
diff --git a/src/map.rs b/src/map.rs
index 23438034174033e5e02d4646d8c9712999f63a03..7ee3705971dc62343521c557145af1d72c64e522 100644
--- a/src/map.rs
+++ b/src/map.rs
@@ -185,8 +185,10 @@ impl Map {
                 let res = Tileset::parse_xml_in_map(parser, attrs, map_path)?;
                 match res.result_type {
                     EmbeddedParseResultType::ExternalReference { tileset_path } => {
-                        let file = File::open(&tileset_path).map_err(|err| Error::CouldNotOpenFile{path: tileset_path.clone(), err })?;
-                        let tileset = cache.get_or_try_insert_tileset_with(tileset_path.clone(), || crate::parse::xml::parse_tileset(file, &tileset_path))?;
+                        let tileset = cache.get_or_try_insert_tileset_with(tileset_path.clone(), || {
+                            let file = File::open(&tileset_path).map_err(|err| Error::CouldNotOpenFile{path: tileset_path.clone(), err })?;
+                            crate::parse::xml::parse_tileset(file, &tileset_path)
+                        })?;
                         tilesets.push(MapTilesetGid{first_gid: res.first_gid, tileset});
                     }
                     EmbeddedParseResultType::Embedded { tileset } => {