diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 2da7b27c..a0f5114e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -3,7 +3,7 @@ name: CI
 on:
   push:
     branches: ["master"]
-    tags: ["juniper*@*"]
+    tags: ["juniper*"]
   pull_request:
     branches: ["master"]
 
@@ -27,6 +27,7 @@ jobs:
       - clippy
       - example
       - feature
+      - msrv
       - release-check
       - rustfmt
       - test
@@ -47,9 +48,8 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: stable
           components: clippy
 
@@ -59,9 +59,8 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: nightly
           components: rustfmt
 
@@ -78,11 +77,9 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: stable
-          override: true
 
       - run: cargo clippy -p juniper_benchmarks --benches -- -D warnings
       - run: cargo bench -p juniper_benchmarks
@@ -107,11 +104,10 @@ jobs:
     runs-on: ${{ matrix.os }}-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: ${{ matrix.toolchain }}
-          override: true
+      - run: rustup default ${{ matrix.toolchain }}
 
       - run: cargo check -p example_${{ matrix.example }}
 
@@ -141,14 +137,14 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: stable
-          override: true
+      - uses: dtolnay/rust-toolchain@v1
+        with:
+          toolchain: nightly
 
-      # TODO: Enable once MSRV is supported.
-      #- run: cargo +nightly update -Z minimal-versions
+      - run: cargo +nightly update -Z minimal-versions
 
       - run: cargo check -p ${{ matrix.crate }} --no-default-features
                    ${{ matrix.feature != '<none>'
@@ -157,23 +153,58 @@ jobs:
         env:
           RUSTFLAGS: -D warnings
 
+  msrv:
+    name: MSRV
+    strategy:
+      fail-fast: false
+      matrix:
+        msrv: ["1.62.0"]
+        crate:
+          - juniper_codegen
+          - juniper
+          - juniper_subscriptions
+          - juniper_graphql_ws
+          - juniper_actix
+          - juniper_hyper
+          #- juniper_iron
+          - juniper_rocket
+          - juniper_warp
+        os:
+          - ubuntu
+          - macOS
+          - windows
+    runs-on: ${{ matrix.os }}-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: dtolnay/rust-toolchain@v1
+        with:
+          toolchain: ${{ matrix.msrv }}
+      - run: rustup default ${{ matrix.msrv }}
+      - uses: dtolnay/rust-toolchain@v1
+        with:
+          toolchain: nightly
+
+      - run: cargo +nightly update -Z minimal-versions
+
+      - run: make test.cargo crate=${{ matrix.crate }}
+
   package:
     if: ${{ startsWith(github.ref, 'refs/tags/juniper') }}
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: stable
 
-      - name: Parse crate name
-        id: crate
-        run: echo ::set-output
-                  name=NAME::$(printf "$GITHUB_REF" | cut -d '/' -f3
-                                                    | cut -d '@' -f1)
+      - name: Parse crate name and version from Git tag
+        id: tag
+        uses: actions-ecosystem/action-regex-match@v2
+        with:
+          text: ${{ github.ref }}
+          regex: '^refs/tags/(([a-z_]+)-v([0-9]+\.[0-9]+\.[0-9]+(-.+)?))$'
 
-      - run: cargo package -p ${{ steps.crate.outputs.NAME }}
+      - run: cargo package -p ${{ steps.tag.outputs.group2 }}
 
   test:
     strategy:
@@ -211,13 +242,18 @@ jobs:
     runs-on: ${{ matrix.os }}-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: ${{ matrix.toolchain }}
-          override: true
+          components: rust-src
+      - run: rustup default ${{ matrix.toolchain }}
+
+      - run: cargo install cargo-careful
+        if: ${{ matrix.toolchain == 'nightly' }}
 
       - run: make test.cargo crate=${{ matrix.crate }}
+                  careful=${{ (matrix.toolchain == 'nightly' && 'yes')
+                           ||                                   'no' }}
 
   test-book:
     name: test Book
@@ -237,11 +273,10 @@ jobs:
     runs-on: ${{ matrix.os }}-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: ${{ matrix.toolchain }}
-          override: true
+      - run: rustup default ${{ matrix.toolchain }}
 
       - run: cargo install mdbook
 
@@ -261,12 +296,11 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: ${{ matrix.toolchain }}
           target: wasm32-unknown-unknown
-          override: true
+      - run: rustup default ${{ matrix.toolchain }}
 
       - run: cargo check --target wasm32-unknown-unknown -p ${{ matrix.crate }}
 
@@ -278,7 +312,7 @@ jobs:
   #############
 
   release-check:
-    name: Check release automation
+    name: check release
     if: ${{ !startsWith(github.ref, 'refs/tags/juniper') }}
     strategy:
       fail-fast: false
@@ -296,9 +330,8 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
+      - uses: dtolnay/rust-toolchain@v1
         with:
-          profile: minimal
           toolchain: stable
 
       - run: cargo install cargo-release
@@ -306,13 +339,36 @@ jobs:
       - run: make cargo.release crate=${{ matrix.crate }} ver=minor
                                 exec=no install=no
 
+  release-crate:
+    name: release on crates.io
+    needs: ["release-github"]
+    if: ${{ startsWith(github.ref, 'refs/tags/juniper') }}
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - uses: dtolnay/rust-toolchain@v1
+        with:
+          toolchain: stable
+
+      - name: Parse crate name and version from Git tag
+        id: tag
+        uses: actions-ecosystem/action-regex-match@v2
+        with:
+          text: ${{ github.ref }}
+          regex: '^refs/tags/(([a-z_]+)-v([0-9]+\.[0-9]+\.[0-9]+(-.+)?))$'
+
+      - name: Publish `${{ steps.tag.outputs.group2 }}` crate
+        run: cargo publish -p ${{ steps.tag.outputs.group2 }}
+                           --token ${{ secrets.CRATESIO_TOKEN }}
+
   release-github:
-    name: Release on GitHub
+    name: release on GitHub
     needs:
       - bench
       - clippy
       - example
       - feature
+      - msrv
       - package
       - rustfmt
       - test
@@ -323,56 +379,31 @@ jobs:
     steps:
       - uses: actions/checkout@v3
 
-      - name: Parse crate name
-        id: crate
-        run: echo ::set-output
-                  name=NAME::$(printf "$GITHUB_REF" | cut -d '/' -f3
-                                                    | cut -d '@' -f1)
-      - name: Parse release version
-        id: release
-        run: echo ::set-output
-                  name=VERSION::$(printf "$GITHUB_REF" | cut -d '@' -f2)
-
+      - name: Parse crate name and version from Git tag
+        id: tag
+        uses: actions-ecosystem/action-regex-match@v2
+        with:
+          text: ${{ github.ref }}
+          regex: '^refs/tags/(([a-z_]+)-v([0-9]+\.[0-9]+\.[0-9]+(-.+)?))$'
       - name: Verify release version matches crate's Cargo manifest
-        run: >-
-          test "${{ steps.release.outputs.VERSION }}" \
-            == "$(grep -m1 'version = "' ${{ steps.crate.outputs.NAME }}/Cargo.toml | cut -d '"' -f2)"
+        run: |
+          test "${{ steps.tag.outputs.group3 }}" \
+            == "$(grep -m1 'version = "' \
+                       ${{ steps.tag.outputs.group2 }}/Cargo.toml \
+                  | cut -d '"' -f2)"
+
       - name: Parse CHANGELOG link
         id: changelog
         run: echo ::set-output
-                  name=LINK::${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.crate.outputs.NAME }}%40${{ steps.release.outputs.VERSION }}//${{ steps.crate.outputs.NAME }}/CHANGELOG.md#$(sed -n '/^## \[${{ steps.release.outputs.VERSION }}\]/{s/^## \[\(.*\)\][^0-9]*\([0-9].*\)/\1--\2/;s/[^0-9a-z-]*//g;p;}' ${{ steps.crate.outputs.NAME }}/CHANGELOG.md)
+                  name=link::${{ github.server_url }}/${{ github.repository }}/blob/${{ steps.tag.outputs.group1 }}/${{ steps.tag.outputs.group2 }}/CHANGELOG.md#$(sed -n '/^## \[${{ steps.tag.outputs.group3 }}\]/{s/^## \[\(.*\)\][^0-9]*\([0-9].*\)/\1--\2/;s/[^0-9a-z-]*//g;p;}' ${{ steps.tag.outputs.group2 }}/CHANGELOG.md)
 
       - uses: softprops/action-gh-release@v1
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         with:
-          name: ${{ steps.crate.outputs.NAME }} ${{ steps.release.outputs.VERSION }}
+          name: ${{ steps.tag.outputs.group2 }} ${{ steps.tag.outputs.group3 }}
           body: |
-            [API docs](https://docs.rs/${{ steps.crate.outputs.NAME }}/${{ steps.release.outputs.VERSION }})
-            [Changelog](${{ steps.changelog.outputs.LINK }})
-          prerelease: ${{ contains(steps.release.outputs.VERSION, '-') }}
-
-  release-crate:
-    name: Release on crates.io
-    needs: ["release-github"]
-    if: ${{ startsWith(github.ref, 'refs/tags/juniper') }}
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v3
-      - uses: actions-rs/toolchain@v1
-        with:
-          profile: minimal
-          toolchain: stable
-
-      - name: Parse crate name
-        id: crate
-        run: echo ::set-output
-                  name=NAME::$(printf "$GITHUB_REF" | cut -d '/' -f3
-                                                    | cut -d '@' -f1)
-
-      - name: Publish crate
-        run: cargo publish -p ${{ steps.crate.outputs.NAME }}
-                           --token ${{ secrets.CRATESIO_TOKEN }}
+            [API docs](https://docs.rs/${{ steps.tag.outputs.group2 }}/${{ steps.tag.outputs.group3 }})
+            [Changelog](${{ steps.changelog.outputs.link }})
+          prerelease: ${{ contains(steps.tag.outputs.group3, '-') }}
 
 
 
diff --git a/Makefile b/Makefile
index 7f5755be..833a61e8 100644
--- a/Makefile
+++ b/Makefile
@@ -100,11 +100,21 @@ endif
 # Run Rust tests of project crates.
 #
 # Usage:
-#	make test.cargo [crate=<crate-name>]
+#	make test.cargo [crate=<crate-name>] [careful=(no|yes)]
 
 test.cargo:
-	cargo $(if $(call eq,$(crate),juniper_codegen_tests),+nightly,) test \
-		$(if $(call eq,$(crate),),--workspace,-p $(crate)) --all-features
+ifeq ($(careful),yes)
+ifeq ($(shell cargo install --list | grep cargo-careful),)
+	cargo install cargo-careful
+endif
+ifeq ($(shell rustup component list --toolchain=nightly \
+              | grep 'rust-src (installed)'),)
+	rustup component add --toolchain=nightly rust-src
+endif
+endif
+	cargo $(if $(call eq,$(careful),yes),+nightly careful,\
+	      $(if $(call eq,$(crate),juniper_codegen_tests),+nightly,)) \
+		test $(if $(call eq,$(crate),),--workspace,-p $(crate)) --all-features
 
 
 
diff --git a/juniper/Cargo.toml b/juniper/Cargo.toml
index 93f9c787..3a80a5ec 100644
--- a/juniper/Cargo.toml
+++ b/juniper/Cargo.toml
@@ -32,11 +32,13 @@ default = [
     "uuid",
 ]
 chrono-clock = ["chrono", "chrono/clock"]
+chrono-tz = ["dep:chrono-tz", "dep:regex"]
 expose-test-schema = ["anyhow", "serde_json"]
+graphql-parser = ["dep:graphql-parser", "dep:void"]
 schema-language = ["graphql-parser"]
 
 [dependencies]
-anyhow = { version = "1.0.32", default-features = false, optional = true }
+anyhow = { version = "1.0.47", default-features = false, optional = true }
 async-trait = "0.1.39"
 bigdecimal = { version = "0.3", optional = true }
 bson = { version = "2.4", features = ["chrono-0_4"], optional = true }
@@ -48,15 +50,21 @@ futures-enum = { version = "0.1.12", default-features = false }
 graphql-parser = { version = "0.4", optional = true }
 indexmap = { version = "1.0", features = ["serde-1"] }
 juniper_codegen = { version = "0.16.0-dev", path = "../juniper_codegen" }
-rust_decimal = { version = "1.0", default-features = false, optional = true }
-serde = { version = "1.0.8", features = ["derive"] }
-serde_json = { version = "1.0.2", default-features = false, optional = true }
+rust_decimal = { version = "1.20", default-features = false, optional = true }
+serde = { version = "1.0.122", features = ["derive"] }
+serde_json = { version = "1.0.18", default-features = false, optional = true }
 smartstring = "1.0"
 static_assertions = "1.1"
 time = { version = "0.3", features = ["formatting", "macros", "parsing"], optional = true }
 url = { version = "2.0", optional = true }
 uuid = { version = "1.0", default-features = false, optional = true }
 
+# Fixes for MSRV check.
+# TODO: Try remove on upgrade of `chrono-tz` crate.
+regex = { version = "1.6", default-features = false, optional = true }
+# TODO: Remove on upgrade to 4.0.1 version of `graphql-parser`.
+void = { version = "1.0.2", optional = true }
+
 [target.'cfg(target_arch = "wasm32")'.dependencies]
 getrandom = { version = "0.2", features = ["js"] }
 
@@ -64,7 +72,7 @@ getrandom = { version = "0.2", features = ["js"] }
 bencher = "0.1.2"
 chrono = { version = "0.4.20", features = ["alloc"], default-features = false }
 pretty_assertions = "1.0.0"
-serde_json = "1.0.2"
+serde_json = "1.0.18"
 tokio = { version = "1.0", features = ["macros", "time", "rt-multi-thread"] }
 
 [[bench]]
diff --git a/juniper/README.md b/juniper/README.md
index feb17329..39fb2dbe 100644
--- a/juniper/README.md
+++ b/juniper/README.md
@@ -4,6 +4,7 @@ Juniper (GraphQL server library for Rust)
 [![Crates.io](https://img.shields.io/crates/v/juniper.svg?maxAge=2592000)](https://crates.io/crates/juniper)
 [![Documentation](https://docs.rs/juniper/badge.svg)](https://docs.rs/juniper)
 [![CI](https://github.com/graphql-rust/juniper/workflows/CI/badge.svg?branch=master "CI")](https://github.com/graphql-rust/juniper/actions?query=workflow%3ACI+branch%3Amaster)
+[![Rust 1.62+](https://img.shields.io/badge/rustc-1.62+-lightgray.svg "Rust 1.62+")](https://blog.rust-lang.org/2022/06/30/Rust-1.62.0.html)
 
 - [Juniper Book] ([current][Juniper Book] | [edge][Juniper Book edge])
 - [Changelog](https://github.com/graphql-rust/juniper/blob/master/juniper/CHANGELOG.md)
diff --git a/juniper/release.toml b/juniper/release.toml
index a8cc1d5f..f490007e 100644
--- a/juniper/release.toml
+++ b/juniper/release.toml
@@ -78,17 +78,19 @@ replace = "juniper = { version = \"{{version}}\""
 
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "## master"
-replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}%40{{version}}/{{crate_name}}"
+replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}-v{{version}}/{{crate_name}}"
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "...master\\)"
-replace = "...{{crate_name}}%40{{version}})"
+replace = "...{{crate_name}}-v{{version}})"
 
 [[pre-release-replacements]]
 file = "README.md"
 exactly = 2
 search = "graphql-rust/juniper/blob/[^/]+/"
-replace = "graphql-rust/juniper/blob/{{crate_name}}%40{{version}}/"
+replace = "graphql-rust/juniper/blob/{{crate_name}}-v{{version}}/"
diff --git a/juniper_actix/Cargo.toml b/juniper_actix/Cargo.toml
index 0bcb8d4c..ccce57a9 100644
--- a/juniper_actix/Cargo.toml
+++ b/juniper_actix/Cargo.toml
@@ -19,23 +19,32 @@ all-features = true
 rustdoc-args = ["--cfg", "docsrs"]
 
 [features]
-subscriptions = ["juniper_graphql_ws", "tokio"]
+subscriptions = [
+    "dep:actix",
+    "dep:actix-web-actors",
+    "dep:juniper_graphql_ws",
+    "dep:tokio",
+]
 
 [dependencies]
-actix = "0.13"
-actix-http = "3.0"
-actix-web = "4.0"
-actix-web-actors = "4.1.0"
-anyhow = "1.0"
+actix = { version = ">=0.12,<=0.13", optional = true }
+actix-http = "3.2"
+actix-web = "4.2.1"
+actix-web-actors = { version = "4.1", optional = true }
+anyhow = "1.0.47"
 futures = "0.3.22"
 juniper = { version = "0.16.0-dev", path = "../juniper", default-features = false }
 juniper_graphql_ws = { version = "0.4.0-dev", path = "../juniper_graphql_ws", optional = true }
 http = "0.2.4"
-serde = { version = "1.0", features = ["derive"] }
-serde_json = "1.0"
+serde = { version = "1.0.122", features = ["derive"] }
+serde_json = "1.0.18"
 thiserror = "1.0"
 tokio = { version = "1.0", features = ["sync"], optional = true }
 
+# Fixes for MSRV check.
+# TODO: Try remove on upgrade to 4.3 version of `actix-web` crate.
+derive_more = { version = "0.99.8", default-features = false }
+
 [dev-dependencies]
 actix-cors = "0.6"
 actix-identity = "0.5"
diff --git a/juniper_actix/README.md b/juniper_actix/README.md
index 833685d0..4769c57d 100644
--- a/juniper_actix/README.md
+++ b/juniper_actix/README.md
@@ -4,6 +4,7 @@
 [![Crates.io](https://img.shields.io/crates/v/juniper_actix.svg?maxAge=2592000)](https://crates.io/crates/juniper_actix)
 [![Documentation](https://docs.rs/juniper_actix/badge.svg)](https://docs.rs/juniper_actix)
 [![CI](https://github.com/graphql-rust/juniper/workflows/CI/badge.svg?branch=master "CI")](https://github.com/graphql-rust/juniper/actions?query=workflow%3ACI+branch%3Amaster)
+[![Rust 1.62+](https://img.shields.io/badge/rustc-1.62+-lightgray.svg "Rust 1.62+")](https://blog.rust-lang.org/2022/06/30/Rust-1.62.0.html)
 
 - [Changelog](https://github.com/graphql-rust/juniper/blob/master/juniper_actix/CHANGELOG.md)
 
diff --git a/juniper_actix/release.toml b/juniper_actix/release.toml
index 4806c63e..0c899826 100644
--- a/juniper_actix/release.toml
+++ b/juniper_actix/release.toml
@@ -1,11 +1,12 @@
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "## master"
-replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}%40{{version}}/{{crate_name}}"
+replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}-v{{version}}/{{crate_name}}"
 
 [[pre-release-replacements]]
 file = "README.md"
 exactly = 3
 search = "graphql-rust/juniper/blob/[^/]+/"
-replace = "graphql-rust/juniper/blob/{{crate_name}}%40{{version}}/"
+replace = "graphql-rust/juniper/blob/{{crate_name}}-v{{version}}/"
diff --git a/juniper_codegen/Cargo.toml b/juniper_codegen/Cargo.toml
index b2291658..ee4c022c 100644
--- a/juniper_codegen/Cargo.toml
+++ b/juniper_codegen/Cargo.toml
@@ -23,13 +23,13 @@ proc-macro = true
 
 [dependencies]
 proc-macro-error = "1.0.2"
-proc-macro2 = "1.0.1"
-quote = "1.0.3"
+proc-macro2 = "1.0.4"
+quote = "1.0.9"
 syn = { version = "1.0.90", features = ["extra-traits", "full", "parsing", "visit", "visit-mut"], default-features = false }
 url = "2.0"
 
 [dev-dependencies]
-derive_more = "0.99.7"
+derive_more = "0.99.8"
 futures = "0.3.22"
 juniper = { path = "../juniper" }
-serde = "1.0"
+serde = "1.0.122"
diff --git a/juniper_codegen/README.md b/juniper_codegen/README.md
index 9ccfd60a..5cf8861f 100644
--- a/juniper_codegen/README.md
+++ b/juniper_codegen/README.md
@@ -4,6 +4,7 @@
 [![Crates.io](https://img.shields.io/crates/v/juniper_codegen.svg?maxAge=2592000)](https://crates.io/crates/juniper_codegen)
 [![Documentation](https://docs.rs/juniper_codegen/badge.svg)](https://docs.rs/juniper_codegen)
 [![CI](https://github.com/graphql-rust/juniper/workflows/CI/badge.svg?branch=master "CI")](https://github.com/graphql-rust/juniper/actions?query=workflow%3ACI+branch%3Amaster)
+[![Rust 1.62+](https://img.shields.io/badge/rustc-1.62+-lightgray.svg "Rust 1.62+")](https://blog.rust-lang.org/2022/06/30/Rust-1.62.0.html)
 
 - [Changelog](https://github.com/graphql-rust/juniper/blob/master/juniper_codegen/CHANGELOG.md)
 
diff --git a/juniper_codegen/release.toml b/juniper_codegen/release.toml
index b8548dbf..9c1b275b 100644
--- a/juniper_codegen/release.toml
+++ b/juniper_codegen/release.toml
@@ -6,12 +6,13 @@ replace = "{{crate_name}} = { version = \"{{version}}\""
 
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "## master"
-replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}%40{{version}}/{{crate_name}}"
+replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}-v{{version}}/{{crate_name}}"
 
 [[pre-release-replacements]]
 file = "README.md"
 exactly = 2
 search = "graphql-rust/juniper/blob/[^/]+/"
-replace = "graphql-rust/juniper/blob/{{crate_name}}%40{{version}}/"
+replace = "graphql-rust/juniper/blob/{{crate_name}}-v{{version}}/"
diff --git a/juniper_graphql_ws/Cargo.toml b/juniper_graphql_ws/Cargo.toml
index c8b68806..38da4352 100644
--- a/juniper_graphql_ws/Cargo.toml
+++ b/juniper_graphql_ws/Cargo.toml
@@ -17,8 +17,8 @@ exclude = ["/release.toml"]
 [dependencies]
 juniper = { version = "0.16.0-dev", path = "../juniper", default-features = false }
 juniper_subscriptions = { version = "0.17.0-dev", path = "../juniper_subscriptions" }
-serde = { version = "1.0.8", features = ["derive"], default-features = false }
+serde = { version = "1.0.122", features = ["derive"], default-features = false }
 tokio = { version = "1.0", features = ["macros", "rt", "time"], default-features = false }
 
 [dev-dependencies]
-serde_json = "1.0"
+serde_json = "1.0.18"
diff --git a/juniper_graphql_ws/README.md b/juniper_graphql_ws/README.md
index b3f18e1c..0f981e89 100644
--- a/juniper_graphql_ws/README.md
+++ b/juniper_graphql_ws/README.md
@@ -4,6 +4,7 @@
 [![Crates.io](https://img.shields.io/crates/v/juniper_graphql_ws.svg?maxAge=2592000)](https://crates.io/crates/juniper_graphql_ws)
 [![Documentation](https://docs.rs/juniper_graphql_ws/badge.svg)](https://docs.rs/juniper_graphql_ws)
 [![CI](https://github.com/graphql-rust/juniper/workflows/CI/badge.svg?branch=master "CI")](https://github.com/graphql-rust/juniper/actions?query=workflow%3ACI+branch%3Amaster)
+[![Rust 1.62+](https://img.shields.io/badge/rustc-1.62+-lightgray.svg "Rust 1.62+")](https://blog.rust-lang.org/2022/06/30/Rust-1.62.0.html)
 
 - [Changelog](https://github.com/graphql-rust/juniper/blob/master/juniper_graphql_ws/CHANGELOG.md)
 
diff --git a/juniper_graphql_ws/release.toml b/juniper_graphql_ws/release.toml
index 8c424022..5fa8d586 100644
--- a/juniper_graphql_ws/release.toml
+++ b/juniper_graphql_ws/release.toml
@@ -12,12 +12,13 @@ replace = "juniper_graphql_ws = { version = \"{{version}}\""
 
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "## master"
-replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}%40{{version}}/{{crate_name}}"
+replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}-v{{version}}/{{crate_name}}"
 
 [[pre-release-replacements]]
 file = "README.md"
 exactly = 2
 search = "graphql-rust/juniper/blob/[^/]+/"
-replace = "graphql-rust/juniper/blob/{{crate_name}}%40{{version}}/"
+replace = "graphql-rust/juniper/blob/{{crate_name}}-v{{version}}/"
diff --git a/juniper_hyper/Cargo.toml b/juniper_hyper/Cargo.toml
index 59f1c8a1..a67c6985 100644
--- a/juniper_hyper/Cargo.toml
+++ b/juniper_hyper/Cargo.toml
@@ -16,12 +16,16 @@ exclude = ["/examples/", "/release.toml"]
 
 [dependencies]
 futures = "0.3.22"
-hyper = { version = "0.14", features = ["server", "runtime"] }
+hyper = { version = "0.14.7", features = ["server", "runtime"] }
 juniper = { version = "0.16.0-dev", path = "../juniper", default-features = false }
-serde_json = "1.0"
+serde_json = "1.0.18"
 tokio = "1.0"
 url = "2.0"
 
+# Fixes for MSRV check.
+# TODO: Try remove on upgrade of `hyper` crate.
+http-body = "0.4.5"
+
 [dev-dependencies]
 juniper = { version = "0.16.0-dev", path = "../juniper", features = ["expose-test-schema"] }
 pretty_env_logger = "0.4"
diff --git a/juniper_hyper/README.md b/juniper_hyper/README.md
index 3d9d5d10..a8b43a35 100644
--- a/juniper_hyper/README.md
+++ b/juniper_hyper/README.md
@@ -4,6 +4,7 @@
 [![Crates.io](https://img.shields.io/crates/v/juniper_hyper.svg?maxAge=2592000)](https://crates.io/crates/juniper_hyper)
 [![Documentation](https://docs.rs/juniper_hyper/badge.svg)](https://docs.rs/juniper_hyper)
 [![CI](https://github.com/graphql-rust/juniper/workflows/CI/badge.svg?branch=master "CI")](https://github.com/graphql-rust/juniper/actions?query=workflow%3ACI+branch%3Amaster)
+[![Rust 1.62+](https://img.shields.io/badge/rustc-1.62+-lightgray.svg "Rust 1.62+")](https://blog.rust-lang.org/2022/06/30/Rust-1.62.0.html)
 
 - [Changelog](https://github.com/graphql-rust/juniper/blob/master/juniper_hyper/CHANGELOG.md)
 
diff --git a/juniper_hyper/release.toml b/juniper_hyper/release.toml
index 4818936d..7a20c9f7 100644
--- a/juniper_hyper/release.toml
+++ b/juniper_hyper/release.toml
@@ -6,12 +6,13 @@ replace = "juniper_hyper = \"{{version}}\""
 
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "## master"
-replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}%40{{version}}/{{crate_name}}"
+replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}-v{{version}}/{{crate_name}}"
 
 [[pre-release-replacements]]
 file = "README.md"
 exactly = 3
 search = "graphql-rust/juniper/blob/[^/]+/"
-replace = "graphql-rust/juniper/blob/{{crate_name}}%40{{version}}/"
+replace = "graphql-rust/juniper/blob/{{crate_name}}-v{{version}}/"
diff --git a/juniper_iron/Cargo.toml b/juniper_iron/Cargo.toml
index 7eef05d3..726aa651 100644
--- a/juniper_iron/Cargo.toml
+++ b/juniper_iron/Cargo.toml
@@ -21,7 +21,7 @@ exclude = ["/examples/", "/release.toml"]
 futures = "0.3.22"
 iron = ">= 0.5, < 0.7"
 juniper = { version = "0.16.0-dev", path = "../juniper", default-features = false }
-serde_json = "1.0.2"
+serde_json = "1.0.18"
 urlencoded = ">= 0.5, < 0.7"
 
 [dev-dependencies]
diff --git a/juniper_iron/README.md b/juniper_iron/README.md
index a1eaeae0..4654ef0e 100644
--- a/juniper_iron/README.md
+++ b/juniper_iron/README.md
@@ -4,6 +4,7 @@
 [![Crates.io](https://img.shields.io/crates/v/juniper_iron.svg?maxAge=2592000)](https://crates.io/crates/juniper_iron)
 [![Documentation](https://docs.rs/juniper_iron/badge.svg)](https://docs.rs/juniper_iron)
 [![CI](https://github.com/graphql-rust/juniper/workflows/CI/badge.svg?branch=master "CI")](https://github.com/graphql-rust/juniper/actions?query=workflow%3ACI+branch%3Amaster)
+[![Rust 1.62+](https://img.shields.io/badge/rustc-1.62+-lightgray.svg "Rust 1.62+")](https://blog.rust-lang.org/2022/06/30/Rust-1.62.0.html)
 
 - [Changelog](https://github.com/graphql-rust/juniper/blob/master/juniper_iron/CHANGELOG.md)
 
diff --git a/juniper_iron/release.toml b/juniper_iron/release.toml
index bbbf30d6..b965a783 100644
--- a/juniper_iron/release.toml
+++ b/juniper_iron/release.toml
@@ -6,12 +6,13 @@ replace = "juniper_iron = \"{{version}}\""
 
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "## master"
-replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}%40{{version}}/{{crate_name}}"
+replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}-v{{version}}/{{crate_name}}"
 
 [[pre-release-replacements]]
 file = "README.md"
 exactly = 3
 search = "graphql-rust/juniper/blob/[^/]+/"
-replace = "graphql-rust/juniper/blob/{{crate_name}}%40{{version}}/"
+replace = "graphql-rust/juniper/blob/{{crate_name}}-v{{version}}/"
diff --git a/juniper_rocket/Cargo.toml b/juniper_rocket/Cargo.toml
index e715609e..1473b2d6 100644
--- a/juniper_rocket/Cargo.toml
+++ b/juniper_rocket/Cargo.toml
@@ -21,7 +21,14 @@ exclude = ["/examples/", "/tests/", "/release.toml"]
 futures = "0.3.22"
 juniper = { version = "0.16.0-dev", path = "../juniper", default-features = false }
 rocket = { version = "=0.5.0-rc.2", default-features = false }
-serde_json = "1.0.2"
+serde_json = "1.0.18"
+
+# Fixes for MSRV check.
+# TODO: Try remove on upgrade of `rocket` crate.
+either = "1.8"
+inlinable_string = "0.1.15"
+proc-macro2-diagnostics = "0.9.1"
+tempfile = "3.3"
 
 [dev-dependencies]
 juniper = { version = "0.16.0-dev", path = "../juniper", features = ["expose-test-schema"] }
diff --git a/juniper_rocket/README.md b/juniper_rocket/README.md
index 651e3a5d..4d0362ce 100644
--- a/juniper_rocket/README.md
+++ b/juniper_rocket/README.md
@@ -4,6 +4,7 @@
 [![Crates.io](https://img.shields.io/crates/v/juniper_rocket.svg?maxAge=2592000)](https://crates.io/crates/juniper_rocket)
 [![Documentation](https://docs.rs/juniper_rocket/badge.svg)](https://docs.rs/juniper_rocket)
 [![CI](https://github.com/graphql-rust/juniper/workflows/CI/badge.svg?branch=master "CI")](https://github.com/graphql-rust/juniper/actions?query=workflow%3ACI+branch%3Amaster)
+[![Rust 1.62+](https://img.shields.io/badge/rustc-1.62+-lightgray.svg "Rust 1.62+")](https://blog.rust-lang.org/2022/06/30/Rust-1.62.0.html)
 
 - [Changelog](https://github.com/graphql-rust/juniper/blob/master/juniper_rocket/CHANGELOG.md)
 
diff --git a/juniper_rocket/release.toml b/juniper_rocket/release.toml
index 4b548081..1a54940d 100644
--- a/juniper_rocket/release.toml
+++ b/juniper_rocket/release.toml
@@ -6,12 +6,13 @@ replace = "juniper_rocket = \"{{version}}\""
 
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "## master"
-replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}%40{{version}}/{{crate_name}}"
+replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}-v{{version}}/{{crate_name}}"
 
 [[pre-release-replacements]]
 file = "README.md"
 exactly = 3
 search = "graphql-rust/juniper/blob/[^/]+/"
-replace = "graphql-rust/juniper/blob/{{crate_name}}%40{{version}}/"
+replace = "graphql-rust/juniper/blob/{{crate_name}}-v{{version}}/"
diff --git a/juniper_subscriptions/Cargo.toml b/juniper_subscriptions/Cargo.toml
index 8c6a14a5..5c054205 100644
--- a/juniper_subscriptions/Cargo.toml
+++ b/juniper_subscriptions/Cargo.toml
@@ -19,5 +19,5 @@ futures = "0.3.22"
 juniper = { version = "0.16.0-dev", path = "../juniper", default-features = false }
 
 [dev-dependencies]
-serde_json = "1.0"
+serde_json = "1.0.18"
 tokio = { version = "1.0", features = ["macros", "rt"] }
diff --git a/juniper_subscriptions/README.md b/juniper_subscriptions/README.md
index e04493a0..272903b9 100644
--- a/juniper_subscriptions/README.md
+++ b/juniper_subscriptions/README.md
@@ -4,6 +4,7 @@
 [![Crates.io](https://img.shields.io/crates/v/juniper_subscriptions.svg?maxAge=2592000)](https://crates.io/crates/juniper_subscriptions)
 [![Documentation](https://docs.rs/juniper_subscriptions/badge.svg)](https://docs.rs/juniper_subscriptions)
 [![CI](https://github.com/graphql-rust/juniper/workflows/CI/badge.svg?branch=master "CI")](https://github.com/graphql-rust/juniper/actions?query=workflow%3ACI+branch%3Amaster)
+[![Rust 1.62+](https://img.shields.io/badge/rustc-1.62+-lightgray.svg "Rust 1.62+")](https://blog.rust-lang.org/2022/06/30/Rust-1.62.0.html)
 
 - [Changelog](https://github.com/graphql-rust/juniper/blob/master/juniper_subscriptions/CHANGELOG.md)
 
diff --git a/juniper_subscriptions/release.toml b/juniper_subscriptions/release.toml
index 837f61ae..a12a9065 100644
--- a/juniper_subscriptions/release.toml
+++ b/juniper_subscriptions/release.toml
@@ -12,12 +12,13 @@ replace = "juniper_subscriptions = { version = \"{{version}}\""
 
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "## master"
-replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}%40{{version}}/{{crate_name}}"
+replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}-v{{version}}/{{crate_name}}"
 
 [[pre-release-replacements]]
 file = "README.md"
 exactly = 3
 search = "graphql-rust/juniper/blob/[^/]+/"
-replace = "graphql-rust/juniper/blob/{{crate_name}}%40{{version}}/"
+replace = "graphql-rust/juniper/blob/{{crate_name}}-v{{version}}/"
diff --git a/juniper_warp/Cargo.toml b/juniper_warp/Cargo.toml
index 361b00f5..719ece8e 100644
--- a/juniper_warp/Cargo.toml
+++ b/juniper_warp/Cargo.toml
@@ -19,18 +19,22 @@ all-features = true
 rustdoc-args = ["--cfg", "docsrs"]
 
 [features]
-subscriptions = ["juniper_graphql_ws"]
+subscriptions = ["dep:juniper_graphql_ws", "warp/websocket"]
 
 [dependencies]
-anyhow = "1.0"
+anyhow = "1.0.47"
 futures = "0.3.22"
 juniper = { version = "0.16.0-dev", path = "../juniper", default-features = false }
 juniper_graphql_ws = { version = "0.4.0-dev", path = "../juniper_graphql_ws", optional = true }
-serde = { version = "1.0.75", features = ["derive"] }
-serde_json = "1.0.24"
+serde = { version = "1.0.122", features = ["derive"] }
+serde_json = "1.0.18"
 thiserror = "1.0"
 tokio = { version = "1.0", features = ["rt-multi-thread"] }
-warp = "0.3"
+warp = { version = "0.3.2", default-features = false }
+
+# Fixes for MSRV check.
+# TODO: Try remove on upgrade of `warp` crate.
+headers = "0.3.8"
 
 [dev-dependencies]
 env_logger = "0.9"
diff --git a/juniper_warp/README.md b/juniper_warp/README.md
index 4148f484..2d7b2440 100644
--- a/juniper_warp/README.md
+++ b/juniper_warp/README.md
@@ -4,6 +4,7 @@
 [![Crates.io](https://img.shields.io/crates/v/juniper_warp.svg?maxAge=2592000)](https://crates.io/crates/juniper_warp)
 [![Documentation](https://docs.rs/juniper_warp/badge.svg)](https://docs.rs/juniper_warp)
 [![CI](https://github.com/graphql-rust/juniper/workflows/CI/badge.svg?branch=master "CI")](https://github.com/graphql-rust/juniper/actions?query=workflow%3ACI+branch%3Amaster)
+[![Rust 1.62+](https://img.shields.io/badge/rustc-1.62+-lightgray.svg "Rust 1.62+")](https://blog.rust-lang.org/2022/06/30/Rust-1.62.0.html)
 
 - [Changelog](https://github.com/graphql-rust/juniper/blob/master/juniper_warp/CHANGELOG.md)
 
diff --git a/juniper_warp/release.toml b/juniper_warp/release.toml
index 283666df..e747c48b 100644
--- a/juniper_warp/release.toml
+++ b/juniper_warp/release.toml
@@ -6,12 +6,13 @@ replace = "juniper_warp = \"{{version}}\""
 
 [[pre-release-replacements]]
 file = "CHANGELOG.md"
-exactly = 1
+max = 1
+min = 0
 search = "## master"
-replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}%40{{version}}/{{crate_name}}"
+replace = "## [{{version}}] · {{date}}\n[{{version}}]: /../../tree/{{crate_name}}-v{{version}}/{{crate_name}}"
 
 [[pre-release-replacements]]
 file = "README.md"
 exactly = 3
 search = "graphql-rust/juniper/blob/[^/]+/"
-replace = "graphql-rust/juniper/blob/{{crate_name}}%40{{version}}/"
+replace = "graphql-rust/juniper/blob/{{crate_name}}-v{{version}}/"
diff --git a/release.toml b/release.toml
index 09c0beb4..983c0bf1 100644
--- a/release.toml
+++ b/release.toml
@@ -1,4 +1,4 @@
 allow-branch = ["*"]
 pre-release-commit-message = "Prepare {{version}} release of `{{crate_name}}` crate"
 tag-message = "{{version}} version of `{{crate_name}}` crate"
-tag-name = "{{crate_name}}@{{version}}"
+tag-name = "{{crate_name}}-v{{version}}"