diff --git a/examples/sfml/tilesheet.rs b/examples/sfml/tilesheet.rs
index b366a64fa13ae570d7c977de57576e4e8f5ea782..d3530f24f917567105ddb3e6daf1abb7b75edaab 100644
--- a/examples/sfml/tilesheet.rs
+++ b/examples/sfml/tilesheet.rs
@@ -1,4 +1,4 @@
-use std::rc::Rc;
+use std::sync::Arc;
 
 use sfml::{
     graphics::{FloatRect, Texture},
@@ -9,12 +9,12 @@ use tiled::Tileset;
 /// A container for a tileset and the texture it references.
 pub struct Tilesheet {
     texture: SfBox<Texture>,
-    tileset: Rc<Tileset>,
+    tileset: Arc<Tileset>,
 }
 
 impl Tilesheet {
     /// Create a tilesheet from a Tiled tileset, loading its texture along the way.
-    pub fn from_tileset<'p>(tileset: Rc<Tileset>) -> Self {
+    pub fn from_tileset<'p>(tileset: Arc<Tileset>) -> Self {
         let tileset_image = tileset.image.as_ref().unwrap();
 
         let texture = {
diff --git a/src/cache.rs b/src/cache.rs
index 0a171b6db77748e10f461946ef3b8eeafe463b1b..4d670a152acdd7bf968e75b3fc00ccb9a5af4865 100644
--- a/src/cache.rs
+++ b/src/cache.rs
@@ -1,7 +1,7 @@
 use std::{
     collections::HashMap,
     path::{Path, PathBuf},
-    rc::Rc,
+    sync::Arc,
 };
 
 use crate::Tileset;
@@ -10,19 +10,19 @@ pub type ResourcePath = Path;
 pub type ResourcePathBuf = PathBuf;
 
 pub trait ResourceCache {
-    fn get_tileset(&self, path: impl AsRef<ResourcePath>) -> Option<Rc<Tileset>>;
+    fn get_tileset(&self, path: impl AsRef<ResourcePath>) -> Option<Arc<Tileset>>;
     fn get_or_try_insert_tileset_with<F, E>(
         &mut self,
         path: ResourcePathBuf,
         f: F,
-    ) -> Result<Rc<Tileset>, E>
+    ) -> Result<Arc<Tileset>, E>
     where
         F: FnOnce() -> Result<Tileset, E>;
 }
 
 /// A cache that identifies resources by their path in the user's filesystem.
 pub struct FilesystemResourceCache {
-    tilesets: HashMap<ResourcePathBuf, Rc<Tileset>>,
+    tilesets: HashMap<ResourcePathBuf, Arc<Tileset>>,
 }
 
 impl FilesystemResourceCache {
@@ -34,7 +34,7 @@ impl FilesystemResourceCache {
 }
 
 impl ResourceCache for FilesystemResourceCache {
-    fn get_tileset(&self, path: impl AsRef<ResourcePath>) -> Option<Rc<Tileset>> {
+    fn get_tileset(&self, path: impl AsRef<ResourcePath>) -> Option<Arc<Tileset>> {
         self.tilesets.get(path.as_ref()).map(Clone::clone)
     }
 
@@ -42,13 +42,13 @@ impl ResourceCache for FilesystemResourceCache {
         &mut self,
         path: ResourcePathBuf,
         f: F,
-    ) -> Result<Rc<Tileset>, E>
+    ) -> Result<Arc<Tileset>, E>
     where
         F: FnOnce() -> Result<Tileset, E>,
     {
         Ok(match self.tilesets.entry(path) {
             std::collections::hash_map::Entry::Occupied(o) => o.into_mut(),
-            std::collections::hash_map::Entry::Vacant(v) => v.insert(Rc::new(f()?)),
+            std::collections::hash_map::Entry::Vacant(v) => v.insert(Arc::new(f()?)),
         }
         .clone())
     }
diff --git a/src/map.rs b/src/map.rs
index 20ae2468cfbf1f084b693c15507ec9fc154093ed..e32e714e3663ef33d05bbb6076aa362624a09f29 100644
--- a/src/map.rs
+++ b/src/map.rs
@@ -1,4 +1,4 @@
-use std::{collections::HashMap, fmt, fs::File, io::Read, path::Path, rc::Rc, str::FromStr};
+use std::{collections::HashMap, fmt, fs::File, io::Read, path::Path, sync::Arc, str::FromStr};
 
 use xml::{attribute::OwnedAttribute, reader::XmlEvent, EventReader};
 
@@ -13,7 +13,7 @@ use crate::{
 
 pub(crate) struct MapTilesetGid {
     pub first_gid: Gid,
-    pub tileset: Rc<Tileset>,
+    pub tileset: Arc<Tileset>,
 }
 
 /// All Tiled map files will be parsed into this. Holds all the layers and tilesets.
@@ -31,7 +31,7 @@ pub struct Map {
     /// Tile height, in pixels.
     pub tile_height: u32,
     /// The tilesets present on this map.
-    tilesets: Vec<Rc<Tileset>>,
+    tilesets: Vec<Arc<Tileset>>,
     /// The layers present in this map.
     layers: Vec<LayerData>,
     /// The custom properties of this map.
@@ -100,7 +100,7 @@ impl Map {
 
 impl Map {
     /// Get a reference to the map's tilesets.
-    pub fn tilesets(&self) -> &[Rc<Tileset>] {
+    pub fn tilesets(&self) -> &[Arc<Tileset>] {
         self.tilesets.as_ref()
     }
 
@@ -186,7 +186,7 @@ impl Map {
                         tilesets.push(MapTilesetGid{first_gid: res.first_gid, tileset});
                     }
                     EmbeddedParseResultType::Embedded { tileset } => {
-                        tilesets.push(MapTilesetGid{first_gid: res.first_gid, tileset: Rc::new(tileset)});
+                        tilesets.push(MapTilesetGid{first_gid: res.first_gid, tileset: Arc::new(tileset)});
                     },
                 };
                 Ok(())
diff --git a/temp b/temp
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391