diff --git a/src/borrow_check/opaque-types-region-inference-restrictions.md b/src/borrow_check/opaque-types-region-inference-restrictions.md
index 99a0d0c41..7827e5528 100644
--- a/src/borrow_check/opaque-types-region-inference-restrictions.md
+++ b/src/borrow_check/opaque-types-region-inference-restrictions.md
@@ -158,7 +158,7 @@ See [#113971] for how we used to conflate the difference.
 
 [#113971]: https://github.com/rust-lang/rust/issues/113971
 [SCC]: https://en.wikipedia.org/wiki/Strongly_connected_component
-[member constraints]: https://rustc-dev-guide.rust-lang.org/borrow_check/region_inference/member_constraints.html
+[member constraints]: ./region_inference/member_constraints.md
 
 **interaction with "once modulo regions" restriction**
 In the example above, note the opaque type in the signature is `Opaque<'a>` and the one in the
diff --git a/src/opaque-types-impl-trait-inference.md b/src/opaque-types-impl-trait-inference.md
index f9c2ea74d..78a693876 100644
--- a/src/opaque-types-impl-trait-inference.md
+++ b/src/opaque-types-impl-trait-inference.md
@@ -5,8 +5,8 @@ This kind of type inference is particularly complex because,
 unlike other kinds of type inference,
 it can work across functions and function bodies.
 
-[hidden type]: https://rustc-dev-guide.rust-lang.org/borrow_check/region_inference/member_constraints.html?highlight=%22hidden%20type%22#member-constraints
-[opaque type]: https://rustc-dev-guide.rust-lang.org/opaque-types-type-alias-impl-trait.html
+[hidden type]: ./borrow_check/region_inference/member_constraints.html?highlight=%22hidden%20type%22#member-constraints
+[opaque type]: ./opaque-types-type-alias-impl-trait.md
 
 ## Running example
 
diff --git a/src/overview.md b/src/overview.md
index 520121423..b5e8753e5 100644
--- a/src/overview.md
+++ b/src/overview.md
@@ -72,7 +72,7 @@ following files are found in the `parser`:
 
 This naming scheme is used across many compiler stages. You will find either a
 file or directory with the same name across the parsing, lowering, type
-checking, [Typed High-level Intermediate Representation (`THIR`)] lowering, and
+checking, [Typed High-level Intermediate Representation (`THIR`)][thir] lowering, and
 [Mid-level Intermediate Representation (`MIR`)][mir] building sources.
 
 Macro-expansion, `AST`-validation, name-resolution, and early linting also take
@@ -168,7 +168,7 @@ the final binary.
 [parser]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/index.html
 [rustc_parse_parser_dir]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_parse/src/parser
 [String interning]: https://en.wikipedia.org/wiki/String_interning
-[Typed High-level Intermediate Representation (`THIR`)]: https://rustc-dev-guide.rust-lang.org/thir.html
+[thir]: ./thir.md
 
 ## How it does it
 
diff --git a/src/param_env/param_env_construction_internals.md b/src/param_env/param_env_construction_internals.md
index fa9744fc0..69a262a17 100644
--- a/src/param_env/param_env_construction_internals.md
+++ b/src/param_env/param_env_construction_internals.md
@@ -40,7 +40,7 @@ fn foo<T: Trait + Trait>() {}
 The [next-gen trait solver][next-gen-solver] also requires this elaboration to take place.
 
 [elaborate]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/traits/util/fn.elaborate.html
-[next-gen-solver]: https://rustc-dev-guide.rust-lang.org/solve/trait-solving.html
+[next-gen-solver]: ../solve/trait-solving.md
 
 ## Normalizing all bounds
 
@@ -80,4 +80,4 @@ In the next-gen trait solver the requirement for all where clauses in the `Param
 
 [example]: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e6933265ea3e84eaa47019465739992c
 [pe]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.ParamEnv.html
-[normalize_env_or_error]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_trait_selection/traits/fn.normalize_param_env_or_error.html
\ No newline at end of file
+[normalize_env_or_error]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_trait_selection/traits/fn.normalize_param_env_or_error.html
diff --git a/src/solve/opaque-types.md b/src/solve/opaque-types.md
index d786afecf..87531705c 100644
--- a/src/solve/opaque-types.md
+++ b/src/solve/opaque-types.md
@@ -95,7 +95,7 @@ end up leaking placeholders.
 The handling of member constraints does not change in the new solver. See the
 [relevant existing chapter][member-constraints] for that.
 
-[member-constraints]: https://rustc-dev-guide.rust-lang.org/borrow_check/region_inference/member_constraints.html
+[member-constraints]: ../borrow_check/region_inference/member_constraints.md
 
 ## calling methods on opaque types