diff --git a/CHANGELOG.md b/CHANGELOG.md
index d715cc2..0055560 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@
   [#306](https://github.com/lambda-fairy/maud/pull/306)
 - Update to Rust 2021
   [#309](https://github.com/lambda-fairy/maud/pull/309)
+- Remove Iron support
+  [#289](https://github.com/lambda-fairy/maud/pull/289)
 
 ## [0.22.3] - 2021-09-27
 
diff --git a/docs/content/web-frameworks.md b/docs/content/web-frameworks.md
index 93b6026..fb05fd4 100644
--- a/docs/content/web-frameworks.md
+++ b/docs/content/web-frameworks.md
@@ -1,10 +1,9 @@
 # Web framework integration
 
 Maud includes support for these web frameworks:
-[Actix], [Iron], [Rocket], [Rouille], and [Tide].
+[Actix], [Rocket], [Rouille], and [Tide].
 
 [Actix]: https://actix.rs/
-[Iron]: http://ironframework.io
 [Rocket]: https://rocket.rs/
 [Rouille]: https://github.com/tomaka/rouille
 [Tide]: https://docs.rs/tide/
@@ -48,42 +47,6 @@ async fn main() -> io::Result<()> {
 }
 ```
 
-# Iron
-
-Iron support is available with the "iron" feature:
-
-```toml
-# ...
-[dependencies]
-maud = { version = "*", features = ["iron"] }
-# ...
-```
-
-With this feature enabled,
-you can then build a `Response` from a `Markup` object directly.
-Here's an example application using Iron and Maud:
-
-```rust,no_run
-use iron::prelude::*;
-use iron::status;
-use maud::html;
-
-fn main() {
-    Iron::new(|r: &mut Request| {
-        let markup = html! {
-            h1 { "Hello, world!" }
-            p {
-                "You are viewing the page at " (r.url)
-            }
-        };
-        Ok(Response::with((status::Ok, markup)))
-    }).http("localhost:3000").unwrap();
-}
-```
-
-`Markup` will set the content type of the response automatically,
-so you don't need to add it yourself.
-
 # Rocket
 
 Rocket works in a similar way,
diff --git a/doctest/Cargo.toml b/doctest/Cargo.toml
index 8ea9374..82a990e 100644
--- a/doctest/Cargo.toml
+++ b/doctest/Cargo.toml
@@ -7,8 +7,7 @@ edition = "2018"
 [dependencies]
 actix-web = "3"
 ammonia = "3"
-iron = "0.6"
-maud = { path = "../maud", features = ["actix-web", "iron", "rocket", "tide", "axum"] }
+maud = { path = "../maud", features = ["actix-web", "rocket", "tide", "axum"] }
 pulldown-cmark = "0.8"
 rocket = "0.4"
 rouille = "3"
diff --git a/maud/Cargo.toml b/maud/Cargo.toml
index 7229866..393733a 100644
--- a/maud/Cargo.toml
+++ b/maud/Cargo.toml
@@ -19,7 +19,6 @@ actix-web = ["actix-web-dep", "futures-util"]
 
 [dependencies]
 maud_macros = { version = "0.22.3", path = "../maud_macros" }
-iron = { version = ">= 0.5.1, < 0.7.0", optional = true }
 rocket = { version = ">= 0.3, < 0.5", optional = true }
 futures-util = { version = "0.3.0", optional = true, default-features = false }
 actix-web-dep = { package = "actix-web", version = ">= 2, < 4", optional = true, default-features = false }
diff --git a/maud/src/lib.rs b/maud/src/lib.rs
index b39cd22..a3a026b 100644
--- a/maud/src/lib.rs
+++ b/maud/src/lib.rs
@@ -208,35 +208,6 @@ impl<T: AsRef<str> + Into<String>> From<PreEscaped<T>> for String {
 /// ```
 pub const DOCTYPE: PreEscaped<&'static str> = PreEscaped("<!DOCTYPE html>");
 
-#[cfg(feature = "iron")]
-mod iron_support {
-    extern crate std;
-
-    use crate::PreEscaped;
-    use alloc::{boxed::Box, string::String};
-    use iron::{
-        headers::ContentType,
-        modifier::{Modifier, Set},
-        modifiers::Header,
-        response::{Response, WriteBody},
-    };
-    use std::io;
-
-    impl Modifier<Response> for PreEscaped<String> {
-        fn modify(self, response: &mut Response) {
-            response
-                .set_mut(Header(ContentType::html()))
-                .set_mut(Box::new(self) as Box<dyn WriteBody>);
-        }
-    }
-
-    impl WriteBody for PreEscaped<String> {
-        fn write_body(&mut self, body: &mut dyn io::Write) -> io::Result<()> {
-            self.0.write_body(body)
-        }
-    }
-}
-
 #[cfg(feature = "rocket")]
 mod rocket_support {
     extern crate std;