Repository: stac-utils/stac-rs (language: python)

Issue:
Update to v1.1.0 of the core spec
https://github.com/radiantearth/stac-spec/releases/tag/v1.1.0

Off the top of my head, we'll want to:

- [x] Update the default STAC version
- [x] Add the new mime types from beta.1
- [x] Add `item_assets` to `Collection`
- [x] Add migration to v1.1.0
- [x] Add the examples and switch all the symlinks to point to v1.1.0
- [x] Add the schemas to **stac-validate**
- [x] ~Create a `Reader` (or a builder for a reader) that allows us to enable or diable auto-migrating on read~ Juice not worth the squeeze at this time, IMO.
- [x] Re-enable read tests using **reqwests** (they currently are ignored b/c they can't read v1.1.0)

There could be more, too.


Discussion / hints:

Fix patch:
diff --git a/cli/examples b/cli/examples
index 188ec763..dc8ca857 120000
--- a/cli/examples
+++ b/cli/examples
@@ -1,1 +1,1 @@
-../spec-examples/v1.0.0
\ No newline at end of file
+../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md
index d9169b76..ce87dd6b 100644
--- a/core/CHANGELOG.md
+++ b/core/CHANGELOG.md
@@ -20,6 +20,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 ### Changed
 
 - Update **geoarrow** to v0.3.0 ([#367](https://github.com/stac-utils/stac-rs/pull/367))
+- Default STAC version is now v1.1.0 ([#399](https://github.com/stac-utils/stac-rs/pull/399))
 
 ### Removed
 
diff --git a/core/data/bands-v1.1.0-beta.1.json b/core/data/bands-v1.1.0.json
similarity index 96%
rename from core/data/bands-v1.1.0-beta.1.json
rename to core/data/bands-v1.1.0.json
index a3a43de9..1ff3bd77 100644
--- a/core/data/bands-v1.1.0-beta.1.json
+++ b/core/data/bands-v1.1.0.json
@@ -1,6 +1,6 @@
 {
     "type": "Feature",
-    "stac_version": "1.1.0-beta.1",
+    "stac_version": "1.1.0",
     "id": "bands-migration",
     "geometry": null,
     "properties": {
diff --git a/core/examples b/core/examples
index 188ec763..dc8ca857 120000
--- a/core/examples
+++ b/core/examples
@@ -1,1 +1,1 @@
-../spec-examples/v1.0.0
\ No newline at end of file
+../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/core/src/extensions/mod.rs b/core/src/extensions/mod.rs
index 4839eee2..bdeb1127 100644
--- a/core/src/extensions/mod.rs
+++ b/core/src/extensions/mod.rs
@@ -32,7 +32,7 @@
 //!
 //! // Get extension information
 //! let mut projection: Projection = item.extension().unwrap().unwrap();
-//! println!("epsg: {}", projection.epsg.unwrap());
+//! println!("code: {}", projection.code.as_ref().unwrap());
 //!
 //! // Set extension information
 //! projection.centroid = Some(Centroid { lat: 34.595302, lon: -101.344483 });
@@ -112,7 +112,7 @@ pub trait Extensions: Fields {
     /// use stac::{Item, extensions::{Projection, Extensions}};
     /// let mut item = Item::new("an-id");
     /// assert!(!item.has_extension::<Projection>());
-    /// let projection = Projection { epsg: Some(4326), ..Default::default() };
+    /// let projection = Projection { code: Some("EPSG:4326".to_string()), ..Default::default() };
     /// item.set_extension(projection).unwrap();
     /// assert!(item.has_extension::<Projection>());
     /// ```
@@ -132,7 +132,7 @@ pub trait Extensions: Fields {
     /// use stac::{Item, extensions::{Projection, Extensions}};
     /// let item: Item = stac::read("examples/extensions-collection/proj-example/proj-example.json").unwrap();
     /// let projection: Projection = item.extension().unwrap().unwrap();
-    /// assert_eq!(projection.epsg.unwrap(), 32614);
+    /// assert_eq!(projection.code.unwrap(), "EPSG:32614");
     /// ```
     fn extension<E: Extension>(&self) -> Result<Option<E>> {
         if self.has_extension::<E>() {
@@ -165,7 +165,7 @@ pub trait Extensions: Fields {
     /// ```
     /// use stac::{Item, extensions::{Projection, Extensions}};
     /// let mut item = Item::new("an-id");
-    /// let projection = Projection { epsg: Some(4326), ..Default::default() };
+    /// let projection = Projection { code: Some("EPSG:4326".to_string()), ..Default::default() };
     /// item.set_extension(projection).unwrap();
     /// ```
     fn set_extension<E: Extension>(&mut self, extension: E) -> Result<()> {
@@ -229,31 +229,17 @@ mod tests {
         assert!(asset.has_extension::<Raster>());
         let mut item = Item::new("an-id");
         let _ = item.assets.insert("data".to_string(), asset);
-
-        // TODO how do we let items know about what their assets are doing?
-        // Maybe we don't?
-        // assert!(item.has_extension::<Raster>());
-        // let item = serde_json::to_value(item).unwrap();
-        // assert_eq!(
-        //     item.as_object()
-        //         .unwrap()
-        //         .get("stac_extensions")
-        //         .unwrap()
-        //         .as_array()
-        //         .unwrap(),
-        //     &vec!["https://stac-extensions.github.io/raster/v1.1.0/schema.json"]
-        // );
     }
 
     #[test]
     fn remove_extension() {
         let mut item = Item::new("an-id");
         item.extensions
-            .push("https://stac-extensions.github.io/projection/v1.1.0/schema.json".to_string());
+            .push("https://stac-extensions.github.io/projection/v2.0.0/schema.json".to_string());
         let _ = item
             .properties
             .additional_fields
-            .insert("proj:epsg".to_string(), json!(4326));
+            .insert("proj:code".to_string(), json!("EPSG:4326"));
         assert!(item.has_extension::<Projection>());
         item.remove_extension::<Projection>();
         assert!(!item.has_extension::<Projection>());
diff --git a/core/src/extensions/projection.rs b/core/src/extensions/projection.rs
index 2d4abf71..e45075b5 100644
--- a/core/src/extensions/projection.rs
+++ b/core/src/extensions/projection.rs
@@ -10,7 +10,7 @@ use serde_json::{Map, Value};
 pub struct Projection {
     /// EPSG code of the datasource
     #[serde(skip_serializing_if = "Option::is_none")]
-    pub epsg: Option<i32>,
+    pub code: Option<String>,
 
     /// WKT2 string representing the Coordinate Reference System (CRS) that the
     /// proj:geometry and proj:bbox fields represent
@@ -56,14 +56,14 @@ pub struct Centroid {
 impl Projection {
     /// Returns this projection's bounds in WGS84.
     ///
-    /// Requires one of the crs fields to be set (epsg, wkt2, or projjson) as well as a bbox.
+    /// Requires one of the crs fields to be set (code, wkt2, or projjson) as well as a bbox.
     ///
     /// # Examples
     ///
     /// ```
     /// use stac::extensions::Projection;
     /// let projection = Projection {
-    ///     epsg: Some(32621),
+    ///     code: Some("EPSG:32621".to_string()),
     ///     bbox: Some(vec![
     ///         373185.0,
     ///         8019284.949381611,
@@ -109,8 +109,8 @@ impl Projection {
         use crate::Error;
         use gdal::spatial_ref::SpatialRef;
 
-        if let Some(epsg) = self.epsg {
-            SpatialRef::from_epsg(epsg.try_into()?)
+        if let Some(code) = self.code.as_deref() {
+            SpatialRef::from_definition(code)
                 .map(Some)
                 .map_err(Error::from)
         } else if let Some(wkt) = self.wkt2.as_ref() {
@@ -127,19 +127,20 @@ impl Projection {
 
 impl Extension for Projection {
     const IDENTIFIER: &'static str =
-        "https://stac-extensions.github.io/projection/v1.1.0/schema.json";
+        "https://stac-extensions.github.io/projection/v2.0.0/schema.json";
     const PREFIX: &'static str = "proj";
 }
 
 #[cfg(test)]
 mod tests {
+    use super::Projection;
+    use crate::{Extensions, Item};
+
     #[cfg(feature = "gdal")]
     #[test]
     fn axis_order() {
-        use super::Projection;
-
         let projection = Projection {
-            epsg: Some(32621),
+            code: Some("EPSG:32621".to_string()),
             bbox: Some(vec![
                 373185.0,
                 8019284.949381611,
@@ -156,4 +157,12 @@ mod tests {
         );
         assert!((bounds.ymin() - 72.229798).abs() < 0.1);
     }
+
+    #[test]
+    fn example() {
+        let item: Item =
+            crate::read("examples/extensions-collection/proj-example/proj-example.json").unwrap();
+        let projection = item.extension::<Projection>().unwrap().unwrap();
+        assert_eq!(projection.code.unwrap(), "EPSG:32614");
+    }
 }
diff --git a/core/src/fields.rs b/core/src/fields.rs
index 701e5124..7cc1a713 100644
--- a/core/src/fields.rs
+++ b/core/src/fields.rs
@@ -100,7 +100,7 @@ pub trait Fields {
     ///
     /// ```
     /// use stac::{Fields, Item, extensions::Projection};
-    /// let projection = Projection { epsg: Some(4326), ..Default::default() };
+    /// let projection = Projection { code: Some("EPSG:4326".to_string()), ..Default::default() };
     /// let mut item = Item::new("an-id");
     /// item.set_fields_with_prefix("proj", projection);  // Prefer `Extensions::set_extension`
     /// ```
@@ -122,7 +122,7 @@ pub trait Fields {
     ///
     /// ```
     /// use stac::{Fields, Item, extensions::Projection};
-    /// let projection = Projection { epsg: Some(4326), ..Default::default() };
+    /// let projection = Projection { code: Some("EPSG:4326".to_string()), ..Default::default() };
     /// let mut item = Item::new("an-id");
     /// item.remove_fields_with_prefix("proj");  // Prefer `Extensions::remove_extension`
     /// ```
diff --git a/core/src/gdal.rs b/core/src/gdal.rs
index c7126c49..373012f8 100644
--- a/core/src/gdal.rs
+++ b/core/src/gdal.rs
@@ -123,10 +123,13 @@ fn update_asset(
             .map(|auth_name| auth_name == "EPSG")
             .unwrap_or_default()
         {
-            projection.epsg = spatial_ref.auth_code().ok();
+            projection.code = spatial_ref
+                .auth_code()
+                .map(|code| format!("EPSG:{}", code))
+                .ok();
         }
         // FIXME Don't know how to get WKT2 out of the gdal crate yet.
-        if projection.epsg.is_none() {
+        if projection.code.is_none() {
             projection.projjson = spatial_ref
                 .to_projjson()
                 .ok()
@@ -223,7 +226,7 @@ mod tests {
             .unwrap();
         super::update_item(&mut item, false, true).unwrap();
         let projection: Projection = item.extension().unwrap().unwrap();
-        assert_eq!(projection.epsg.unwrap(), 32621);
+        assert_eq!(projection.code.unwrap(), "EPSG:32621");
         assert_eq!(
             projection.bbox.unwrap(),
             vec![373185.0, 8019284.949381611, 639014.9492102272, 8286015.0]
diff --git a/core/src/lib.rs b/core/src/lib.rs
index 4adda253..5d95acaf 100644
--- a/core/src/lib.rs
+++ b/core/src/lib.rs
@@ -56,7 +56,7 @@
 //! use stac::{Value, Migrate, Version};
 //!
 //! let value: Value = stac::read("examples/simple-item.json").unwrap();
-//! let value = value.migrate(&Version::v1_1_0_beta_1).unwrap();
+//! let value = value.migrate(&Version::v1_1_0).unwrap();
 //! ```
 //!
 //! # Input and output
@@ -204,7 +204,7 @@ pub use {
 };
 
 /// The default STAC version of this library.
-pub const STAC_VERSION: Version = Version::v1_0_0;
+pub const STAC_VERSION: Version = Version::v1_1_0;
 
 /// Custom [Result](std::result::Result) type for this crate.
 pub type Result<T> = std::result::Result<T, Error>;
@@ -385,7 +385,7 @@ mod tests {
         ($function:ident, $filename:expr, $object:ident) => {
             #[test]
             fn $function() {
-                use assert_json_diff::assert_json_eq;
+                use assert_json_diff::{assert_json_matches, CompareMode, Config, NumericMode};
                 use chrono::{DateTime, Utc};
                 use serde_json::Value;
                 use std::{fs::File, io::BufReader};
@@ -439,7 +439,11 @@ mod tests {
                 }
                 let object: $object = serde_json::from_value(before.clone()).unwrap();
                 let after = serde_json::to_value(object).unwrap();
-                assert_json_eq!(before, after);
+                assert_json_matches!(
+                    before,
+                    after,
+                    Config::new(CompareMode::Strict).numeric_mode(NumericMode::AssumeFloat)
+                );
             }
         };
     }
diff --git a/core/src/migrate.rs b/core/src/migrate.rs
index 3e2dc38b..0fc0f1a9 100644
--- a/core/src/migrate.rs
+++ b/core/src/migrate.rs
@@ -13,8 +13,8 @@ pub trait Migrate: Sized + Serialize + DeserializeOwned + std::fmt::Debug {
     /// use stac::{Item, Migrate, Version};
     ///
     /// let mut item: Item = stac::read("../spec-examples/v1.0.0/simple-item.json").unwrap();
-    /// let item = item.migrate(&Version::v1_1_0_beta_1).unwrap();
-    /// assert_eq!(item.version, Version::v1_1_0_beta_1);
+    /// let item = item.migrate(&Version::v1_1_0).unwrap();
+    /// assert_eq!(item.version, Version::v1_1_0);
     /// ```
     fn migrate(self, to: &Version) -> Result<Self> {
         let mut value = serde_json::to_value(self)?;
@@ -42,6 +42,7 @@ pub trait Migrate: Sized + Serialize + DeserializeOwned + std::fmt::Debug {
 #[allow(non_camel_case_types)]
 enum Step {
     v1_0_0_to_v1_1_0_beta_1,
+    v1_0_0_to_v1_1_0,
 }
 
 impl Version {
@@ -50,13 +51,27 @@ impl Version {
             Version::v1_0_0 => match to {
                 Version::v1_0_0 => Ok(Vec::new()),
                 Version::v1_1_0_beta_1 => Ok(vec![Step::v1_0_0_to_v1_1_0_beta_1]),
+                Version::v1_1_0 => Ok(vec![Step::v1_0_0_to_v1_1_0]),
                 _ => Err(Error::UnsupportedMigration(self, to.clone())),
             },
             Version::v1_1_0_beta_1 => match to {
                 Version::v1_1_0_beta_1 => Ok(Vec::new()),
                 _ => Err(Error::UnsupportedMigration(self, to.clone())),
             },
-            Version::Unknown(_) => Err(Error::UnsupportedMigration(self, to.clone())),
+            Version::v1_1_0 => match to {
+                Version::v1_1_0 => Ok(Vec::new()),
+                _ => Err(Error::UnsupportedMigration(self, to.clone())),
+            },
+            Version::Unknown(ref from) => match to {
+                Version::Unknown(to_str) => {
+                    if from == to_str {
+                        Ok(Vec::new())
+                    } else {
+                        Err(Error::UnsupportedMigration(self, to.clone()))
+                    }
+                }
+                _ => Err(Error::UnsupportedMigration(self, to.clone())),
+            },
         }
     }
 }
@@ -65,7 +80,7 @@ impl Step {
     fn migrate(&self, mut value: Value) -> Result<Value> {
         if let Some(mut object) = value.as_object_mut() {
             match self {
-                Step::v1_0_0_to_v1_1_0_beta_1 => {
+                Step::v1_0_0_to_v1_1_0_beta_1 | Step::v1_0_0_to_v1_1_0 => {
                     if let Some(assets) = object.get_mut("assets").and_then(|v| v.as_object_mut()) {
                         for asset in assets.values_mut().filter_map(|v| v.as_object_mut()) {
                             migrate_bands(asset)?;
@@ -214,9 +229,9 @@ mod tests {
     use serde_json::Value;
 
     #[test]
-    fn migrate_v1_0_0_to_v1_1_0_beta_1() {
+    fn migrate_v1_0_0_to_v1_1_0() {
         let item: Item = crate::read("data/bands-v1.0.0.json").unwrap();
-        let item = item.migrate(&Version::v1_1_0_beta_1).unwrap();
+        let item = item.migrate(&Version::v1_1_0).unwrap();
         let asset = &item.assets["example"];
         assert_eq!(asset.data_type.as_ref().unwrap(), &DataType::UInt16);
         assert_eq!(asset.bands[0].name.as_ref().unwrap(), "r");
@@ -225,17 +240,18 @@ mod tests {
         assert_eq!(asset.bands[3].name.as_ref().unwrap(), "nir");
 
         let expected: Value =
-            serde_json::to_value(crate::read::<Item>("data/bands-v1.1.0-beta.1.json").unwrap())
-                .unwrap();
+            serde_json::to_value(crate::read::<Item>("data/bands-v1.1.0.json").unwrap()).unwrap();
         assert_json_eq!(expected, serde_json::to_value(item).unwrap());
 
-        let collection = Collection::new("an-id", "a description");
-        let collection = collection.migrate(&Version::v1_1_0_beta_1).unwrap();
+        let mut collection = Collection::new("an-id", "a description");
+        collection.version = Version::v1_0_0;
+        let collection = collection.migrate(&Version::v1_1_0).unwrap();
         assert_eq!(collection.license, "other");
 
         let mut item = Item::new("an-id");
+        item.version = Version::v1_0_0;
         item.set_link(Link::self_("/an/absolute/href"));
-        let item = item.migrate(&Version::v1_1_0_beta_1).unwrap();
+        let item = item.migrate(&Version::v1_1_0).unwrap();
         assert_eq!(item.link("self").unwrap().href, "file:///an/absolute/href");
     }
 
@@ -243,8 +259,14 @@ mod tests {
     fn remove_empty_bands() {
         // https://github.com/stac-utils/stac-rs/issues/350
         let item: Item = crate::read("data/20201211_223832_CS2.json").unwrap();
-        let item = item.migrate(&Version::v1_1_0_beta_1).unwrap();
+        let item = item.migrate(&Version::v1_1_0).unwrap();
         let asset = &item.assets["data"];
         assert!(asset.bands.is_empty());
     }
+
+    #[test]
+    fn migrate_v1_1_0_to_v1_1_0() {
+        let item: Item = crate::read("../spec-examples/v1.1.0/simple-item.json").unwrap();
+        let _ = item.migrate(&Version::v1_1_0).unwrap();
+    }
 }
diff --git a/core/src/mime.rs b/core/src/mime.rs
index 1d09ba23..82237b9c 100644
--- a/core/src/mime.rs
+++ b/core/src/mime.rs
@@ -82,3 +82,15 @@ pub const APPLICATION_HDF: &str = "application/x-hdf";
 
 /// The OpenAPI 3.0 content type.
 pub const APPLICATION_OPENAPI_3_0: &str = "application/vnd.oai.openapi+json;version=3.0";
+
+/// [COPC](https://copc.io/) Cloud optimized point cloud
+pub const APPLICATION_COPC: &str = "application/vnd.laszip+copc";
+
+/// Apache [Geoparquet](https://geoparquet.org/)
+pub const APPLICATION_PARQUET: &str = "application/vnd.apache.parquet";
+
+/// [OGC 3D Tiles](https://www.ogc.org/standard/3dtiles/)       
+pub const APPLICATION_3DTILES: &str = "application/3dtiles+json";
+
+/// Protomaps [PMTiles](https://github.com/protomaps/PMTiles/blob/main/spec/v3/spec.md)
+pub const APPLICATION_PMTILES: &str = "application/vnd.pmtiles";
diff --git a/core/src/version.rs b/core/src/version.rs
index b234b170..2aa5c376 100644
--- a/core/src/version.rs
+++ b/core/src/version.rs
@@ -14,6 +14,10 @@ pub enum Version {
     #[serde(rename = "1.1.0-beta.1")]
     v1_1_0_beta_1,
 
+    /// [v1.1.0](https://github.com/radiantearth/stac-spec/releases/tag/v1.1.0)
+    #[serde(rename = "1.1.0")]
+    v1_1_0,
+
     /// An unknown STAC version.
     #[serde(untagged)]
     Unknown(String),
@@ -26,6 +30,7 @@ impl FromStr for Version {
         match s {
             "1.0.0" => Ok(Version::v1_0_0),
             "1.1.0-beta.1" => Ok(Version::v1_1_0_beta_1),
+            "1.1.0" => Ok(Version::v1_1_0),
             _ => Ok(Version::Unknown(s.to_string())),
         }
     }
@@ -39,6 +44,7 @@ impl Display for Version {
             match self {
                 Version::v1_0_0 => "1.0.0",
                 Version::v1_1_0_beta_1 => "1.1.0-beta.1",
+                Version::v1_1_0 => "1.1.0",
                 Version::Unknown(v) => v,
             }
         )
diff --git a/python/examples b/python/examples
index 188ec763..dc8ca857 120000
--- a/python/examples
+++ b/python/examples
@@ -1,1 +1,1 @@
-../spec-examples/v1.0.0
\ No newline at end of file
+../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/scripts/validate-stac-geoparquet b/scripts/validate-stac-geoparquet
index cea54f44..04aca91f 100755
--- a/scripts/validate-stac-geoparquet
+++ b/scripts/validate-stac-geoparquet
@@ -13,7 +13,7 @@ import stac_geoparquet.arrow
 import pyarrow
 
 root = Path(__file__).parents[1]
-path = root / "spec-examples" / "v1.0.0" / "extended-item.json"
+path = root / "spec-examples" / "v1.1.0" / "extended-item.json"
 directory = tempfile.mkdtemp()
 parquet_path = Path(directory) / "extended-item.parquet"
 
diff --git a/spec-examples/v1.1.0/README.md b/spec-examples/v1.1.0/README.md
new file mode 100644
index 00000000..a5f8d3f6
--- /dev/null
+++ b/spec-examples/v1.1.0/README.md
@@ -0,0 +1,91 @@
+# STAC Examples
+
+This directory contains various examples for all parts of the STAC specification.
+It is structured to be two valid STACs, meaning both [catalog.json](catalog.json) and [collection.json](collection.json)
+should successfully load in various tools. They do not follow *all* the [best practices](../best-practices.md) for STAC, mostly
+due to the fact that they contrive examples to show the spec and we are hosting in GitHub. But we note below where they differ from an ideal catalog.
+
+The various fields are mostly fictional, to be able to demonstrate the various aspects of the spec as tersely as possible. To get a sense
+of real world STAC implementations we recommend exploring the [stac-examples](http://github.com/stac-utils/stac-examples) repo, which 
+gathers in one place copies of STAC [Items](../item-spec/item-spec.md) and [Collection](../collection-spec/collection-spec.md) 
+from a number of different production catalogs that all follow good STAC practices. And you should also explore the various catalogs
+listed on [STAC Index](http://stacindex.org), to see full catalogs in production.
+
+## Organization
+
+This directory contains two STAC implementations, both valid, but simplified a bit to be illustrative of the key concepts, so 
+they do not quite follow all the best practices. 
+
+### Simple Collection
+
+This STAC implementation consists of three files, all contained at the root of the examples directory
+
+**[collection.json](collection.json)** is a minimal 'simple collection', that links to three items. 
+
+**[simple-item.json](simple-item.json)** is the most minimal possible compliant Item record. Most all data will
+include additional fields, as STAC is designed to be a minimal common subset. But it is useful for showing exactly what is
+required.
+
+**[core-item.json](core-item.json)** is a more realistic example, for a hypothetical analytic image 
+acquisition from a satellite company called 'Remote Data'. It includes additional fields covering the [common 
+metadata](../commons/common-metadata.md). It also links to a variety of assets that is typical for
+satellite imagery, as most providers include a number of complementary files.
+
+**[extended-item.json](extended-item.json)** is arguably an even more realistic example, as it includes a number of the
+[extensions](../extensions/) that are commonly used, to demonstrate how implementations tend to start with the core, and add in
+a number of the core extensions. 
+
+**[collectionless-item.json](collectionless-item.json)** demonstrates the common metadata that is only used when an Item does not have 
+a collection. It is recommended to organize items in collections, but we wanted to show how this works. This is not technically in the
+'simple collection' of this section, but it follows the same pattern, so is included here.
+
+### Nested Catalog
+
+This STAC implementation shows a common pattern, starting with a catalog that links to a number of distinct collections, which may
+link down to a number of items.
+
+**[catalog.json](catalog.json)** is a minimal catalog implementation, linking to two other collections.
+
+**[collection-only/collection.json](collection-only/collection.json)** is a collection that does not link to any items. This
+demonstrates how is is possible to make use of STAC Collections without needing items, to serve as nice summarizing metadata for 
+tools that work with full layers / collections. This example collection is based on real Sentinel-2 values, so is not quite fictional,
+but should be taken as just an example.
+
+**[extensions-collection/collection.json](extensions-collection/collection.json)** contains a small number of items, that demonstrate
+more functionality available in STAC [extensions](../extensions/). These are linked to directly from the individual extensions. These
+items follow the recommendations for [Catalog Layout Best Practices](../best-practices.md#catalog-layout).
+
+## In Depth
+
+As mentioned above, the files in this examples directory form valid STAC implementations. They are all based on a 
+fictional remote sensing company called 'Remote Data', with a URL at remotedata.io. This domain has not been set up, so those links
+will not work, but any valid data provider should provide valid links to their homepage. 
+
+The examples use the `rd:` prefix to show how providers can use custom fields when there are not set fields. In the examples these
+do not link to a schema which is completely valid, but it is recommended that providers do write a JSON schema that can validate 
+their custom fields (we will work to add an example schema for the `rd:` fields in the future). 
+
+### Catalog Type
+
+One of the most important STAC Best Practices is to [use links consistently](../best-practices.md#use-of-links), following one of the
+described 'catalog types'. The catalogs described here are [Relative Published Catalogs](../best-practices.md#relative-published-catalog),
+that use absolute URL's to refer to their assets (so would be an example of a [Self-contained Metadata 
+Only](../best-practices.md#self-contained-metadata-only) catalog that is published).
+
+### Differences with STAC Best Practices
+
+One of the most important documents in this repository is the one about [best practices](../best-practices.md). It describes a number
+of practical recommendations gained by people actually implementing STAC. The core spec is designed to be as flexible as possible, so
+that it is not too rigid and unable to handle unanticipated needs. But we recommend following as many of the best practices as is 
+feasible, as it will help ensure various STAC tools work much better. The examples in this folder don't align with all the best
+practices, mostly because they are meant to demonstrate things as tersely as possible, and also because they live directly inside
+a github repository. As many people will look at these examples and take them as 'how things should be' we felt its important to
+highlight where things here differ from the actual best practices.
+
+#### Catalog Layout
+
+Another important recommendations concerns the [layout of STAC catalogs](../best-practices.md#catalog-layout). This is important
+for tools to be able to expect a certain layout, and most tools will follow the described layout. The simple collection that consists
+of the collection.json and its 3 linked items violates this. This is done to be able to show item examples directly in the root of
+the 'examples' folder, so people don't have to dig deep into folders to get a quick example. But a proper catalog layout would
+put the items in sub-directories, along with their assets.
diff --git a/spec-examples/v1.1.0/catalog.json b/spec-examples/v1.1.0/catalog.json
new file mode 100644
index 00000000..a9fe3ef8
--- /dev/null
+++ b/spec-examples/v1.1.0/catalog.json
@@ -0,0 +1,43 @@
+{
+  "id": "examples",
+  "type": "Catalog",
+  "title": "Example Catalog",
+  "stac_version": "1.1.0",
+  "description": "This catalog is a simple demonstration of an example catalog that is used to organize a hierarchy of collections and their items.",
+  "links": [
+    {
+      "rel": "root",
+      "href": "./catalog.json",
+      "type": "application/json"
+    },
+    {
+      "rel": "child",
+      "href": "./extensions-collection/collection.json",
+      "type": "application/json",
+      "title": "Collection Demonstrating STAC Extensions"
+    },
+    {
+      "rel": "child",
+      "href": "./collection-only/collection.json",
+      "type": "application/json",
+      "title": "Collection with no items (standalone)"
+    },
+    {
+      "rel": "child",
+      "href": "./collection-only/collection-with-schemas.json",
+      "type": "application/json",
+      "title": "Collection with no items (standalone with JSON Schemas)"
+    },
+    {
+      "rel": "item",
+      "href": "./collectionless-item.json",
+      "type": "application/json",
+      "title": "Item that does not have a collection (not recommended, but allowed by the spec)"
+    },
+    {
+      "rel": "self",
+      "href": "https://raw.githubusercontent.com/radiantearth/stac-spec/v1.1.0/examples/catalog.json",
+      "type": "application/json"
+    }
+  ]
+}
diff --git a/spec-examples/v1.1.0/collection-only/collection-with-schemas.json b/spec-examples/v1.1.0/collection-only/collection-with-schemas.json
new file mode 100644
index 00000000..471da1d3
--- /dev/null
+++ b/spec-examples/v1.1.0/collection-only/collection-with-schemas.json
@@ -0,0 +1,311 @@
+{
+  "stac_version": "1.1.0",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/sat/v1.0.0/schema.json",
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+  ],
+  "id": "sentinel-2",
+  "type": "Collection",
+  "title": "Sentinel-2 MSI: MultiSpectral Instrument, Level-2A",
+  "description": "The SENTINEL-2 mission is a land monitoring constellation of two satellites each equipped with a MSI (Multispectral Imager) instrument covering 13 spectral bands providing high resolution optical imagery (i.e., 10m, 20m, 60 m) every 10 days with one satellite and 5 days with two satellites",
+  "license": "other",
+  "extent": {
+    "spatial": {
+      "bbox": [
+        [
+          -180,
+          -82.852377834669,
+          180,
+          82.819463367711
+        ]
+      ]
+    },
+    "temporal": {
+      "interval": [
+        [
+          "2017-04-12T02:57:21.459000Z",
+          "2021-04-22T11:30:12.767000Z"
+        ]
+      ]
+    }
+  },
+  "links": [
+    {
+      "rel": "parent",
+      "href": "../catalog.json",
+      "type": "application/json",
+      "title": "Example Catalog"
+    },
+    {
+      "rel": "root",
+      "href": "../catalog.json",
+      "type": "application/json",
+      "title": "Example Catalog"
+    },
+    {
+      "rel": "license",
+      "href": "https://scihub.copernicus.eu/twiki/pub/SciHubWebPortal/TermsConditions/Sentinel_Data_Terms_and_Conditions.pdf",
+      "title": "Legal notice on the use of Copernicus Sentinel Data and Service Information"
+    }
+  ],
+  "providers": [
+    {
+      "name": "European Union/ESA/Copernicus",
+      "roles": [
+        "producer",
+        "licensor"
+      ],
+      "url": "https://sentinel.esa.int/web/sentinel/user-guides/sentinel-2-msi"
+    },
+    {
+      "name": "AWS",
+      "roles": [
+        "host"
+      ],
+      "url": "https://registry.opendata.aws/sentinel-2/"
+    },
+    {
+      "name": "jeobrowser",
+      "roles": [
+        "processor"
+      ],
+      "url": "https://github.com/jjrom/resto"
+    }
+  ],
+  "summaries": {
+    "datetime": {
+      "minimum": "2017-04-12T02:57:21Z",
+      "maximum": "2021-04-22T11:30:12Z"
+    },
+    "instruments": {
+      "type": "string",
+      "const": "msi",
+      "title": "Multispectral Instrument",
+      "count": 6613431
+    },
+    "resto:landcover": {
+      "type": "string",
+      "oneOf": [
+        {
+          "const": "cultivated",
+          "title": "Cultivated",
+          "count": 490750
+        },
+        {
+          "const": "desert",
+          "title": "Desert",
+          "count": 543120
+        },
+        {
+          "const": "flooded",
+          "title": "Flooded",
+          "count": 5187
+        },
+        {
+          "const": "forest",
+          "title": "Forest",
+          "count": 767807
+        },
+        {
+          "const": "herbaceous",
+          "title": "Herbaceous",
+          "count": 674281
+        },
+        {
+          "const": "ice",
+          "title": "Ice",
+          "count": 231285
+        },
+        {
+          "const": "urban",
+          "title": "Urban",
+          "count": 1219
+        },
+        {
+          "const": "water",
+          "title": "Water",
+          "count": 2303314
+        }
+      ]
+    },
+    "resto:location": {
+      "type": "string",
+      "oneOf": [
+        {
+          "const": "tropical",
+          "title": "Tropical",
+          "count": 1807474
+        },
+        {
+          "const": "southern",
+          "title": "Southern",
+          "count": 1671685
+        },
+        {
+          "const": "northern",
+          "title": "Northern",
+          "count": 4876669
+        },
+        {
+          "const": "equatorial",
+          "title": "Equatorial",
+          "count": 27302
+        },
+        {
+          "const": "coastal",
+          "title": "Coastal",
+          "count": 1495516
+        }
+      ]
+    },
+    "platform": {
+      "type": "string",
+      "oneOf": [
+        {
+          "const": "sentinel-2b",
+          "title": "Sentinel 2B",
+          "count": 3495597
+        },
+        {
+          "const": "sentinel-2a",
+          "title": "Sentinel 2A",
+          "count": 3117831
+        }
+      ]
+    },
+    "resto:season": {
+      "type": "integer",
+      "oneOf": [
+        {
+          "const": 0,
+          "title": "Winter",
+          "count": 1621108
+        },
+        {
+          "const": 2,
+          "title": "Summer",
+          "count": 2279472
+        },
+        {
+          "const": 1,
+          "title": "Spring",
+          "count": 1577067
+        },
+        {
+          "const": 3,
+          "title": "Autumn",
+          "count": 1098015
+        }
+      ]
+    },
+    "bands": [
+      {
+        "title": "B1",
+        "eo:common_name": "coastal",
+        "eo:center_wavelength": 0.4439,
+        "gsd": 60
+      },
+      {
+        "title": "B2",
+        "eo:common_name": "blue",
+        "eo:center_wavelength": 0.4966,
+        "gsd": 10
+      },
+      {
+        "title": "B3",
+        "eo:common_name": "green",
+        "eo:center_wavelength": 0.56,
+        "gsd": 10
+      },
+      {
+        "title": "B4",
+        "eo:common_name": "red",
+        "eo:center_wavelength": 0.6645,
+        "gsd": 10
+      },
+      {
+        "title": "B5",
+        "eo:center_wavelength": 0.7039,
+        "gsd": 20
+      },
+      {
+        "title": "B6",
+        "eo:center_wavelength": 0.7402,
+        "gsd": 20
+      },
+      {
+        "title": "B7",
+        "eo:center_wavelength": 0.7825,
+        "gsd": 20
+      },
+      {
+        "title": "B8",
+        "eo:common_name": "nir",
+        "eo:center_wavelength": 0.8351,
+        "gsd": 10
+      },
+      {
+        "title": "B8A",
+        "eo:center_wavelength": 0.8648,
+        "gsd": 20
+      },
+      {
+        "title": "B9",
+        "eo:center_wavelength": 0.945,
+        "gsd": 60
+      },
+      {
+        "title": "B10",
+        "eo:center_wavelength": 0.13735,
+        "gsd": 60
+      },
+      {
+        "title": "B11",
+        "eo:common_name": "swir16",
+        "eo:center_wavelength": 0.16137,
+        "gsd": 20
+      },
+      {
+        "title": "B12",
+        "eo:common_name": "swir22",
+        "eo:center_wavelength": 0.22024,
+        "gsd": 20
+      }
+    ]
+  },
+  "item_assets": {
+    "B1": {
+      "title": "Band 1 (coastal)",
+      "type": "image/tiff; application=geotiff",
+      "roles": [
+        "data",
+        "visual"
+      ]
+    },
+    "B2": {
+      "title": "Band 2 (blue)",
+      "type": "image/tiff; application=geotiff",
+      "roles": [
+        "data",
+        "visual"
+      ]
+    },
+    "B3": {
+      "title": "Band 3 (green)",
+      "type": "image/tiff; application=geotiff",
+      "roles": [
+        "data",
+        "visual"
+      ]
+    },
+    "B4": {
+      "title": "Band 4 (red)",
+      "type": "image/tiff; application=geotiff",
+      "roles": [
+        "data",
+        "visual"
+      ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/spec-examples/v1.1.0/collection-only/collection.json b/spec-examples/v1.1.0/collection-only/collection.json
new file mode 100644
index 00000000..ca5db9cd
--- /dev/null
+++ b/spec-examples/v1.1.0/collection-only/collection.json
@@ -0,0 +1,233 @@
+{
+  "type": "Collection",
+  "stac_version": "1.1.0",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+  ],
+  "id": "sentinel-2",
+  "title": "Sentinel-2 MSI: MultiSpectral Instrument, Level-1C",
+  "description": "Sentinel-2 is a wide-swath, high-resolution, multi-spectral\nimaging mission supporting Copernicus Land Monitoring studies,\nincluding the monitoring of vegetation, soil and water cover,\nas well as observation of inland waterways and coastal areas.\n\nThe Sentinel-2 data contain 13 UINT16 spectral bands representing\nTOA reflectance scaled by 10000. See the [Sentinel-2 User Handbook](https://sentinel.esa.int/documents/247904/685211/Sentinel-2_User_Handbook)\nfor details. In addition, three QA bands are present where one\n(QA60) is a bitmask band with cloud mask information. For more\ndetails, [see the full explanation of how cloud masks are computed.](https://sentinel.esa.int/web/sentinel/technical-guides/sentinel-2-msi/level-1c/cloud-masks)\n\nEach Sentinel-2 product (zip archive) may contain multiple\ngranules. Each granule becomes a separate Earth Engine asset.\nEE asset ids for Sentinel-2 assets have the following format:\nCOPERNICUS/S2/20151128T002653_20151128T102149_T56MNN. Here the\nfirst numeric part represents the sensing date and time, the\nsecond numeric part represents the product generation date and\ntime, and the final 6-character string is a unique granule identifier\nindicating its UTM grid reference (see [MGRS](https://en.wikipedia.org/wiki/Military_Grid_Reference_System)).\n\nFor more details on Sentinel-2 radiometric resoltuon, [see this page](https://earth.esa.int/web/sentinel/user-guides/sentinel-2-msi/resolutions/radiometric).\n",
+  "license": "other",
+  "keywords": [
+    "copernicus",
+    "esa",
+    "eu",
+    "msi",
+    "radiance",
+    "sentinel"
+  ],
+  "providers": [
+    {
+      "name": "European Union/ESA/Copernicus",
+      "roles": [
+        "producer",
+        "licensor"
+      ],
+      "url": "https://sentinel.esa.int/web/sentinel/user-guides/sentinel-2-msi"
+    }
+  ],
+  "extent": {
+    "spatial": {
+      "bbox": [
+        [
+          -180,
+          -56,
+          180,
+          83
+        ]
+      ]
+    },
+    "temporal": {
+      "interval": [
+        [
+          "2015-06-23T00:00:00Z",
+          null
+        ]
+      ]
+    }
+  },
+  "assets": {
+    "metadata_iso_19139": {
+      "roles": [
+        "metadata",
+        "iso-19139"
+      ],
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/sentinel-2-iso-19139.xml",
+      "title": "ISO 19139 metadata",
+      "type": "application/vnd.iso.19139+xml"
+    }
+  },
+  "summaries": {
+    "datetime": {
+      "minimum": "2015-06-23T00:00:00Z",
+      "maximum": "2019-07-10T13:44:56Z"
+    },
+    "platform": [
+      "sentinel-2a",
+      "sentinel-2b"
+    ],
+    "constellation": [
+      "sentinel-2"
+    ],
+    "instruments": [
+      "msi"
+    ],
+    "view:off_nadir": {
+      "minimum": 0,
+      "maximum": 100
+    },
+    "view:sun_elevation": {
+      "minimum": 6.78,
+      "maximum": 89.9
+    },
+    "gsd": [
+      10,
+      30,
+      60
+    ],
+    "proj:code": [
+      "EPSG:32601",
+      "EPSG:32602",
+      "EPSG:32603",
+      "EPSG:32604",
+      "EPSG:32605",
+      "EPSG:32606",
+      "EPSG:32607",
+      "EPSG:32608",
+      "EPSG:32609",
+      "EPSG:32610",
+      "EPSG:32611",
+      "EPSG:32612",
+      "EPSG:32613",
+      "EPSG:32614",
+      "EPSG:32615",
+      "EPSG:32616",
+      "EPSG:32617",
+      "EPSG:32618",
+      "EPSG:32619",
+      "EPSG:32620",
+      "EPSG:32621",
+      "EPSG:32622",
+      "EPSG:32623",
+      "EPSG:32624",
+      "EPSG:32625",
+      "EPSG:32626",
+      "EPSG:32627",
+      "EPSG:32628",
+      "EPSG:32629",
+      "EPSG:32630",
+      "EPSG:32631",
+      "EPSG:32632",
+      "EPSG:32633",
+      "EPSG:32634",
+      "EPSG:32635",
+      "EPSG:32636",
+      "EPSG:32637",
+      "EPSG:32638",
+      "EPSG:32639",
+      "EPSG:32640",
+      "EPSG:32641",
+      "EPSG:32642",
+      "EPSG:32643",
+      "EPSG:32644",
+      "EPSG:32645",
+      "EPSG:32646",
+      "EPSG:32647",
+      "EPSG:32648",
+      "EPSG:32649",
+      "EPSG:32650",
+      "EPSG:32651",
+      "EPSG:32652",
+      "EPSG:32653",
+      "EPSG:32654",
+      "EPSG:32655",
+      "EPSG:32656",
+      "EPSG:32657",
+      "EPSG:32658",
+      "EPSG:32659",
+      "EPSG:32660"
+    ],
+    "bands": [
+      {
+        "name": "B1",
+        "eo:common_name": "coastal",
+        "eo:center_wavelength": 0.4439
+      },
+      {
+        "name": "B2",
+        "eo:common_name": "blue",
+        "eo:center_wavelength": 0.4966
+      },
+      {
+        "name": "B3",
+        "eo:common_name": "green",
+        "eo:center_wavelength": 0.56
+      },
+      {
+        "name": "B4",
+        "eo:common_name": "red",
+        "eo:center_wavelength": 0.6645
+      },
+      {
+        "name": "B5",
+        "eo:center_wavelength": 0.7039
+      },
+      {
+        "name": "B6",
+        "eo:center_wavelength": 0.7402
+      },
+      {
+        "name": "B7",
+        "eo:center_wavelength": 0.7825
+      },
+      {
+        "name": "B8",
+        "eo:common_name": "nir",
+        "eo:center_wavelength": 0.8351
+      },
+      {
+        "name": "B8A",
+        "eo:center_wavelength": 0.8648
+      },
+      {
+        "name": "B9",
+        "eo:center_wavelength": 0.945
+      },
+      {
+        "name": "B10",
+        "eo:center_wavelength": 1.3735
+      },
+      {
+        "name": "B11",
+        "eo:common_name": "swir16",
+        "eo:center_wavelength": 1.6137
+      },
+      {
+        "name": "B12",
+        "eo:common_name": "swir22",
+        "eo:center_wavelength": 2.2024
+      }
+    ]
+  },
+  "links": [
+    {
+      "rel": "parent",
+      "href": "../catalog.json",
+      "type": "application/json",
+      "title": "Example Catalog"
+    },
+    {
+      "rel": "root",
+      "href": "../catalog.json",
+      "type": "application/json",
+      "title": "Example Catalog"
+    },
+    {
+      "rel": "license",
+      "href": "https://scihub.copernicus.eu/twiki/pub/SciHubWebPortal/TermsConditions/Sentinel_Data_Terms_and_Conditions.pdf",
+      "title": "Legal notice on the use of Copernicus Sentinel Data and Service Information"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/spec-examples/v1.1.0/collection.json b/spec-examples/v1.1.0/collection.json
new file mode 100644
index 00000000..9de9cbea
--- /dev/null
+++ b/spec-examples/v1.1.0/collection.json
@@ -0,0 +1,136 @@
+{
+  "id": "simple-collection",
+  "type": "Collection",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+  ],
+  "stac_version": "1.1.0",
+  "description": "A simple collection demonstrating core catalog fields with links to a couple of items",
+  "title": "Simple Example Collection",
+  "keywords": [
+    "simple",
+    "example",
+    "collection"
+  ],
+  "providers": [
+    {
+      "name": "Remote Data, Inc",
+      "description": "Producers of awesome spatiotemporal assets",
+      "roles": [
+        "producer",
+        "processor"
+      ],
+      "url": "http://remotedata.io"
+    }
+  ],
+  "extent": {
+    "spatial": {
+      "bbox": [
+        [
+          172.91173669923782,
+          1.3438851951615003,
+          172.95469614953714,
+          1.3690476620161975
+        ]
+      ]
+    },
+    "temporal": {
+      "interval": [
+        [
+          "2020-12-11T22:38:32.125Z",
+          "2020-12-14T18:02:31.437Z"
+        ]
+      ]
+    }
+  },
+  "license": "CC-BY-4.0",
+  "summaries": {
+    "platform": [
+      "cool_sat1",
+      "cool_sat2"
+    ],
+    "constellation": [
+      "ion"
+    ],
+    "instruments": [
+      "cool_sensor_v1",
+      "cool_sensor_v2"
+    ],
+    "gsd": {
+      "minimum": 0.512,
+      "maximum": 0.66
+    },
+    "eo:cloud_cover": {
+      "minimum": 1.2,
+      "maximum": 1.2
+    },
+    "proj:cpde": [
+      "EPSG:32659"
+    ],
+    "view:sun_elevation": {
+      "minimum": 54.9,
+      "maximum": 54.9
+    },
+    "view:off_nadir": {
+      "minimum": 3.8,
+      "maximum": 3.8
+    },
+    "view:sun_azimuth": {
+      "minimum": 135.7,
+      "maximum": 135.7
+    },
+    "statistics": {
+      "type": "object",
+      "properties": {
+        "vegetation": {
+          "description": "Percentage of pixels that are detected as vegetation, e.g. forests, grasslands, etc.",
+          "minimum": 0,
+          "maximum": 100
+        },
+        "water": {
+          "description": "Percentage of pixels that are detected as water, e.g. rivers, oceans and ponds.",
+          "minimum": 0,
+          "maximum": 100
+        },
+        "urban": {
+          "description": "Percentage of pixels that detected as urban, e.g. roads and buildings.",
+          "minimum": 0,
+          "maximum": 100
+        }
+      }
+    }
+  },
+  "links": [
+    {
+      "rel": "root",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "item",
+      "href": "./simple-item.json",
+      "type": "application/geo+json",
+      "title": "Simple Item"
+    },
+    {
+      "rel": "item",
+      "href": "./core-item.json",
+      "type": "application/geo+json",
+      "title": "Core Item"
+    },
+    {
+      "rel": "item",
+      "href": "./extended-item.json",
+      "type": "application/geo+json",
+      "title": "Extended Item"
+    },
+    {
+      "rel": "self",
+      "href": "https://raw.githubusercontent.com/radiantearth/stac-spec/v1.1.0/examples/collection.json",
+      "type": "application/json"
+    }
+  ]
+}
diff --git a/spec-examples/v1.1.0/collectionless-item.json b/spec-examples/v1.1.0/collectionless-item.json
new file mode 100644
index 00000000..3562d665
--- /dev/null
+++ b/spec-examples/v1.1.0/collectionless-item.json
@@ -0,0 +1,143 @@
+{
+  "stac_version": "1.1.0",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+  ],
+  "type": "Feature",
+  "id": "CS3-20160503_132131_08",
+  "bbox": [
+    -122.59750209,
+    37.48803556,
+    -122.2880486,
+    37.613537207
+  ],
+  "geometry": {
+    "type": "Polygon",
+    "coordinates": [
+      [
+        [
+          -122.308150179,
+          37.488035566
+        ],
+        [
+          -122.597502109,
+          37.538869539
+        ],
+        [
+          -122.576687533,
+          37.613537207
+        ],
+        [
+          -122.2880486,
+          37.562818007
+        ],
+        [
+          -122.308150179,
+          37.488035566
+        ]
+      ]
+    ]
+  },
+  "properties": {
+    "title": "Full Item",
+    "description": "A sample STAC Item demonstrates an Item that does not have a collection, which is not recommended, but allowed by the spec.",
+    "datetime": null,
+    "start_datetime": "2016-05-03T13:22:30Z",
+    "end_datetime": "2016-05-03T13:27:30Z",
+    "created": "2016-05-04T00:00:01Z",
+    "updated": "2017-01-01T00:30:55Z",
+    "license": "other",
+    "providers": [
+      {
+        "name": "Remote Data, Inc",
+        "description": "Producers of awesome spatiotemporal assets",
+        "roles": [
+          "producer",
+          "processor"
+        ],
+        "url": "http://remotedata.it"
+      }
+    ],
+    "platform": "cool_sat2",
+    "instruments": [
+      "cool_sensor_v1"
+    ],
+    "view:sun_elevation": 33.4,
+    "gsd": 0.512,
+    "cs:type": "scene",
+    "cs:anomalous_pixels": 0.14,
+    "cs:earth_sun_distance": 1.014156,
+    "cs:sat_id": "CS3",
+    "cs:product_level": "LV1B"
+  },
+  "links": [
+    {
+      "rel": "root",
+      "href": "./catalog.json",
+      "type": "application/json",
+      "title": "Example Catalog"
+    },
+    {
+      "rel": "parent",
+      "href": "./catalog.json",
+      "type": "application/json",
+      "title": "Example Catalog"
+    },
+    {
+      "rel": "alternate",
+      "type": "text/html",
+      "href": "http://cool-sat.com/catalog/CS3-20160503_132130_04/CS3-20160503_132130_04.html",
+      "title": "HTML representation of this STAC Item"
+    },
+    {
+      "rel": "license",
+      "type": "text/html",
+      "href": "http://remotedata.io/license.html",
+      "title": "Data License for Remote Data, Inc."
+    }
+  ],
+  "assets": {
+    "analytic": {
+      "href": "http://cool-sat.com/catalog/CS3-20160503_132130_04/analytic.tif",
+      "title": "4-Band Analytic",
+      "bands": [
+        {
+          "name": "band1"
+        },
+        {
+          "name": "band1"
+        },
+        {
+          "name": "band2"
+        },
+        {
+          "name": "band3"
+        }
+      ]
+    },
+    "thumbnail": {
+      "href": "http://cool-sat.com/catalog/CS3-20160503_132130_04/thumbnail.png",
+      "title": "Thumbnail",
+      "type": "image/png",
+      "roles": [
+        "thumbnail"
+      ]
+    },
+    "udm": {
+      "href": "http://cool-sat.com/catalog/CS3-20160503_132130_04/UDM.tif",
+      "title": "Unusable Data Mask"
+    },
+    "json-metadata": {
+      "href": "http://cool-sat.com/catalog/CS3-20160503_132130_04/extended-metadata.json",
+      "title": "Extended Metadata",
+      "type": "application/json",
+      "roles": [
+        "metadata"
+      ]
+    },
+    "ephemeris": {
+      "href": "http://cool-sat.com/catalog/CS3-20160503_132130_04/S3-20160503_132130_04.EPH",
+      "title": "Satellite Ephemeris Metadata"
+    }
+  }
+}
diff --git a/spec-examples/v1.1.0/core-item.json b/spec-examples/v1.1.0/core-item.json
new file mode 100644
index 00000000..e151b135
--- /dev/null
+++ b/spec-examples/v1.1.0/core-item.json
@@ -0,0 +1,125 @@
+{
+  "stac_version": "1.1.0",
+  "stac_extensions": [],
+  "type": "Feature",
+  "id": "20201211_223832_CS2",
+  "bbox": [
+    172.91173669923782,
+    1.3438851951615003,
+    172.95469614953714,
+    1.3690476620161975
+  ],
+  "geometry": {
+    "type": "Polygon",
+    "coordinates": [
+      [
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ]
+      ]
+    ]
+  },
+  "properties": {
+    "title": "Core Item",
+    "description": "A sample STAC Item that includes examples of all common metadata",
+    "datetime": null,
+    "start_datetime": "2020-12-11T22:38:32.125Z",
+    "end_datetime": "2020-12-11T22:38:32.327Z",
+    "created": "2020-12-12T01:48:13.725Z",
+    "updated": "2020-12-12T01:48:13.725Z",
+    "platform": "cool_sat1",
+    "instruments": [
+      "cool_sensor_v1"
+    ],
+    "constellation": "ion",
+    "mission": "collection 5624",
+    "gsd": 0.512
+  },
+  "collection": "simple-collection",
+  "links": [
+    {
+      "rel": "collection",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "root",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "parent",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "alternate",
+      "type": "text/html",
+      "href": "http://remotedata.io/catalog/20201211_223832_CS2/index.html",
+      "title": "HTML version of this STAC Item"
+    }
+  ],
+  "assets": {
+    "analytic": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2_analytic.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "4-Band Analytic",
+      "roles": [
+        "data"
+      ]
+    },
+    "thumbnail": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.jpg",
+      "title": "Thumbnail",
+      "type": "image/png",
+      "roles": [
+        "thumbnail"
+      ]
+    },
+    "visual": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "3-Band Visual",
+      "roles": [
+        "visual"
+      ]
+    },
+    "udm": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2_analytic_udm.tif",
+      "title": "Unusable Data Mask",
+      "type": "image/tiff; application=geotiff"
+    },
+    "json-metadata": {
+      "href": "http://remotedata.io/catalog/20201211_223832_CS2/extended-metadata.json",
+      "title": "Extended Metadata",
+      "type": "application/json",
+      "roles": [
+        "metadata"
+      ]
+    },
+    "ephemeris": {
+      "href": "http://cool-sat.com/catalog/20201211_223832_CS2/20201211_223832_CS2.EPH",
+      "title": "Satellite Ephemeris Metadata"
+    }
+  }
+}
diff --git a/spec-examples/v1.1.0/extended-item.json b/spec-examples/v1.1.0/extended-item.json
new file mode 100644
index 00000000..b5f3a0a9
--- /dev/null
+++ b/spec-examples/v1.1.0/extended-item.json
@@ -0,0 +1,210 @@
+{
+  "stac_version": "1.1.0",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/scientific/v1.0.0/schema.json",
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json",
+    "https://stac-extensions.github.io/remote-data/v1.0.0/schema.json"
+  ],
+  "type": "Feature",
+  "id": "20201211_223832_CS2",
+  "bbox": [
+    172.91173669923782,
+    1.3438851951615003,
+    172.95469614953714,
+    1.3690476620161975
+  ],
+  "geometry": {
+    "type": "Polygon",
+    "coordinates": [
+      [
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ]
+      ]
+    ]
+  },
+  "properties": {
+    "title": "Extended Item",
+    "description": "A sample STAC Item that includes a variety of examples from the stable extensions",
+    "keywords": [
+      "extended",
+      "example",
+      "item"
+    ],
+    "datetime": "2020-12-14T18:02:31.437000Z",
+    "created": "2020-12-15T01:48:13.725Z",
+    "updated": "2020-12-15T01:48:13.725Z",
+    "platform": "cool_sat2",
+    "instruments": [
+      "cool_sensor_v2"
+    ],
+    "gsd": 0.66,
+    "eo:cloud_cover": 1.2,
+    "eo:snow_cover": 0,
+    "statistics": {
+      "vegetation": 12.57,
+      "water": 1.23,
+      "urban": 26.2
+    },
+    "proj:code": "EPSG:32659",
+    "proj:shape": [
+      5558,
+      9559
+    ],
+    "proj:transform": [
+      0.5,
+      0,
+      712710,
+      0,
+      -0.5,
+      151406,
+      0,
+      0,
+      1
+    ],
+    "view:sun_elevation": 54.9,
+    "view:off_nadir": 3.8,
+    "view:sun_azimuth": 135.7,
+    "rd:type": "scene",
+    "rd:anomalous_pixels": 0.14,
+    "rd:earth_sun_distance": 1.014156,
+    "rd:sat_id": "cool_sat2",
+    "rd:product_level": "LV3A",
+    "sci:doi": "10.5061/dryad.s2v81.2/27.2"
+  },
+  "collection": "simple-collection",
+  "links": [
+    {
+      "rel": "collection",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "root",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "parent",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "alternate",
+      "type": "text/html",
+      "href": "http://remotedata.io/catalog/20201211_223832_CS2/index.html",
+      "title": "HTML version of this STAC Item"
+    }
+  ],
+  "assets": {
+    "analytic": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2_analytic.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "4-Band Analytic",
+      "roles": [
+        "data"
+      ],
+      "bands": [
+        {
+          "name": "band1",
+          "eo:common_name": "blue",
+          "eo:center_wavelength": 0.47,
+          "eo:full_width_half_max": 70
+        },
+        {
+          "name": "band2",
+          "eo:common_name": "green",
+          "eo:center_wavelength": 0.56,
+          "eo:full_width_half_max": 80
+        },
+        {
+          "name": "band3",
+          "eo:common_name": "red",
+          "eo:center_wavelength": 0.645,
+          "eo:full_width_half_max": 90
+        },
+        {
+          "name": "band4",
+          "eo:common_name": "nir",
+          "eo:center_wavelength": 0.8,
+          "eo:full_width_half_max": 152
+        }
+      ]
+    },
+    "thumbnail": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.jpg",
+      "title": "Thumbnail",
+      "type": "image/png",
+      "roles": [
+        "thumbnail"
+      ]
+    },
+    "visual": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "3-Band Visual",
+      "roles": [
+        "visual"
+      ],
+      "bands": [
+        {
+          "name": "band3",
+          "eo:common_name": "red",
+          "eo:center_wavelength": 0.645,
+          "eo:full_width_half_max": 90
+        },
+        {
+          "name": "band2",
+          "eo:common_name": "green",
+          "eo:center_wavelength": 0.56,
+          "eo:full_width_half_max": 80
+        },
+        {
+          "name": "band1",
+          "eo:common_name": "blue",
+          "eo:center_wavelength": 0.47,
+          "eo:full_width_half_max": 70
+        }
+      ]
+    },
+    "udm": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2_analytic_udm.tif",
+      "title": "Unusable Data Mask",
+      "type": "image/tiff; application=geotiff"
+    },
+    "json-metadata": {
+      "href": "http://remotedata.io/catalog/20201211_223832_CS2/extended-metadata.json",
+      "title": "Extended Metadata",
+      "type": "application/json",
+      "roles": [
+        "metadata"
+      ]
+    },
+    "ephemeris": {
+      "href": "http://cool-sat.com/catalog/20201211_223832_CS2/20201211_223832_CS2.EPH",
+      "title": "Satellite Ephemeris Metadata"
+    }
+  }
+}
\ No newline at end of file
diff --git a/spec-examples/v1.1.0/extensions-collection/collection.json b/spec-examples/v1.1.0/extensions-collection/collection.json
new file mode 100644
index 00000000..825f76ac
--- /dev/null
+++ b/spec-examples/v1.1.0/extensions-collection/collection.json
@@ -0,0 +1,68 @@
+{
+  "id": "extensions-collection",
+  "type": "Collection",
+  "stac_version": "1.1.0",
+  "description": "A heterogeneous collection containing deeper examples of various extensions",
+  "links": [
+    {
+      "rel": "parent",
+      "href": "../catalog.json",
+      "type": "application/json",
+      "title": "Example Catalog"
+    },
+    {
+      "rel": "root",
+      "href": "../catalog.json",
+      "type": "application/json",
+      "title": "Example Catalog"
+    },
+    {
+      "rel": "item",
+      "href": "./proj-example/proj-example.json",
+      "title": "Proj extension example"
+    },
+    {
+      "rel": "license",
+      "href": "https://remotedata.io/license.html",
+      "title": "Remote Data License Terms"
+    }
+  ],
+  "stac_extensions": [],
+  "title": "Collection of Extension Items",
+  "keywords": [
+    "examples",
+    "sar",
+    "projection"
+  ],
+  "providers": [
+    {
+      "name": "Remote Data, Inc.",
+      "roles": [
+        "producer",
+        "licensor"
+      ],
+      "url": "https://remotedata.io"
+    }
+  ],
+  "extent": {
+    "spatial": {
+      "bbox": [
+        [
+          -180,
+          -56,
+          180,
+          83
+        ]
+      ]
+    },
+    "temporal": {
+      "interval": [
+        [
+          "2009-05-20T02:40:01.042784Z",
+          "2018-11-03T23:59:55.112875Z"
+        ]
+      ]
+    }
+  },
+  "license": "other"
+}
diff --git a/spec-examples/v1.1.0/extensions-collection/proj-example/proj-example.json b/spec-examples/v1.1.0/extensions-collection/proj-example/proj-example.json
new file mode 100644
index 00000000..2884e388
--- /dev/null
+++ b/spec-examples/v1.1.0/extensions-collection/proj-example/proj-example.json
@@ -0,0 +1,285 @@
+{
+  "type": "Feature",
+  "stac_version": "1.1.0",
+  "id": "proj-example",
+  "properties": {
+    "datetime": "2018-10-01T01:08:32.033000Z",
+    "proj:code": "EPSG:32614",
+    "proj:wkt2": "PROJCS[\"WGS 84 / UTM zone 14N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-99],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],AUTHORITY[\"EPSG\",\"32614\"],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH]]",
+    "proj:projjson": {
+      "$schema": "https://proj.org/schemas/v0.2/projjson.schema.json",
+      "type": "ProjectedCRS",
+      "name": "WGS 84 / UTM zone 14N",
+      "base_crs": {
+        "name": "WGS 84",
+        "datum": {
+          "type": "GeodeticReferenceFrame",
+          "name": "World Geodetic System 1984",
+          "ellipsoid": {
+            "name": "WGS 84",
+            "semi_major_axis": 6378137,
+            "inverse_flattening": 298.257223563
+          }
+        },
+        "coordinate_system": {
+          "subtype": "ellipsoidal",
+          "axis": [
+            {
+              "name": "Geodetic latitude",
+              "abbreviation": "Lat",
+              "direction": "north",
+              "unit": "degree"
+            },
+            {
+              "name": "Geodetic longitude",
+              "abbreviation": "Lon",
+              "direction": "east",
+              "unit": "degree"
+            }
+          ]
+        },
+        "id": {
+          "authority": "EPSG",
+          "code": 4326
+        }
+      },
+      "conversion": {
+        "name": "UTM zone 14N",
+        "method": {
+          "name": "Transverse Mercator",
+          "id": {
+            "authority": "EPSG",
+            "code": 9807
+          }
+        },
+        "parameters": [
+          {
+            "name": "Latitude of natural origin",
+            "value": 0,
+            "unit": "degree",
+            "id": {
+              "authority": "EPSG",
+              "code": 8801
+            }
+          },
+          {
+            "name": "Longitude of natural origin",
+            "value": -99,
+            "unit": "degree",
+            "id": {
+              "authority": "EPSG",
+              "code": 8802
+            }
+          },
+          {
+            "name": "Scale factor at natural origin",
+            "value": 0.9996,
+            "unit": "unity",
+            "id": {
+              "authority": "EPSG",
+              "code": 8805
+            }
+          },
+          {
+            "name": "False easting",
+            "value": 500000,
+            "unit": "metre",
+            "id": {
+              "authority": "EPSG",
+              "code": 8806
+            }
+          },
+          {
+            "name": "False northing",
+            "value": 0,
+            "unit": "metre",
+            "id": {
+              "authority": "EPSG",
+              "code": 8807
+            }
+          }
+        ]
+      },
+      "coordinate_system": {
+        "subtype": "Cartesian",
+        "axis": [
+          {
+            "name": "Easting",
+            "abbreviation": "E",
+            "direction": "east",
+            "unit": "metre"
+          },
+          {
+            "name": "Northing",
+            "abbreviation": "N",
+            "direction": "north",
+            "unit": "metre"
+          }
+        ]
+      },
+      "area": "World - N hemisphere - 102°W to 96°W - by country",
+      "bbox": {
+        "south_latitude": 0,
+        "west_longitude": -102,
+        "north_latitude": 84,
+        "east_longitude": -96
+      },
+      "id": {
+        "authority": "EPSG",
+        "code": 32614
+      }
+    },
+    "proj:geometry": {
+      "coordinates": [
+        [
+          [
+            169200,
+            3712800
+          ],
+          [
+            403200,
+            3712800
+          ],
+          [
+            403200,
+            3951000
+          ],
+          [
+            169200,
+            3951000
+          ],
+          [
+            169200,
+            3712800
+          ]
+        ]
+      ],
+      "type": "Polygon"
+    },
+    "proj:bbox": [
+      169200,
+      3712800,
+      403200,
+      3951000
+    ],
+    "proj:centroid": {
+      "lat": 34.595302781575604,
+      "lon": -101.34448382627504
+    },
+    "proj:shape": [
+      8391,
+      8311
+    ],
+    "proj:transform": [
+      30,
+      0,
+      224985,
+      0,
+      -30,
+      6790215,
+      0,
+      0,
+      1
+    ]
+  },
+  "geometry": {
+    "type": "Polygon",
+    "coordinates": [
+      [
+        [
+          152.52758,
+          60.63437
+        ],
+        [
+          149.1755,
+          61.19016
+        ],
+        [
+          148.13933,
+          59.51584
+        ],
+        [
+          151.33786,
+          58.97792
+        ],
+        [
+          152.52758,
+          60.63437
+        ]
+      ]
+    ]
+  },
+  "links": [
+    {
+      "rel": "root",
+      "href": "../../catalog.json",
+      "type": "application/json",
+      "title": "Example Catalog"
+    },
+    {
+      "rel": "parent",
+      "href": "../collection.json",
+      "type": "application/json",
+      "title": "Collection of Extension Items"
+    },
+    {
+      "rel": "collection",
+      "href": "../collection.json",
+      "type": "application/json",
+      "title": "Collection of Extension Items"
+    }
+  ],
+  "assets": {
+    "B1": {
+      "href": "https://landsat-pds.s3.amazonaws.com/c1/L8/107/018/LC08_L1TP_107018_20181001_20181001_01_RT/LC08_L1TP_107018_20181001_20181001_01_RT_B1.TIF",
+      "type": "image/tiff; application=geotiff",
+      "title": "Band 1 (coastal)",
+      "bands": [
+        {
+          "name": "B1",
+          "eo:common_name": "coastal",
+          "eo:center_wavelength": 0.44,
+          "eo:full_width_half_max": 0.02
+        }
+      ]
+    },
+    "B8": {
+      "href": "https://landsat-pds.s3.amazonaws.com/c1/L8/107/018/LC08_L1TP_107018_20181001_20181001_01_RT/LC08_L1TP_107018_20181001_20181001_01_RT_B8.TIF",
+      "type": "image/tiff; application=geotiff",
+      "title": "Band 8 (panchromatic)",
+      "bands": [
+        {
+          "name": "B8",
+          "eo:center_wavelength": 0.59,
+          "eo:full_width_half_max": 0.18
+        }
+      ],
+      "proj:shape": [
+        16781,
+        16621
+      ],
+      "proj:transform": [
+        15,
+        0,
+        224992.5,
+        0,
+        -15,
+        6790207.5,
+        0,
+        0,
+        1
+      ]
+    }
+  },
+  "bbox": [
+    148.13933,
+    59.51584,
+    152.52758,
+    60.63437
+  ],
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
+  ],
+  "collection": "landsat-8-l1"
+}
diff --git a/spec-examples/v1.1.0/simple-item.json b/spec-examples/v1.1.0/simple-item.json
new file mode 100644
index 00000000..449352ed
--- /dev/null
+++ b/spec-examples/v1.1.0/simple-item.json
@@ -0,0 +1,81 @@
+{
+  "stac_version": "1.1.0",
+  "stac_extensions": [],
+  "type": "Feature",
+  "id": "20201211_223832_CS2",
+  "bbox": [
+    172.91173669923782,
+    1.3438851951615003,
+    172.95469614953714,
+    1.3690476620161975
+  ],
+  "geometry": {
+    "type": "Polygon",
+    "coordinates": [
+      [
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ]
+      ]
+    ]
+  },
+  "properties": {
+    "datetime": "2020-12-11T22:38:32.125000Z"
+  },
+  "collection": "simple-collection",
+  "links": [
+    {
+      "rel": "collection",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "root",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "parent",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    }
+  ],
+  "assets": {
+    "visual": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "3-Band Visual",
+      "roles": [
+        "visual"
+      ]
+    },
+    "thumbnail": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.jpg",
+      "title": "Thumbnail",
+      "type": "image/jpeg",
+      "roles": [
+        "thumbnail"
+      ]
+    }
+  }
+}
diff --git a/validate/CHANGELOG.md b/validate/CHANGELOG.md
index 1b0ffad6..e2979164 100644
--- a/validate/CHANGELOG.md
+++ b/validate/CHANGELOG.md
@@ -6,7 +6,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 
 ## [Unreleased]
 
-## Changed
+### Added
+
+- STAC v1.1.0 schemas ([#399](https://github.com/stac-utils/stac-rs/pull/399))
+
+### Changed
 
 - Moved to async-first, with a blocking interface ([#397](https://github.com/stac-utils/stac-rs/pull/397))
 
diff --git a/validate/examples b/validate/examples
index 188ec763..dc8ca857 120000
--- a/validate/examples
+++ b/validate/examples
@@ -1,1 +1,1 @@
-../spec-examples/v1.0.0
\ No newline at end of file
+../spec-examples/v1.1.0
\ No newline at end of file
diff --git a/validate/schemas/v1.1.0/bands.json b/validate/schemas/v1.1.0/bands.json
new file mode 100644
index 00000000..94ec087a
--- /dev/null
+++ b/validate/schemas/v1.1.0/bands.json
@@ -0,0 +1,24 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/bands.json",
+  "title": "Bands Field",
+  "type": "object",
+  "properties": {
+    "bands": {
+      "type": "array",
+      "items": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string"
+          }
+        },
+        "allOf": [
+          {
+            "$ref": "common.json"
+          }
+        ]
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/validate/schemas/v1.1.0/basics.json b/validate/schemas/v1.1.0/basics.json
new file mode 100644
index 00000000..cc2f49a6
--- /dev/null
+++ b/validate/schemas/v1.1.0/basics.json
@@ -0,0 +1,34 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/basics.json",
+  "title": "Basic Descriptive Fields",
+  "type": "object",
+  "properties": {
+    "title": {
+      "title": "Title",
+      "description": "A human-readable title describing the entity.",
+      "type": "string"
+    },
+    "description": {
+      "title": "Description",
+      "description": "Detailed multi-line description to fully explain the entity.",
+      "type": "string",
+      "minLength": 1
+    },
+    "keywords": {
+      "title": "Keywords",
+      "description": "List of keywords describing the entity.",
+      "type": "array",
+      "items": {
+        "type": "string"
+      }
+    },
+    "roles": {
+      "title": "Roles",
+      "type": "array",
+      "items": {
+        "type": "string"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/validate/schemas/v1.1.0/catalog.json b/validate/schemas/v1.1.0/catalog.json
new file mode 100644
index 00000000..ca7efc15
--- /dev/null
+++ b/validate/schemas/v1.1.0/catalog.json
@@ -0,0 +1,57 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/catalog-spec/json-schema/catalog.json",
+  "title": "STAC Catalog Specification",
+  "description": "This object represents Catalogs in a SpatioTemporal Asset Catalog.",
+  "allOf": [
+    {
+      "$ref": "#/definitions/catalog"
+    },
+    {
+      "$ref": "../../item-spec/json-schema/common.json"
+    }
+  ],
+  "definitions": {
+    "catalog": {
+      "title": "STAC Catalog",
+      "type": "object",
+      "$comment": "title and description is validated through the common metadata.",
+      "required": [
+        "stac_version",
+        "type",
+        "id",
+        "description",
+        "links"
+      ],
+      "properties": {
+        "stac_version": {
+          "title": "STAC version",
+          "type": "string",
+          "const": "1.1.0"
+        },
+        "stac_extensions": {
+          "title": "STAC extensions",
+          "type": "array",
+          "uniqueItems": true,
+          "items": {
+            "title": "Reference to a JSON Schema",
+            "type": "string",
+            "format": "iri"
+          }
+        },
+        "type": {
+          "title": "Type of STAC entity",
+          "const": "Catalog"
+        },
+        "id": {
+          "title": "Identifier",
+          "type": "string",
+          "minLength": 1
+        },
+        "links": {
+          "$ref": "../../item-spec/json-schema/item.json#/definitions/links"
+        }
+      }
+    }
+  }
+}
diff --git a/validate/schemas/v1.1.0/collection.json b/validate/schemas/v1.1.0/collection.json
new file mode 100644
index 00000000..e9ef7431
--- /dev/null
+++ b/validate/schemas/v1.1.0/collection.json
@@ -0,0 +1,230 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/collection-spec/json-schema/collection.json",
+  "title": "STAC Collection Specification",
+  "description": "This object represents Collections in a SpatioTemporal Asset Catalog.",
+  "allOf": [
+    {
+      "$ref": "#/definitions/collection"
+    },
+    {
+      "$ref": "../../item-spec/json-schema/common.json"
+    }
+  ],
+  "definitions": {
+    "collection": {
+      "title": "STAC Collection",
+      "description": "These are the fields specific to a STAC Collection.",
+      "type": "object",
+      "$comment": "title, description, keywords, providers and license is validated through the common metadata.",
+      "required": [
+        "stac_version",
+        "type",
+        "id",
+        "description",
+        "license",
+        "extent",
+        "links"
+      ],
+      "properties": {
+        "stac_version": {
+          "title": "STAC version",
+          "type": "string",
+          "const": "1.1.0"
+        },
+        "stac_extensions": {
+          "title": "STAC extensions",
+          "type": "array",
+          "uniqueItems": true,
+          "items": {
+            "title": "Reference to a JSON Schema",
+            "type": "string",
+            "format": "iri"
+          }
+        },
+        "type": {
+          "title": "Type of STAC entity",
+          "const": "Collection"
+        },
+        "id": {
+          "title": "Identifier",
+          "type": "string",
+          "minLength": 1
+        },
+        "extent": {
+          "title": "Extents",
+          "type": "object",
+          "required": [
+            "spatial",
+            "temporal"
+          ],
+          "properties": {
+            "spatial": {
+              "title": "Spatial extent object",
+              "type": "object",
+              "required": [
+                "bbox"
+              ],
+              "properties": {
+                "bbox": {
+                  "title": "Spatial extents",
+                  "type": "array",
+                  "oneOf": [
+                    {
+                      "minItems": 1,
+                      "maxItems": 1
+                    },
+                    {
+                      "minItems": 3
+                    }
+                  ],
+                  "items": {
+                    "title": "Spatial extent",
+                    "type": "array",
+                    "oneOf": [
+                      {
+                        "minItems": 4,
+                        "maxItems": 4
+                      },
+                      {
+                        "minItems": 6,
+                        "maxItems": 6
+                      }
+                    ],
+                    "items": {
+                      "type": "number"
+                    }
+                  }
+                }
+              }
+            },
+            "temporal": {
+              "title": "Temporal extent object",
+              "type": "object",
+              "required": [
+                "interval"
+              ],
+              "properties": {
+                "interval": {
+                  "title": "Temporal extents",
+                  "type": "array",
+                  "minItems": 1,
+                  "items": {
+                    "title": "Temporal extent",
+                    "type": "array",
+                    "minItems": 2,
+                    "maxItems": 2,
+                    "items": {
+                      "type": [
+                        "string",
+                        "null"
+                      ],
+                      "format": "date-time",
+                      "pattern": "(\\+00:00|Z)$"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        "assets": {
+          "$ref": "../../item-spec/json-schema/item.json#/definitions/assets"
+        },
+        "item_assets": {
+          "additionalProperties": {
+            "allOf": [
+              {
+                "type": "object",
+                "minProperties": 2,
+                "properties": {
+                  "href": {
+                    "title": "Disallow href",
+                    "not": {}
+                  },
+                  "title": {
+                    "title": "Asset title",
+                    "type": "string"
+                  },
+                  "description": {
+                    "title": "Asset description",
+                    "type": "string"
+                  },
+                  "type": {
+                    "title": "Asset type",
+                    "type": "string"
+                  },
+                  "roles": {
+                    "title": "Asset roles",
+                    "type": "array",
+                    "items": {
+                      "type": "string"
+                    }
+                  }
+                }
+              },
+              {
+                "$ref": "../../item-spec/json-schema/common.json"
+              }
+            ]
+          }
+        },
+        "links": {
+          "$ref": "../../item-spec/json-schema/item.json#/definitions/links"
+        },
+        "summaries": {
+          "$ref": "#/definitions/summaries"
+        }
+      }
+    },
+    "summaries": {
+      "type": "object",
+      "additionalProperties": {
+        "anyOf": [
+          {
+            "title": "JSON Schema",
+            "type": "object",
+            "minProperties": 1,
+            "allOf": [
+              {
+                "$ref": "http://json-schema.org/draft-07/schema"
+              }
+            ]
+          },
+          {
+            "title": "Range",
+            "type": "object",
+            "required": [
+              "minimum",
+              "maximum"
+            ],
+            "properties": {
+              "minimum": {
+                "title": "Minimum value",
+                "type": [
+                  "number",
+                  "string"
+                ]
+              },
+              "maximum": {
+                "title": "Maximum value",
+                "type": [
+                  "number",
+                  "string"
+                ]
+              }
+            }
+          },
+          {
+            "title": "Set of values",
+            "type": "array",
+            "minItems": 1,
+            "items": {
+              "description": "For each field only the original data type of the property can occur (except for arrays), but we can't validate that in JSON Schema yet. See the sumamry description in the STAC specification for details."
+            }
+          }
+        ]
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/validate/schemas/v1.1.0/common.json b/validate/schemas/v1.1.0/common.json
new file mode 100644
index 00000000..2b947b03
--- /dev/null
+++ b/validate/schemas/v1.1.0/common.json
@@ -0,0 +1,30 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/commonjson",
+  "title": "STAC Common Metadata",
+  "type": "object",
+  "description": "This schema includes all common metadata fields.",
+  "allOf": [
+    {
+      "$ref": "basics.json"
+    },
+    {
+      "$ref": "bands.json"
+    },
+    {
+      "$ref": "datetime.json"
+    },
+    {
+      "$ref": "data-values.json"
+    },
+    {
+      "$ref": "instrument.json"
+    },
+    {
+      "$ref": "licensing.json"
+    },
+    {
+      "$ref": "provider.json"
+    }
+  ]
+}
diff --git a/validate/schemas/v1.1.0/data-values.json b/validate/schemas/v1.1.0/data-values.json
new file mode 100644
index 00000000..55fea87c
--- /dev/null
+++ b/validate/schemas/v1.1.0/data-values.json
@@ -0,0 +1,84 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/data-values.json#",
+  "title": "Fields related to data values",
+  "type": "object",
+  "properties": {
+    "data_type": {
+      "title": "Data type of the values",
+      "type": "string",
+      "enum": [
+        "int8",
+        "int16",
+        "int32",
+        "int64",
+        "uint8",
+        "uint16",
+        "uint32",
+        "uint64",
+        "float16",
+        "float32",
+        "float64",
+        "cint16",
+        "cint32",
+        "cfloat32",
+        "cfloat64",
+        "other"
+      ]
+    },
+    "nodata": {
+      "title": "No data value",
+      "oneOf": [
+        {
+          "type": "number"
+        },
+        {
+          "type": "string",
+          "enum": [
+            "nan",
+            "inf",
+            "-inf"
+          ]
+        }
+      ]
+    },
+    "statistics": {
+      "title": "Statistics",
+      "type": "object",
+      "minProperties": 1,
+      "properties": {
+        "minimum": {
+          "title": "Minimum value of all the data values",
+          "type": "number"
+        },
+        "maximum": {
+          "title": "Maximum value of all the data values",
+          "type": "number"
+        },
+        "mean": {
+          "title": "Mean value of all the data values",
+          "type": "number"
+        },
+        "stddev": {
+          "title": "Standard deviation value of all the data values",
+          "type": "number"
+        },
+        "count": {
+          "title": "Total number of all data values",
+          "type": "integer",
+          "minimum": 0
+        },
+        "valid_percent": {
+          "title": "Percentage of valid (not nodata) values",
+          "type": "number",
+          "minimum": 0,
+          "maximum": 100
+        }
+      }
+    },
+    "unit": {
+      "title": "Unit denomination of the data value",
+      "type": "string"
+    }
+  }
+}
\ No newline at end of file
diff --git a/validate/schemas/v1.1.0/datetime.json b/validate/schemas/v1.1.0/datetime.json
new file mode 100644
index 00000000..b4bc9261
--- /dev/null
+++ b/validate/schemas/v1.1.0/datetime.json
@@ -0,0 +1,53 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/datetime.json",
+  "title": "Date and Time Fields",
+  "type": "object",
+  "dependencies": {
+    "start_datetime": {
+      "required": [
+        "end_datetime"
+      ]
+    },
+    "end_datetime": {
+      "required": [
+        "start_datetime"
+      ]
+    }
+  },
+  "properties": {
+    "datetime": {
+      "title": "Date and Time",
+      "description": "The searchable date/time of the data, in UTC (Formatted in RFC 3339) ",
+      "type": ["string", "null"],
+      "format": "date-time",
+      "pattern": "(\\+00:00|Z)$"
+    },
+    "start_datetime": {
+      "title": "Start Date and Time",
+      "description": "The searchable start date/time of the data, in UTC (Formatted in RFC 3339) ",
+      "type": "string",
+      "format": "date-time",
+      "pattern": "(\\+00:00|Z)$"
+    }, 
+    "end_datetime": {
+      "title": "End Date and Time", 
+      "description": "The searchable end date/time of the data, in UTC (Formatted in RFC 3339) ",                  
+      "type": "string",
+      "format": "date-time",
+      "pattern": "(\\+00:00|Z)$"
+    },
+    "created": {
+      "title": "Creation Time",
+      "type": "string",
+      "format": "date-time",
+      "pattern": "(\\+00:00|Z)$"
+    },
+    "updated": {
+      "title": "Last Update Time",
+      "type": "string",
+      "format": "date-time",
+      "pattern": "(\\+00:00|Z)$"
+    }
+  }
+}
\ No newline at end of file
diff --git a/validate/schemas/v1.1.0/instrument.json b/validate/schemas/v1.1.0/instrument.json
new file mode 100644
index 00000000..ab974271
--- /dev/null
+++ b/validate/schemas/v1.1.0/instrument.json
@@ -0,0 +1,32 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/instrument.json",
+  "title": "Instrument Fields",
+  "type": "object",
+  "properties": {
+    "platform": {
+      "title": "Platform",
+      "type": "string"
+    },
+    "instruments": {
+      "title": "Instruments",
+      "type": "array",
+      "items": {
+        "type": "string"
+      }
+    },
+    "constellation": {
+      "title": "Constellation",
+      "type": "string"
+    },
+    "mission": {
+      "title": "Mission",
+      "type": "string"
+    },
+    "gsd": {
+      "title": "Ground Sample Distance",
+      "type": "number",
+      "exclusiveMinimum": 0
+    }
+  }
+}
\ No newline at end of file
diff --git a/validate/schemas/v1.1.0/item.json b/validate/schemas/v1.1.0/item.json
new file mode 100644
index 00000000..1c8c945b
--- /dev/null
+++ b/validate/schemas/v1.1.0/item.json
@@ -0,0 +1,347 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/item.json",
+  "title": "STAC Item",
+  "type": "object",
+  "description": "This object represents the metadata for an item in a SpatioTemporal Asset Catalog.",
+  "allOf": [
+    {
+      "$ref": "#/definitions/core"
+    }
+  ],
+  "definitions": {
+    "core": {
+      "allOf": [
+        {
+          "$ref": "https://geojson.org/schema/Feature.json"
+        },
+        {
+          "oneOf": [
+            {
+              "type": "object",
+              "required": [
+                "geometry",
+                "bbox"
+              ],
+              "properties": {
+                "geometry": {
+                  "$ref": "https://geojson.org/schema/Geometry.json"
+                },
+                "bbox": {
+                  "type": "array",
+                  "oneOf": [
+                    {
+                      "minItems": 4,
+                      "maxItems": 4
+                    },
+                    {
+                      "minItems": 6,
+                      "maxItems": 6
+                    }
+                  ],
+                  "items": {
+                    "type": "number"
+                  }
+                }
+              }
+            },
+            {
+              "type": "object",
+              "required": [
+                "geometry"
+              ],
+              "properties": {
+                "geometry": {
+                  "type": "null"
+                },
+                "bbox": {
+                  "not": {}
+                }
+              }
+            }
+          ]
+        },
+        {
+          "type": "object",
+          "required": [
+            "stac_version",
+            "id",
+            "links",
+            "assets",
+            "properties"
+          ],
+          "properties": {
+            "stac_version": {
+              "title": "STAC version",
+              "type": "string",
+              "const": "1.1.0"
+            },
+            "stac_extensions": {
+              "title": "STAC extensions",
+              "type": "array",
+              "uniqueItems": true,
+              "items": {
+                "title": "Reference to a JSON Schema",
+                "type": "string",
+                "format": "iri"
+              }
+            },
+            "id": {
+              "title": "Provider ID",
+              "description": "Provider item ID",
+              "type": "string",
+              "minLength": 1
+            },
+            "links": {
+              "$ref": "#/definitions/links"
+            },
+            "assets": {
+              "$ref": "#/definitions/assets"
+            },
+            "properties": {
+              "allOf": [
+                {
+                  "$ref": "common.json"
+                },
+                {
+                  "anyOf": [
+                    {
+                      "required": [
+                        "datetime"
+                      ],
+                      "properties": {
+                        "datetime": {
+                          "not": {
+                            "type": "null"
+                          }
+                        }
+                      }
+                    },
+                    {
+                      "required": [
+                        "datetime",
+                        "start_datetime",
+                        "end_datetime"
+                      ]
+                    }
+                  ]
+                }
+              ]
+            }
+          },
+          "$comment": "Rules enforcement for STAC Item",
+          "allOf": [
+            {
+              "if": {
+                "properties": {
+                  "links": {
+                    "contains": {
+                      "required": [
+                        "rel"
+                      ],
+                      "properties": {
+                        "rel": {
+                          "const": "collection"
+                        }
+                      }
+                    }
+                  }
+                }
+              },
+              "then": {
+                "required": [
+                  "collection"
+                ],
+                "properties": {
+                  "collection": {
+                    "title": "Collection ID",
+                    "description": "The ID of the STAC Collection this Item references to.",
+                    "type": "string",
+                    "minLength": 1
+                  }
+                }
+              },
+              "else": {
+                "properties": {
+                  "collection": {
+                    "not": {}
+                  }
+                }
+              }
+            },
+            {
+              "$comment": "The if-then-else below checks whether the bands field is given in assets or not. If not, allows bands in properties (then), otherwise, disallows bands in properties (else).",
+              "if": {
+                "$comment": "If there is no asset with bands...",
+                "required": [
+                  "assets"
+                ],
+                "properties": {
+                  "assets": {
+                    "type": "object",
+                    "additionalProperties": {
+                      "properties": {
+                        "bands": false
+                      }
+                    }
+                  }
+                }
+              },
+              "then": {
+                "$comment": "... then bands are not allowed in properties...",
+                "properties": {
+                  "properties": {
+                    "properties": {
+                      "bands": false
+                    }
+                  }
+                }
+              },
+              "else": {
+                "$comment": "... otherwise bands are allowed in properties.",
+                "properties": {
+                  "properties": {
+                    "$ref": "bands.json"
+                  }
+                }
+              }
+            }
+          ]
+        }
+      ]
+    },
+    "links": {
+      "title": "Item links",
+      "description": "Links to item relations",
+      "type": "array",
+      "items": {
+        "$ref": "#/definitions/link"
+      }
+    },
+    "link": {
+      "allOf": [
+        {
+          "type": "object",
+          "required": [
+            "rel",
+            "href"
+          ],
+          "properties": {
+            "href": {
+              "title": "Link reference",
+              "type": "string",
+              "format": "iri-reference",
+              "minLength": 1
+            },
+            "rel": {
+              "title": "Link relation type",
+              "type": "string",
+              "minLength": 1
+            },
+            "type": {
+              "title": "Link type",
+              "type": "string"
+            },
+            "title": {
+              "title": "Link title",
+              "type": "string"
+            },
+            "method": {
+              "title": "Link method",
+              "type": "string",
+              "pattern": "^[A-Z]+$",
+              "default": "GET"
+            },
+            "headers": {
+              "title": "Link headers",
+              "type": "object",
+              "additionalProperties": {
+                "oneOf": [
+                  {
+                    "type": "string"
+                  },
+                  {
+                    "type": "array",
+                    "items": {
+                      "type": "string"
+                    }
+                  }
+                ]
+              }
+            },
+            "body": {
+              "title": "Link body",
+              "$comment": "Any type is allowed."
+            }
+          },
+          "$comment": "Link with relationship `self` must be absolute URI",
+          "if": {
+            "properties": {
+              "rel": {
+                "const": "self"
+              }
+            }
+          },
+          "then": {
+            "properties": {
+              "href": {
+                "format": "iri"
+              }
+            }
+          }
+        },
+        {
+          "$ref": "common.json"
+        }
+      ]
+    },
+    "assets": {
+      "title": "Asset links",
+      "description": "Links to assets",
+      "type": "object",
+      "additionalProperties": {
+        "$ref": "#/definitions/asset"
+      }
+    },
+    "asset": {
+      "allOf": [
+        {
+          "type": "object",
+          "required": [
+            "href"
+          ],
+          "properties": {
+            "href": {
+              "title": "Asset reference",
+              "type": "string",
+              "format": "iri-reference",
+              "minLength": 1
+            },
+            "title": {
+              "title": "Asset title",
+              "type": "string"
+            },
+            "description": {
+              "title": "Asset description",
+              "type": "string"
+            },
+            "type": {
+              "title": "Asset type",
+              "type": "string"
+            },
+            "roles": {
+              "title": "Asset roles",
+              "type": "array",
+              "items": {
+                "type": "string"
+              }
+            }
+          }
+        },
+        {
+          "$ref": "common.json"
+        }
+      ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/validate/schemas/v1.1.0/licensing.json b/validate/schemas/v1.1.0/licensing.json
new file mode 100644
index 00000000..8f650712
--- /dev/null
+++ b/validate/schemas/v1.1.0/licensing.json
@@ -0,0 +1,12 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/licensing.json",
+  "title": "Licensing Fields",
+  "type": "object",
+  "properties": {
+    "license": {
+      "type": "string",
+      "pattern": "^[\\w\\-\\.\\+]+$"
+    }
+  }
+}
\ No newline at end of file
diff --git a/validate/schemas/v1.1.0/provider.json b/validate/schemas/v1.1.0/provider.json
new file mode 100644
index 00000000..92a98040
--- /dev/null
+++ b/validate/schemas/v1.1.0/provider.json
@@ -0,0 +1,47 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "$id": "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/provider.json",
+  "title": "Provider Fields",
+  "type": "object",
+  "properties": {
+    "providers": {
+      "title": "Providers",
+      "type": "array",
+      "items": {
+        "type": "object",
+        "required": [
+          "name"
+        ],
+        "properties": {
+          "name": {
+            "title": "Organization name",
+            "type": "string",
+            "minLength": 1
+          },
+          "description": {
+            "title": "Organization description",
+            "type": "string"
+          },
+          "roles": {
+            "title": "Organization roles",
+            "type": "array",
+            "items": {
+              "type": "string",
+              "enum": [
+                "producer",
+                "licensor",
+                "processor",
+                "host"
+              ]
+            }
+          },
+          "url": {
+            "title": "Organization homepage",
+            "type": "string",
+            "format": "iri"
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/validate/src/validator.rs b/validate/src/validator.rs
index a0eb1b33..2b57b4ac 100644
--- a/validate/src/validator.rs
+++ b/validate/src/validator.rs
@@ -310,6 +310,14 @@ fn schemas(compilation_options: &CompilationOptions) -> HashMap<Url, Arc<JSONSch
         "../schemas/v1.0.0/collection.json",
         schemas
     );
+    schema!(Item, v1_1_0, "../schemas/v1.1.0/item.json", schemas);
+    schema!(Catalog, v1_1_0, "../schemas/v1.1.0/catalog.json", schemas);
+    schema!(
+        Collection,
+        v1_1_0,
+        "../schemas/v1.1.0/collection.json",
+        schemas
+    );
 
     schemas
 }
@@ -326,6 +334,7 @@ fn cache() -> HashMap<Url, Arc<Value>> {
         };
     }
 
+    // General
     resolve!(
         "https://geojson.org/schema/Feature.json",
         "../schemas/geojson/Feature.json"
@@ -338,6 +347,8 @@ fn cache() -> HashMap<Url, Arc<Value>> {
         "http://json-schema.org/draft-07/schema",
         "../schemas/json-schema/draft-07.json"
     );
+
+    // STAC v1.0.0
     resolve!(
         "https://schemas.stacspec.org/v1.0.0/item-spec/json-schema/basics.json",
         "../schemas/v1.0.0/basics.json"
@@ -363,6 +374,44 @@ fn cache() -> HashMap<Url, Arc<Value>> {
         "../schemas/v1.0.0/provider.json"
     );
 
+    // STAC v1.1.0
+    resolve!(
+        "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/bands.json",
+        "../schemas/v1.1.0/bands.json"
+    );
+    resolve!(
+        "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/basics.json",
+        "../schemas/v1.1.0/basics.json"
+    );
+    resolve!(
+        "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/common.json",
+        "../schemas/v1.1.0/common.json"
+    );
+    resolve!(
+        "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/data-values.json",
+        "../schemas/v1.1.0/data-values.json"
+    );
+    resolve!(
+        "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/datetime.json",
+        "../schemas/v1.1.0/datetime.json"
+    );
+    resolve!(
+        "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/instrument.json",
+        "../schemas/v1.1.0/instrument.json"
+    );
+    resolve!(
+        "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/item.json",
+        "../schemas/v1.1.0/item.json"
+    );
+    resolve!(
+        "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/licensing.json",
+        "../schemas/v1.1.0/licensing.json"
+    );
+    resolve!(
+        "https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/provider.json",
+        "../schemas/v1.1.0/provider.json"
+    );
+
     cache
 }
 


Test patch:
diff --git a/cli/tests/smoke.rs b/cli/tests/smoke.rs
index 03b0c6ea..28392246 100644
--- a/cli/tests/smoke.rs
+++ b/cli/tests/smoke.rs
@@ -31,9 +31,9 @@ fn migrate() {
     let mut command = Command::cargo_bin("stacrs").unwrap();
     command
         .arg("migrate")
-        .arg("examples/simple-item.json")
+        .arg("../spec-examples/v1.0.0/simple-item.json")
         .arg("--version")
-        .arg("1.1.0-beta.1")
+        .arg("1.1.0")
         .assert()
         .success();
 }
diff --git a/core/tests/migrate.rs b/core/tests/migrate.rs
index 26abeca4..e5c31ba1 100644
--- a/core/tests/migrate.rs
+++ b/core/tests/migrate.rs
@@ -3,7 +3,7 @@ use stac::{Migrate, Value, Version};
 use std::path::PathBuf;
 
 #[rstest]
-fn v1_0_0_to_v1_1_0_beta_1(#[files("../spec-examples/v1.0.0/**/*.json")] path: PathBuf) {
+fn v1_0_0_to_v1_1_0(#[files("../spec-examples/v1.0.0/**/*.json")] path: PathBuf) {
     let value: Value = stac::read(path.to_str().unwrap()).unwrap();
-    let _ = value.migrate(&Version::v1_1_0_beta_1).unwrap();
+    let _ = value.migrate(&Version::v1_1_0).unwrap();
 }
diff --git a/validate/tests/examples.rs b/validate/tests/examples.rs
index 44153cbf..cf0fbaec 100644
--- a/validate/tests/examples.rs
+++ b/validate/tests/examples.rs
@@ -10,7 +10,7 @@ fn v1_0_0(#[files("../spec-examples/v1.0.0/**/*.json")] path: PathBuf) {
 }
 
 #[rstest]
-fn v1_1_0_beta_1(#[files("../spec-examples/v1.1.0-beta.1/**/*.json")] path: PathBuf) {
+fn v1_1_0(#[files("../spec-examples/v1.1.0/**/*.json")] path: PathBuf) {
     let value: Value = stac::read(path.to_str().unwrap()).unwrap();
     value.validate_blocking().unwrap();
 }
diff --git a/validate/tests/migrate.rs b/validate/tests/migrate.rs
index a8fcdc96..2791d4bb 100644
--- a/validate/tests/migrate.rs
+++ b/validate/tests/migrate.rs
@@ -4,8 +4,8 @@ use stac_validate::ValidateBlocking;
 use std::path::PathBuf;
 
 #[rstest]
-fn v1_0_0_to_v1_1_0_beta_1(#[files("../spec-examples/v1.0.0/**/*.json")] path: PathBuf) {
+fn v1_0_0_to_v1_1_0(#[files("../spec-examples/v1.0.0/**/*.json")] path: PathBuf) {
     let value: Value = stac::read(path.to_str().unwrap()).unwrap();
-    let value = value.migrate(&Version::v1_1_0_beta_1).unwrap();
+    let value = value.migrate(&Version::v1_1_0).unwrap();
     value.validate_blocking().unwrap();
 }