diff --git a/Cargo.lock b/Cargo.lock
index 375e4ce9b63069cdf508b7679dfcd135ecfe46e0..292408023353aa769056c0ffdcdf3bc95eb1fa54 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2066,6 +2066,15 @@ dependencies = [
  "objc",
 ]
 
+[[package]]
+name = "micro_autotile"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78eda07db196df5c028f17242e7f5e9fd26efadf83d1e10d4927b56754155996"
+dependencies = [
+ "fastrand",
+]
+
 [[package]]
 name = "micro_ldtk"
 version = "0.3.0-beta.1"
@@ -2073,6 +2082,7 @@ dependencies = [
  "anyhow",
  "bevy",
  "log",
+ "micro_autotile",
  "num-traits",
  "quadtree_rs",
  "serde",
diff --git a/Cargo.toml b/Cargo.toml
index 2b84448834d37b946eeb3b523aa5884561e4b1f9..98d2d55b503380eae2455ad6b7cc4aff8919e895 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,9 +10,10 @@ repository = "https://lab.lcr.gr/microhacks/bevy-micro-ldtk.git"
 license = "Apache-2.0"
 
 [features]
-default = ["ldtk_1_2_5"]
+default = ["ldtk_1_2_5", "autotile"]
 ldtk_1_2_5 = []
 ldtk_1_2_4 = []
+autotile = ["micro_autotile"]
 no_panic = []
 
 [dependencies]
@@ -24,4 +25,5 @@ serde = "1.0.147"
 serde_json = "1.0.87"
 num-traits = "0.2.15"
 quadtree_rs = "0.1.2"
+micro_autotile = { version = "0.1.0", optional = true }
 
diff --git a/src/ldtk/mod.rs b/src/ldtk/mod.rs
index e217205d2444b641cd87caf57452da9cfe9494f6..2dbd780ebd4a2b4bb8ec65e72379adb3349f2ad7 100644
--- a/src/ldtk/mod.rs
+++ b/src/ldtk/mod.rs
@@ -68,6 +68,81 @@ impl AssetLoader for LdtkLoader {
 	}
 }
 
+#[cfg(feature = "autotile")]
+mod autotile_support {
+	use micro_autotile::{AutoRuleSet, AutoTileRule, TileMatcher, TileOutput, TileStatus};
+
+	use crate::ldtk::{AutoLayerRuleGroup, Project};
+
+	impl From<&AutoLayerRuleGroup> for AutoRuleSet {
+		fn from(value: &AutoLayerRuleGroup) -> Self {
+			let set = value
+				.rules
+				.iter()
+				.filter_map(|rule| match rule.size {
+					1 => {
+						let rule = AutoTileRule {
+							chance: rule.chance as f32,
+							output: TileOutput::Random(
+								rule.tile_ids.iter().map(|val| val as usize).collect(),
+							),
+							matcher: TileMatcher::single_match(TileStatus::from_ldtk_value(
+								rule.pattern[0],
+							)),
+						};
+
+						Some(rule)
+					}
+					3 => {
+						if rule.pattern.len() == 9 {
+							let matcher = TileMatcher([
+								TileStatus::from_ldtk_value(rule.pattern[0]),
+								TileStatus::from_ldtk_value(rule.pattern[1]),
+								TileStatus::from_ldtk_value(rule.pattern[2]),
+								TileStatus::from_ldtk_value(rule.pattern[3]),
+								TileStatus::from_ldtk_value(rule.pattern[4]),
+								TileStatus::from_ldtk_value(rule.pattern[5]),
+								TileStatus::from_ldtk_value(rule.pattern[6]),
+								TileStatus::from_ldtk_value(rule.pattern[7]),
+								TileStatus::from_ldtk_value(rule.pattern[8]),
+							]);
+
+							let rule = AutoTileRule {
+								chance: rule.chance as f32,
+								matcher,
+								output: TileOutput::Random(
+									rule.tile_ids.iter().map(|val| val as usize).collect(),
+								),
+							};
+
+							Some(rule)
+						} else {
+							None
+						}
+					}
+					_ => None,
+				})
+				.collect();
+
+			AutoRuleSet(set)
+		}
+	}
+
+	impl From<&Project> for AutoRuleSet {
+		fn from(value: &Project) -> Self {
+			let mut base_set = AutoRuleSet::default();
+
+			for layers in value.defs.layers.iter() {
+				for rule_group in layers.auto_rule_groups.iter() {
+					base_set = base_set + rule_group.into();
+				}
+			}
+
+			base_set
+		}
+	}
+}
+
 #[cfg(test)]
 mod test {
 	use crate::ldtk::Project;
diff --git a/src/ldtk/test_data/ver_1_2_5.ldtk b/src/ldtk/test_data/ver_1_2_5.ldtk
index 6918e10192ec155aa3d126f583585e17019ee035..73e90b9a10aa96646b21ac9600538d84c5471ee0 100644
--- a/src/ldtk/test_data/ver_1_2_5.ldtk
+++ b/src/ldtk/test_data/ver_1_2_5.ldtk
@@ -11,7 +11,7 @@
 	"iid": "325092c0-c640-11ed-9e63-bd196e303d69",
 	"jsonVersion": "1.2.5",
 	"appBuildId": 464870,
-	"nextUid": 9,
+	"nextUid": 10,
 	"identifierStyle": "Capitalize",
 	"toc": [],
 	"worldLayout": "Free",
@@ -61,6 +61,30 @@
 			"excludedTags": [],
 			"intGridValues": [],
 			"autoRuleGroups": [{ "uid": 6, "name": "flloor", "active": true, "isOptional": false, "rules": [
+				{
+					"uid": 9,
+					"active": true,
+					"size": 3,
+					"tileIds": [3],
+					"chance": 1,
+					"breakOnMatch": true,
+					"pattern": [0,0,0,0,2,2,0,2,0],
+					"flipX": false,
+					"flipY": false,
+					"xModulo": 1,
+					"yModulo": 1,
+					"xOffset": 0,
+					"yOffset": 0,
+					"checker": "None",
+					"tileMode": "Single",
+					"pivotX": 0,
+					"pivotY": 0,
+					"outOfBoundsValue": null,
+					"perlinActive": false,
+					"perlinSeed": 2913161,
+					"perlinScale": 0.2,
+					"perlinOctaves": 2
+				},
 				{
 					"uid": 8,
 					"active": true,
@@ -273,26 +297,26 @@
 						{ "px": [80,192], "src": [368,48], "f": 0, "t": 119, "d": [7,197] },
 						{ "px": [96,192], "src": [368,48], "f": 0, "t": 119, "d": [7,198] },
 						{ "px": [112,192], "src": [368,48], "f": 0, "t": 119, "d": [7,199] },
-						{ "px": [144,80], "src": [16,0], "f": 0, "t": 1, "d": [8,89] },
-						{ "px": [160,80], "src": [16,0], "f": 0, "t": 1, "d": [8,90] },
-						{ "px": [176,80], "src": [16,0], "f": 0, "t": 1, "d": [8,91] },
 						{ "px": [192,80], "src": [16,0], "f": 0, "t": 1, "d": [8,92] },
-						{ "px": [144,96], "src": [16,0], "f": 0, "t": 1, "d": [8,105] },
-						{ "px": [160,96], "src": [16,0], "f": 0, "t": 1, "d": [8,106] },
-						{ "px": [176,96], "src": [16,0], "f": 0, "t": 1, "d": [8,107] },
 						{ "px": [192,96], "src": [16,0], "f": 0, "t": 1, "d": [8,108] },
-						{ "px": [144,112], "src": [16,0], "f": 0, "t": 1, "d": [8,121] },
-						{ "px": [160,112], "src": [16,0], "f": 0, "t": 1, "d": [8,122] },
-						{ "px": [176,112], "src": [16,0], "f": 0, "t": 1, "d": [8,123] },
 						{ "px": [192,112], "src": [16,0], "f": 0, "t": 1, "d": [8,124] },
-						{ "px": [144,128], "src": [16,0], "f": 0, "t": 1, "d": [8,137] },
-						{ "px": [160,128], "src": [16,0], "f": 0, "t": 1, "d": [8,138] },
-						{ "px": [176,128], "src": [16,0], "f": 0, "t": 1, "d": [8,139] },
 						{ "px": [192,128], "src": [16,0], "f": 0, "t": 1, "d": [8,140] },
 						{ "px": [144,144], "src": [16,0], "f": 0, "t": 1, "d": [8,153] },
 						{ "px": [160,144], "src": [16,0], "f": 0, "t": 1, "d": [8,154] },
 						{ "px": [176,144], "src": [16,0], "f": 0, "t": 1, "d": [8,155] },
-						{ "px": [192,144], "src": [16,0], "f": 0, "t": 1, "d": [8,156] }
+						{ "px": [192,144], "src": [16,0], "f": 0, "t": 1, "d": [8,156] },
+						{ "px": [144,80], "src": [48,0], "f": 0, "t": 3, "d": [9,89] },
+						{ "px": [160,80], "src": [48,0], "f": 0, "t": 3, "d": [9,90] },
+						{ "px": [176,80], "src": [48,0], "f": 0, "t": 3, "d": [9,91] },
+						{ "px": [144,96], "src": [48,0], "f": 0, "t": 3, "d": [9,105] },
+						{ "px": [160,96], "src": [48,0], "f": 0, "t": 3, "d": [9,106] },
+						{ "px": [176,96], "src": [48,0], "f": 0, "t": 3, "d": [9,107] },
+						{ "px": [144,112], "src": [48,0], "f": 0, "t": 3, "d": [9,121] },
+						{ "px": [160,112], "src": [48,0], "f": 0, "t": 3, "d": [9,122] },
+						{ "px": [176,112], "src": [48,0], "f": 0, "t": 3, "d": [9,123] },
+						{ "px": [144,128], "src": [48,0], "f": 0, "t": 3, "d": [9,137] },
+						{ "px": [160,128], "src": [48,0], "f": 0, "t": 3, "d": [9,138] },
+						{ "px": [176,128], "src": [48,0], "f": 0, "t": 3, "d": [9,139] }
 					],
 					"seed": 5669822,
 					"overrideTilesetUid": null,
diff --git a/src/lib.rs b/src/lib.rs
index d1355c714b7f0d0efd4d7ab8bfba32f71ac7bd57..369a99eddbfa12071e2067b7077b035675e5c028 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -80,5 +80,7 @@ pub use assets::{LevelIndex, TileMetadata, TilesetIndex};
 pub use camera::CameraBounder;
 pub use ldtk::{LdtkLoader, LdtkProject};
 pub use map_query::{CameraBounds, MapQuery};
+#[cfg(feature = "autotile")]
+pub use micro_autotile as autotile;
 pub use pregen::{write_layer_to_texture, write_map_to_texture, Rasterise};
 pub use system::*;