diff --git a/axum-extra/CHANGELOG.md b/axum-extra/CHANGELOG.md
index 37d81f0b..ec02bd28 100644
--- a/axum-extra/CHANGELOG.md
+++ b/axum-extra/CHANGELOG.md
@@ -7,7 +7,9 @@ and this project adheres to [Semantic Versioning].
# Unreleased
-- None.
+- **added:** Add `extract::Query` which supports multi-value items ([#1041])
+
+[#1041]: https://github.com/tokio-rs/axum/pull/1041
# 0.3.2 (15. May, 2022)
diff --git a/axum-extra/Cargo.toml b/axum-extra/Cargo.toml
index 3e9807d1..36df3126 100644
--- a/axum-extra/Cargo.toml
+++ b/axum-extra/Cargo.toml
@@ -18,6 +18,7 @@ cookie = ["cookie-lib"]
cookie-signed = ["cookie", "cookie-lib/signed"]
cookie-private = ["cookie", "cookie-lib/private"]
form = ["serde", "serde_html_form"]
+query = ["serde", "serde_html_form"]
spa = ["tower-http/fs"]
[dependencies]
diff --git a/axum-extra/src/extract/mod.rs b/axum-extra/src/extract/mod.rs
index 4a98c716..9abed09f 100644
--- a/axum-extra/src/extract/mod.rs
+++ b/axum-extra/src/extract/mod.rs
@@ -8,6 +8,9 @@ mod form;
#[cfg(feature = "cookie")]
pub mod cookie;
+#[cfg(feature = "query")]
+mod query;
+
pub use self::cached::Cached;
#[cfg(feature = "cookie")]
@@ -21,3 +24,6 @@ pub use self::cookie::SignedCookieJar;
#[cfg(feature = "form")]
pub use self::form::Form;
+
+#[cfg(feature = "query")]
+pub use self::query::Query;
diff --git a/axum-extra/src/extract/query.rs b/axum-extra/src/extract/query.rs
new file mode 100644
index 00000000..dcbcdb31
--- /dev/null
+++ b/axum-extra/src/extract/query.rs
@@ -0,0 +1,117 @@
+use axum::{
+ async_trait,
+ extract::{
+ rejection::{FailedToDeserializeQueryString, QueryRejection},
+ FromRequest, RequestParts,
+ },
+};
+use serde::de::DeserializeOwned;
+use std::ops::Deref;
+
+/// Extractor that deserializes query strings into some type.
+///
+/// `T` is expected to implement [`serde::Deserialize`].
+///
+/// # Differences from `axum::extract::Form`
+///
+/// This extractor uses [`serde_html_form`] under-the-hood which supports multi-value items. These
+/// are sent by multiple `` attributes of the same name (e.g. checkboxes) and `