You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by ju...@apache.org on 2022/09/23 06:22:23 UTC

[pulsar] branch master updated: add `.md` to doc links (#17763)

This is an automated email from the ASF dual-hosted git repository.

junma pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new e73b2986361 add `.md` to doc links (#17763)
e73b2986361 is described below

commit e73b29863614a210d14e105c26f691c29d0548d5
Author: momo-jun <60...@users.noreply.github.com>
AuthorDate: Fri Sep 23 14:22:05 2022 +0800

    add `.md` to doc links (#17763)
---
 .../version-2.1.0-incubating/admin-api-brokers.md  |  4 ++--
 .../version-2.1.0-incubating/admin-api-clusters.md |  8 +++----
 .../admin-api-namespaces.md                        |  2 +-
 .../version-2.1.0-incubating/admin-api-overview.md |  8 +++----
 .../admin-api-partitioned-topics.md                |  2 +-
 .../version-2.1.0-incubating/admin-api-schemas.md  |  2 +-
 .../version-2.1.0-incubating/admin-api-tenants.md  |  2 +-
 .../version-2.1.0-incubating/administration-geo.md |  4 ++--
 .../administration-proxy.md                        |  2 +-
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-go.md                         | 12 +++++-----
 .../client-libraries-java.md                       | 20 ++++++++--------
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../version-2.1.0-incubating/client-libraries.md   | 10 ++++----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.1.0-incubating/concepts-clients.md   |  2 +-
 .../version-2.1.0-incubating/concepts-messaging.md | 16 ++++++-------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.1.0-incubating/concepts-overview.md  |  8 +++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-schema-registry.md                    |  4 ++--
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  4 ++--
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.1.0-incubating/deploy-aws.md         |  2 +-
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.1.0-incubating/deploy-bare-metal.md  | 12 +++++-----
 .../version-2.1.0-incubating/deploy-dcos.md        |  2 +-
 .../version-2.1.0-incubating/deploy-kubernetes.md  | 16 ++++++-------
 .../version-2.1.0-incubating/deploy-monitoring.md  |  2 +-
 .../version-2.1.0-incubating/develop-schema.md     |  2 +-
 .../version-2.1.0-incubating/functions-api.md      | 12 +++++-----
 .../functions-deploying.md                         |  6 ++---
 .../version-2.1.0-incubating/functions-metrics.md  |  2 +-
 .../version-2.1.0-incubating/functions-overview.md |  4 ++--
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-standalone.md                  | 12 +++++-----
 .../version-2.1.0-incubating/io-cassandra.md       |  2 +-
 .../version-2.1.0-incubating/io-develop.md         | 10 ++++----
 .../version-2.1.0-incubating/io-managing.md        |  6 ++---
 .../version-2.1.0-incubating/io-overview.md        |  8 +++----
 .../version-2.1.0-incubating/io-quickstart.md      | 10 ++++----
 .../version-2.1.0-incubating/pulsar-2.0.md         |  4 ++--
 .../reference-cli-tools.md                         |  2 +-
 .../version-2.1.0-incubating/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  6 ++---
 .../version-2.1.0-incubating/security-extending.md |  2 +-
 .../version-2.1.0-incubating/security-overview.md  |  4 ++--
 .../security-tls-authentication.md                 |  6 ++---
 .../security-tls-transport.md                      | 10 ++++----
 .../version-2.1.0-incubating/standalone.md         | 12 +++++-----
 .../version-2.1.1-incubating/admin-api-clusters.md |  6 ++---
 .../admin-api-namespaces.md                        |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../admin-api-partitioned-topics.md                |  2 +-
 .../admin-api-persistent-topics.md                 |  2 +-
 .../version-2.1.1-incubating/admin-api-tenants.md  |  4 ++--
 .../administration-dashboard.md                    |  2 +-
 .../version-2.1.1-incubating/administration-geo.md |  4 ++--
 .../administration-proxy.md                        |  2 +-
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-go.md                         |  8 +++----
 .../client-libraries-java.md                       | 24 +++++++++----------
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../version-2.1.1-incubating/client-libraries.md   | 10 ++++----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.1.1-incubating/concepts-clients.md   |  6 ++---
 .../version-2.1.1-incubating/concepts-messaging.md | 22 ++++++++---------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.1.1-incubating/concepts-overview.md  | 10 ++++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  2 +-
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.1.1-incubating/deploy-aws.md         |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.1.1-incubating/deploy-bare-metal.md  | 12 +++++-----
 .../version-2.1.1-incubating/deploy-kubernetes.md  |  4 ++--
 .../version-2.1.1-incubating/deploy-monitoring.md  |  4 ++--
 .../version-2.1.1-incubating/develop-schema.md     |  2 +-
 .../version-2.1.1-incubating/functions-api.md      | 12 +++++-----
 .../functions-deploying.md                         |  6 ++---
 .../version-2.1.1-incubating/functions-overview.md |  4 ++--
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-standalone.md                  | 12 +++++-----
 .../version-2.1.1-incubating/io-develop.md         | 12 +++++-----
 .../version-2.1.1-incubating/io-managing.md        |  6 ++---
 .../version-2.1.1-incubating/io-overview.md        |  4 ++--
 .../version-2.1.1-incubating/io-quickstart.md      | 10 ++++----
 .../version-2.1.1-incubating/pulsar-2.0.md         |  4 ++--
 .../reference-cli-tools.md                         |  4 ++--
 .../version-2.1.1-incubating/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  8 +++----
 .../version-2.1.1-incubating/security-overview.md  |  2 +-
 .../security-tls-authentication.md                 |  8 +++----
 .../security-tls-transport.md                      | 12 +++++-----
 .../version-2.1.1-incubating/standalone.md         | 12 +++++-----
 .../version-2.10.1-deprecated/admin-api-brokers.md |  2 +-
 .../version-2.10.1-deprecated/schema-manage.md     |  2 +-
 .../version-2.2.0/admin-api-clusters.md            |  6 ++---
 .../version-2.2.0/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.2.0/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.2.0/admin-api-persistent-topics.md   |  2 +-
 .../version-2.2.0/admin-api-tenants.md             |  4 ++--
 .../version-2.2.0/administration-dashboard.md      |  2 +-
 .../version-2.2.0/administration-geo.md            |  4 ++--
 .../version-2.2.0/administration-zk-bk.md          |  2 +-
 .../version-2.2.0/client-libraries-go.md           | 12 +++++-----
 .../version-2.2.0/client-libraries-java.md         | 24 +++++++++----------
 .../version-2.2.0/client-libraries-python.md       |  2 +-
 .../version-2.2.0/client-libraries-websocket.md    |  4 ++--
 .../version-2.2.0/client-libraries.md              | 10 ++++----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.2.0/concepts-authentication.md       |  2 +-
 .../version-2.2.0/concepts-clients.md              |  6 ++---
 .../version-2.2.0/concepts-messaging.md            | 22 ++++++++---------
 .../version-2.2.0/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.2.0/concepts-overview.md             | 10 ++++----
 .../version-2.2.0/concepts-replication.md          |  2 +-
 .../version-2.2.0/concepts-tiered-storage.md       |  2 +-
 .../version-2.2.0/concepts-topic-compaction.md     |  4 ++--
 .../version-2.2.0/cookbooks-compaction.md          |  2 +-
 .../version-2.2.0/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.2.0/cookbooks-partitioned.md         |  2 +-
 .../version-2.2.0/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.2.0/deploy-aws.md     |  2 +-
 .../deploy-bare-metal-multi-cluster.md             | 26 ++++++++++----------
 .../version-2.2.0/deploy-bare-metal.md             | 16 ++++++-------
 .../versioned_docs/version-2.2.0/deploy-dcos.md    |  2 +-
 .../version-2.2.0/deploy-kubernetes.md             |  4 ++--
 .../version-2.2.0/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.2.0/develop-schema.md |  2 +-
 .../versioned_docs/version-2.2.0/functions-api.md  | 14 +++++------
 .../version-2.2.0/functions-deploying.md           |  6 ++---
 .../version-2.2.0/functions-overview.md            |  4 ++--
 .../version-2.2.0/getting-started-docker.md        |  6 ++---
 .../version-2.2.0/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.2.0/io-develop.md     | 12 +++++-----
 .../versioned_docs/version-2.2.0/io-managing.md    |  6 ++---
 .../versioned_docs/version-2.2.0/io-overview.md    |  8 +++----
 .../versioned_docs/version-2.2.0/io-quickstart.md  | 10 ++++----
 .../versioned_docs/version-2.2.0/pulsar-2.0.md     |  4 ++--
 .../version-2.2.0/reference-cli-tools.md           |  4 ++--
 .../version-2.2.0/security-athenz.md               |  2 +-
 .../version-2.2.0/security-authorization.md        |  8 +++----
 .../version-2.2.0/security-extending.md            |  2 +-
 .../version-2.2.0/security-overview.md             |  2 +-
 .../version-2.2.0/security-tls-authentication.md   |  8 +++----
 .../version-2.2.0/security-tls-transport.md        | 10 ++++----
 .../version-2.2.0/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.2.0/sql-overview.md   |  2 +-
 .../version-2.2.0/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.2.0/standalone.md     | 16 ++++++-------
 .../version-2.2.1/admin-api-clusters.md            |  6 ++---
 .../version-2.2.1/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.2.1/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.2.1/admin-api-tenants.md             |  4 ++--
 .../version-2.2.1/administration-dashboard.md      |  2 +-
 .../version-2.2.1/administration-geo.md            |  4 ++--
 .../version-2.2.1/administration-zk-bk.md          |  2 +-
 .../version-2.2.1/client-libraries-cpp.md          |  2 +-
 .../version-2.2.1/client-libraries-go.md           | 12 +++++-----
 .../version-2.2.1/client-libraries-java.md         | 20 ++++++++--------
 .../version-2.2.1/client-libraries-python.md       |  4 ++--
 .../version-2.2.1/client-libraries-websocket.md    |  4 ++--
 .../version-2.2.1/client-libraries.md              | 10 ++++----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.2.1/concepts-authentication.md       |  2 +-
 .../version-2.2.1/concepts-clients.md              |  2 +-
 .../version-2.2.1/concepts-messaging.md            | 22 ++++++++---------
 .../version-2.2.1/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.2.1/concepts-overview.md             |  8 +++----
 .../version-2.2.1/concepts-replication.md          |  2 +-
 .../version-2.2.1/concepts-tiered-storage.md       |  2 +-
 .../version-2.2.1/concepts-topic-compaction.md     |  4 ++--
 .../version-2.2.1/cookbooks-compaction.md          |  2 +-
 .../version-2.2.1/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.2.1/cookbooks-partitioned.md         |  2 +-
 .../version-2.2.1/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.2.1/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.2.1/deploy-bare-metal.md             | 16 ++++++-------
 .../versioned_docs/version-2.2.1/deploy-dcos.md    |  2 +-
 .../version-2.2.1/deploy-kubernetes.md             |  4 ++--
 .../version-2.2.1/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.2.1/develop-schema.md |  2 +-
 .../version-2.2.1/functions-overview.md            |  4 ++--
 .../version-2.2.1/getting-started-docker.md        |  6 ++---
 .../version-2.2.1/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.2.1/io-develop.md     | 12 +++++-----
 .../versioned_docs/version-2.2.1/io-managing.md    |  6 ++---
 .../versioned_docs/version-2.2.1/io-overview.md    | 10 ++++----
 .../versioned_docs/version-2.2.1/io-quickstart.md  | 10 ++++----
 .../versioned_docs/version-2.2.1/pulsar-2.0.md     |  4 ++--
 .../version-2.2.1/reference-cli-tools.md           |  4 ++--
 .../version-2.2.1/security-athenz.md               |  2 +-
 .../version-2.2.1/security-authorization.md        |  8 +++----
 .../version-2.2.1/security-overview.md             |  2 +-
 .../version-2.2.1/security-tls-authentication.md   |  6 ++---
 .../version-2.2.1/security-tls-transport.md        | 10 ++++----
 .../version-2.2.1/security-token-admin.md          |  2 +-
 .../version-2.2.1/security-token-client.md         |  4 ++--
 .../version-2.2.1/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.2.1/sql-overview.md   |  2 +-
 .../version-2.2.1/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.2.1/standalone.md     | 16 ++++++-------
 .../version-2.3.0/admin-api-clusters.md            |  6 ++---
 .../version-2.3.0/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.3.0/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.3.0/admin-api-persistent-topics.md   |  2 +-
 .../version-2.3.0/admin-api-tenants.md             |  4 ++--
 .../version-2.3.0/administration-dashboard.md      |  2 +-
 .../version-2.3.0/administration-geo.md            |  4 ++--
 .../version-2.3.0/administration-zk-bk.md          |  2 +-
 .../version-2.3.0/client-libraries-go.md           | 12 +++++-----
 .../version-2.3.0/client-libraries-java.md         | 24 +++++++++----------
 .../version-2.3.0/client-libraries-python.md       |  2 +-
 .../version-2.3.0/client-libraries-websocket.md    |  4 ++--
 .../version-2.3.0/client-libraries.md              | 10 ++++----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.3.0/concepts-authentication.md       |  2 +-
 .../version-2.3.0/concepts-clients.md              |  6 ++---
 .../version-2.3.0/concepts-messaging.md            | 16 ++++++-------
 .../version-2.3.0/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.3.0/concepts-overview.md             |  8 +++----
 .../version-2.3.0/concepts-replication.md          |  2 +-
 .../version-2.3.0/concepts-schema-registry.md      |  4 ++--
 .../version-2.3.0/concepts-tiered-storage.md       |  2 +-
 .../version-2.3.0/concepts-topic-compaction.md     |  4 ++--
 .../version-2.3.0/cookbooks-compaction.md          |  2 +-
 .../version-2.3.0/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.3.0/cookbooks-partitioned.md         |  2 +-
 .../version-2.3.0/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.3.0/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.3.0/deploy-bare-metal.md             | 16 ++++++-------
 .../versioned_docs/version-2.3.0/deploy-dcos.md    |  2 +-
 .../version-2.3.0/deploy-kubernetes.md             |  4 ++--
 .../version-2.3.0/deploy-monitoring.md             |  2 +-
 .../versioned_docs/version-2.3.0/develop-schema.md |  2 +-
 .../version-2.3.0/functions-deploying.md           |  6 ++---
 .../version-2.3.0/functions-overview.md            |  2 +-
 .../version-2.3.0/getting-started-docker.md        |  6 ++---
 .../version-2.3.0/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.3.0/io-develop.md     | 12 +++++-----
 .../versioned_docs/version-2.3.0/io-managing.md    |  6 ++---
 .../versioned_docs/version-2.3.0/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.3.0/io-quickstart.md  |  8 +++----
 .../versioned_docs/version-2.3.0/pulsar-2.0.md     |  4 ++--
 .../version-2.3.0/reference-cli-tools.md           |  2 +-
 .../version-2.3.0/security-athenz.md               |  2 +-
 .../version-2.3.0/security-authorization.md        |  6 ++---
 .../version-2.3.0/security-overview.md             |  2 +-
 .../version-2.3.0/security-tls-authentication.md   |  8 +++----
 .../version-2.3.0/security-tls-transport.md        | 10 ++++----
 .../version-2.3.0/security-token-admin.md          |  2 +-
 .../version-2.3.0/security-token-client.md         |  4 ++--
 .../version-2.3.0/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.3.0/sql-overview.md   |  2 +-
 .../version-2.3.0/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.3.0/standalone.md     | 16 ++++++-------
 .../version-2.3.1/admin-api-clusters.md            |  6 ++---
 .../version-2.3.1/admin-api-namespaces.md          |  2 +-
 .../version-2.3.1/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.3.1/admin-api-persistent-topics.md   |  2 +-
 .../version-2.3.1/admin-api-tenants.md             |  4 ++--
 .../version-2.3.1/administration-geo.md            |  4 ++--
 .../version-2.3.1/administration-zk-bk.md          |  2 +-
 .../version-2.3.1/client-libraries-go.md           | 12 +++++-----
 .../version-2.3.1/client-libraries-java.md         | 20 ++++++++--------
 .../version-2.3.1/client-libraries-python.md       |  2 +-
 .../version-2.3.1/client-libraries-websocket.md    |  4 ++--
 .../version-2.3.1/client-libraries.md              | 10 ++++----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.3.1/concepts-authentication.md       |  2 +-
 .../version-2.3.1/concepts-clients.md              |  6 ++---
 .../version-2.3.1/concepts-messaging.md            | 16 ++++++-------
 .../version-2.3.1/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.3.1/concepts-overview.md             | 10 ++++----
 .../version-2.3.1/concepts-replication.md          |  2 +-
 .../version-2.3.1/concepts-schema-registry.md      |  4 ++--
 .../version-2.3.1/concepts-tiered-storage.md       |  2 +-
 .../version-2.3.1/concepts-topic-compaction.md     |  4 ++--
 .../version-2.3.1/cookbooks-compaction.md          |  2 +-
 .../version-2.3.1/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.3.1/cookbooks-partitioned.md         |  2 +-
 .../version-2.3.1/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.3.1/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 26 ++++++++++----------
 .../version-2.3.1/deploy-bare-metal.md             | 16 ++++++-------
 .../versioned_docs/version-2.3.1/deploy-dcos.md    |  2 +-
 .../version-2.3.1/deploy-kubernetes.md             |  4 ++--
 .../version-2.3.1/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.3.1/develop-schema.md |  2 +-
 .../version-2.3.1/functions-overview.md            |  4 ++--
 .../version-2.3.1/getting-started-docker.md        |  6 ++---
 .../version-2.3.1/getting-started-standalone.md    | 16 ++++++-------
 .../website/versioned_docs/version-2.3.1/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.3.1/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.3.1/io-managing.md    |  6 ++---
 .../versioned_docs/version-2.3.1/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.3.1/io-quickstart.md  |  8 +++----
 .../versioned_docs/version-2.3.1/pulsar-2.0.md     |  4 ++--
 .../version-2.3.1/reference-cli-tools.md           |  2 +-
 .../version-2.3.1/security-athenz.md               |  2 +-
 .../version-2.3.1/security-authorization.md        |  8 +++----
 .../version-2.3.1/security-overview.md             |  2 +-
 .../version-2.3.1/security-tls-authentication.md   |  8 +++----
 .../version-2.3.1/security-tls-transport.md        | 10 ++++----
 .../version-2.3.1/security-token-admin.md          |  2 +-
 .../version-2.3.1/security-token-client.md         |  4 ++--
 .../version-2.3.1/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.3.1/sql-overview.md   |  2 +-
 .../version-2.3.1/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.3.1/standalone.md     | 16 ++++++-------
 .../version-2.3.2/admin-api-clusters.md            |  6 ++---
 .../version-2.3.2/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.3.2/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.3.2/admin-api-persistent-topics.md   |  2 +-
 .../version-2.3.2/admin-api-schemas.md             |  2 +-
 .../version-2.3.2/admin-api-tenants.md             |  4 ++--
 .../version-2.3.2/administration-dashboard.md      |  2 +-
 .../version-2.3.2/administration-geo.md            |  4 ++--
 .../version-2.3.2/administration-zk-bk.md          |  2 +-
 .../version-2.3.2/client-libraries-cpp.md          |  2 +-
 .../version-2.3.2/client-libraries-go.md           |  8 +++----
 .../version-2.3.2/client-libraries-java.md         | 24 +++++++++----------
 .../version-2.3.2/client-libraries-python.md       |  4 ++--
 .../version-2.3.2/client-libraries-websocket.md    |  4 ++--
 .../version-2.3.2/client-libraries.md              | 12 +++++-----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.3.2/concepts-authentication.md       |  2 +-
 .../version-2.3.2/concepts-clients.md              |  2 +-
 .../version-2.3.2/concepts-messaging.md            | 16 ++++++-------
 .../version-2.3.2/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.3.2/concepts-overview.md             | 10 ++++----
 .../version-2.3.2/concepts-replication.md          |  2 +-
 .../version-2.3.2/concepts-schema-registry.md      |  4 ++--
 .../version-2.3.2/concepts-tiered-storage.md       |  2 +-
 .../version-2.3.2/concepts-topic-compaction.md     |  4 ++--
 .../version-2.3.2/cookbooks-compaction.md          |  2 +-
 .../version-2.3.2/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.3.2/cookbooks-partitioned.md         |  2 +-
 .../version-2.3.2/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.3.2/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.3.2/deploy-bare-metal.md             | 18 +++++++-------
 .../versioned_docs/version-2.3.2/deploy-dcos.md    |  2 +-
 .../version-2.3.2/deploy-kubernetes.md             |  4 ++--
 .../version-2.3.2/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.3.2/develop-schema.md |  2 +-
 .../version-2.3.2/functions-overview.md            |  2 +-
 .../version-2.3.2/functions-worker.md              |  4 ++--
 .../version-2.3.2/getting-started-docker.md        |  6 ++---
 .../version-2.3.2/getting-started-standalone.md    | 16 ++++++-------
 .../website/versioned_docs/version-2.3.2/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.3.2/io-develop.md     | 12 +++++-----
 .../versioned_docs/version-2.3.2/io-managing.md    |  6 ++---
 .../versioned_docs/version-2.3.2/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.3.2/io-quickstart.md  |  8 +++----
 .../versioned_docs/version-2.3.2/pulsar-2.0.md     |  4 ++--
 .../version-2.3.2/reference-cli-tools.md           |  2 +-
 .../version-2.3.2/security-athenz.md               |  2 +-
 .../version-2.3.2/security-authorization.md        |  8 +++----
 .../version-2.3.2/security-kerberos.md             |  2 +-
 .../version-2.3.2/security-overview.md             |  4 ++--
 .../version-2.3.2/security-tls-authentication.md   |  8 +++----
 .../version-2.3.2/security-tls-transport.md        | 10 ++++----
 .../version-2.3.2/security-token-admin.md          |  2 +-
 .../version-2.3.2/security-token-client.md         |  4 ++--
 .../version-2.3.2/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.3.2/sql-overview.md   |  2 +-
 .../version-2.3.2/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.3.2/standalone.md     | 16 ++++++-------
 .../version-2.4.0/admin-api-clusters.md            |  6 ++---
 .../version-2.4.0/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.4.0/admin-api-overview.md            |  8 +++----
 .../version-2.4.0/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.4.0/admin-api-persistent-topics.md   |  2 +-
 .../version-2.4.0/admin-api-tenants.md             |  4 ++--
 .../version-2.4.0/administration-dashboard.md      |  2 +-
 .../version-2.4.0/administration-geo.md            |  4 ++--
 .../version-2.4.0/administration-zk-bk.md          |  2 +-
 .../version-2.4.0/client-libraries-cpp.md          |  2 +-
 .../version-2.4.0/client-libraries-go.md           | 12 +++++-----
 .../version-2.4.0/client-libraries-java.md         | 20 ++++++++--------
 .../version-2.4.0/client-libraries-python.md       |  2 +-
 .../version-2.4.0/client-libraries-websocket.md    |  4 ++--
 .../version-2.4.0/client-libraries.md              | 10 ++++----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.4.0/concepts-authentication.md       |  2 +-
 .../version-2.4.0/concepts-clients.md              |  6 ++---
 .../version-2.4.0/concepts-messaging.md            | 16 ++++++-------
 .../version-2.4.0/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.4.0/concepts-overview.md             | 10 ++++----
 .../version-2.4.0/concepts-replication.md          |  2 +-
 .../version-2.4.0/concepts-schema-registry.md      |  4 ++--
 .../version-2.4.0/concepts-tiered-storage.md       |  2 +-
 .../version-2.4.0/concepts-topic-compaction.md     |  4 ++--
 .../version-2.4.0/cookbooks-compaction.md          |  2 +-
 .../version-2.4.0/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.4.0/cookbooks-partitioned.md         |  2 +-
 .../version-2.4.0/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.4.0/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.4.0/deploy-bare-metal.md             | 18 +++++++-------
 .../versioned_docs/version-2.4.0/deploy-dcos.md    |  2 +-
 .../version-2.4.0/deploy-kubernetes.md             |  4 ++--
 .../version-2.4.0/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.4.0/develop-schema.md |  2 +-
 .../versioned_docs/version-2.4.0/functions-api.md  | 14 +++++------
 .../version-2.4.0/functions-overview.md            |  4 ++--
 .../version-2.4.0/functions-worker.md              |  4 ++--
 .../version-2.4.0/getting-started-docker.md        |  6 ++---
 .../version-2.4.0/getting-started-standalone.md    | 16 ++++++-------
 .../website/versioned_docs/version-2.4.0/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.4.0/io-develop.md     | 12 +++++-----
 .../versioned_docs/version-2.4.0/io-managing.md    |  6 ++---
 .../versioned_docs/version-2.4.0/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.4.0/io-quickstart.md  | 10 ++++----
 .../versioned_docs/version-2.4.0/pulsar-2.0.md     |  4 ++--
 .../version-2.4.0/reference-cli-tools.md           |  2 +-
 .../version-2.4.0/security-athenz.md               |  2 +-
 .../version-2.4.0/security-authorization.md        |  8 +++----
 .../versioned_docs/version-2.4.0/security-jwt.md   |  6 ++---
 .../version-2.4.0/security-kerberos.md             |  2 +-
 .../version-2.4.0/security-overview.md             |  4 ++--
 .../version-2.4.0/security-tls-authentication.md   |  6 ++---
 .../version-2.4.0/security-tls-transport.md        | 10 ++++----
 .../version-2.4.0/security-token-admin.md          |  2 +-
 .../version-2.4.0/security-token-client.md         |  4 ++--
 .../version-2.4.0/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.4.0/sql-overview.md   |  2 +-
 .../version-2.4.0/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.4.0/standalone.md     | 16 ++++++-------
 .../version-2.4.1/admin-api-clusters.md            |  6 ++---
 .../version-2.4.1/admin-api-functions.md           |  4 ++--
 .../version-2.4.1/admin-api-namespaces.md          |  2 +-
 .../version-2.4.1/admin-api-overview.md            |  8 +++----
 .../version-2.4.1/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.4.1/admin-api-persistent-topics.md   |  2 +-
 .../version-2.4.1/admin-api-tenants.md             |  4 ++--
 .../version-2.4.1/administration-geo.md            |  4 ++--
 .../version-2.4.1/administration-zk-bk.md          |  2 +-
 .../version-2.4.1/client-libraries-cpp.md          |  2 +-
 .../version-2.4.1/client-libraries-go.md           |  8 +++----
 .../version-2.4.1/client-libraries-java.md         | 20 ++++++++--------
 .../version-2.4.1/client-libraries-python.md       |  2 +-
 .../version-2.4.1/client-libraries-websocket.md    |  4 ++--
 .../version-2.4.1/client-libraries.md              | 10 ++++----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.4.1/concepts-authentication.md       |  2 +-
 .../version-2.4.1/concepts-clients.md              |  6 ++---
 .../version-2.4.1/concepts-messaging.md            | 16 ++++++-------
 .../version-2.4.1/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.4.1/concepts-overview.md             | 10 ++++----
 .../version-2.4.1/concepts-replication.md          |  2 +-
 .../version-2.4.1/concepts-schema-registry.md      |  4 ++--
 .../version-2.4.1/concepts-tiered-storage.md       |  2 +-
 .../version-2.4.1/concepts-topic-compaction.md     |  4 ++--
 .../version-2.4.1/cookbooks-compaction.md          |  2 +-
 .../version-2.4.1/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.4.1/cookbooks-partitioned.md         |  2 +-
 .../version-2.4.1/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.4.1/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.4.1/deploy-bare-metal.md             | 18 +++++++-------
 .../versioned_docs/version-2.4.1/deploy-dcos.md    |  2 +-
 .../version-2.4.1/deploy-kubernetes.md             |  4 ++--
 .../version-2.4.1/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.4.1/develop-schema.md |  2 +-
 .../version-2.4.1/functions-deploy.md              |  6 ++---
 .../version-2.4.1/functions-develop.md             |  4 ++--
 .../version-2.4.1/functions-overview.md            |  2 +-
 .../version-2.4.1/functions-worker.md              |  6 ++---
 .../version-2.4.1/getting-started-docker.md        |  6 ++---
 .../version-2.4.1/getting-started-standalone.md    | 18 +++++++-------
 .../website/versioned_docs/version-2.4.1/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.4.1/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.4.1/io-managing.md    |  6 ++---
 .../versioned_docs/version-2.4.1/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.4.1/io-quickstart.md  | 10 ++++----
 .../website/versioned_docs/version-2.4.1/io-use.md |  2 +-
 .../versioned_docs/version-2.4.1/pulsar-2.0.md     |  4 ++--
 .../version-2.4.1/reference-cli-tools.md           |  4 ++--
 .../versioned_docs/version-2.4.1/schema-manage.md  |  2 +-
 .../version-2.4.1/schema-understand.md             |  2 +-
 .../version-2.4.1/security-athenz.md               |  2 +-
 .../version-2.4.1/security-authorization.md        |  6 ++---
 .../versioned_docs/version-2.4.1/security-jwt.md   |  6 ++---
 .../version-2.4.1/security-kerberos.md             |  2 +-
 .../version-2.4.1/security-overview.md             |  4 ++--
 .../version-2.4.1/security-tls-authentication.md   |  6 ++---
 .../version-2.4.1/security-tls-transport.md        | 10 ++++----
 .../version-2.4.1/security-token-admin.md          |  2 +-
 .../version-2.4.1/security-token-client.md         |  4 ++--
 .../version-2.4.1/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.4.1/sql-overview.md   |  2 +-
 .../version-2.4.1/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.4.1/standalone.md     | 18 +++++++-------
 .../version-2.4.2/admin-api-clusters.md            |  6 ++---
 .../version-2.4.2/admin-api-functions.md           |  4 ++--
 .../version-2.4.2/admin-api-namespaces.md          |  2 +-
 .../version-2.4.2/admin-api-overview.md            |  8 +++----
 .../version-2.4.2/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.4.2/admin-api-persistent-topics.md   |  2 +-
 .../version-2.4.2/admin-api-tenants.md             |  4 ++--
 .../version-2.4.2/administration-geo.md            |  4 ++--
 .../version-2.4.2/administration-zk-bk.md          |  2 +-
 .../version-2.4.2/client-libraries-cpp.md          |  2 +-
 .../version-2.4.2/client-libraries-go.md           |  8 +++----
 .../version-2.4.2/client-libraries-java.md         | 20 ++++++++--------
 .../version-2.4.2/client-libraries-python.md       |  2 +-
 .../version-2.4.2/client-libraries-websocket.md    |  4 ++--
 .../version-2.4.2/client-libraries.md              | 10 ++++----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.4.2/concepts-authentication.md       |  2 +-
 .../version-2.4.2/concepts-clients.md              |  6 ++---
 .../version-2.4.2/concepts-messaging.md            | 16 ++++++-------
 .../version-2.4.2/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.4.2/concepts-overview.md             | 10 ++++----
 .../version-2.4.2/concepts-replication.md          |  2 +-
 .../version-2.4.2/concepts-schema-registry.md      |  4 ++--
 .../version-2.4.2/concepts-tiered-storage.md       |  2 +-
 .../version-2.4.2/concepts-topic-compaction.md     |  4 ++--
 .../version-2.4.2/cookbooks-compaction.md          |  2 +-
 .../version-2.4.2/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.4.2/cookbooks-partitioned.md         |  2 +-
 .../version-2.4.2/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.4.2/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.4.2/deploy-bare-metal.md             | 18 +++++++-------
 .../versioned_docs/version-2.4.2/deploy-dcos.md    |  2 +-
 .../version-2.4.2/deploy-kubernetes.md             |  4 ++--
 .../version-2.4.2/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.4.2/develop-schema.md |  2 +-
 .../version-2.4.2/functions-deploy.md              |  6 ++---
 .../version-2.4.2/functions-develop.md             |  4 ++--
 .../version-2.4.2/functions-overview.md            |  2 +-
 .../version-2.4.2/functions-worker.md              |  6 ++---
 .../version-2.4.2/getting-started-docker.md        |  6 ++---
 .../version-2.4.2/getting-started-standalone.md    | 18 +++++++-------
 .../website/versioned_docs/version-2.4.2/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.4.2/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.4.2/io-managing.md    |  6 ++---
 .../versioned_docs/version-2.4.2/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.4.2/io-quickstart.md  | 10 ++++----
 .../website/versioned_docs/version-2.4.2/io-use.md |  2 +-
 .../versioned_docs/version-2.4.2/pulsar-2.0.md     |  4 ++--
 .../version-2.4.2/reference-cli-tools.md           |  4 ++--
 .../versioned_docs/version-2.4.2/schema-manage.md  |  2 +-
 .../version-2.4.2/schema-understand.md             |  2 +-
 .../version-2.4.2/security-athenz.md               |  2 +-
 .../version-2.4.2/security-authorization.md        |  6 ++---
 .../versioned_docs/version-2.4.2/security-jwt.md   |  6 ++---
 .../version-2.4.2/security-kerberos.md             |  2 +-
 .../version-2.4.2/security-overview.md             |  4 ++--
 .../version-2.4.2/security-tls-authentication.md   |  6 ++---
 .../version-2.4.2/security-tls-transport.md        | 10 ++++----
 .../version-2.4.2/security-token-admin.md          |  2 +-
 .../version-2.4.2/security-token-client.md         |  4 ++--
 .../version-2.4.2/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.4.2/sql-overview.md   |  2 +-
 .../version-2.4.2/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.4.2/standalone.md     | 18 +++++++-------
 .../version-2.5.0/admin-api-clusters.md            |  6 ++---
 .../version-2.5.0/admin-api-functions.md           |  2 +-
 .../version-2.5.0/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.5.0/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.5.0/admin-api-tenants.md             |  4 ++--
 .../version-2.5.0/administration-dashboard.md      |  2 +-
 .../version-2.5.0/administration-geo.md            |  4 ++--
 .../version-2.5.0/administration-zk-bk.md          |  2 +-
 .../version-2.5.0/client-libraries-cpp.md          |  2 +-
 .../version-2.5.0/client-libraries-go.md           | 12 +++++-----
 .../version-2.5.0/client-libraries-java.md         | 20 ++++++++--------
 .../version-2.5.0/client-libraries-node.md         |  8 +++----
 .../version-2.5.0/client-libraries-python.md       |  2 +-
 .../version-2.5.0/client-libraries-websocket.md    |  4 ++--
 .../version-2.5.0/client-libraries.md              | 12 +++++-----
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.5.0/concepts-authentication.md       |  2 +-
 .../version-2.5.0/concepts-clients.md              |  2 +-
 .../version-2.5.0/concepts-messaging.md            | 16 ++++++-------
 .../version-2.5.0/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.5.0/concepts-overview.md             | 10 ++++----
 .../version-2.5.0/concepts-replication.md          |  2 +-
 .../version-2.5.0/concepts-schema-registry.md      |  4 ++--
 .../version-2.5.0/concepts-tiered-storage.md       |  2 +-
 .../version-2.5.0/concepts-topic-compaction.md     |  4 ++--
 .../version-2.5.0/cookbooks-compaction.md          |  2 +-
 .../version-2.5.0/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.5.0/cookbooks-partitioned.md         |  2 +-
 .../version-2.5.0/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.5.0/deploy-aws.md     |  2 +-
 .../deploy-bare-metal-multi-cluster.md             | 26 ++++++++++----------
 .../version-2.5.0/deploy-bare-metal.md             | 18 +++++++-------
 .../versioned_docs/version-2.5.0/deploy-dcos.md    |  2 +-
 .../version-2.5.0/deploy-kubernetes.md             |  4 ++--
 .../version-2.5.0/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.5.0/develop-schema.md |  2 +-
 .../version-2.5.0/functions-deploy.md              |  8 +++----
 .../version-2.5.0/functions-develop.md             |  6 ++---
 .../version-2.5.0/functions-overview.md            |  2 +-
 .../version-2.5.0/functions-worker.md              |  6 ++---
 .../version-2.5.0/getting-started-docker.md        |  6 ++---
 .../version-2.5.0/getting-started-helm.md          |  6 ++---
 .../version-2.5.0/getting-started-standalone.md    | 18 +++++++-------
 .../versioned_docs/version-2.5.0/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.5.0/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.5.0/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.5.0/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.5.0/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.5.0/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.5.0/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.5.0/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.5.0/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.5.0/io-use.md |  2 +-
 .../version-2.5.0/kubernetes-helm.md               |  6 ++---
 .../versioned_docs/version-2.5.0/pulsar-2.0.md     |  4 ++--
 .../version-2.5.0/reference-cli-tools.md           |  2 +-
 .../versioned_docs/version-2.5.0/schema-manage.md  |  2 +-
 .../version-2.5.0/schema-understand.md             |  2 +-
 .../version-2.5.0/security-athenz.md               |  2 +-
 .../version-2.5.0/security-authorization.md        |  8 +++----
 .../version-2.5.0/security-extending.md            |  2 +-
 .../versioned_docs/version-2.5.0/security-jwt.md   |  6 ++---
 .../version-2.5.0/security-kerberos.md             |  2 +-
 .../version-2.5.0/security-overview.md             |  2 +-
 .../version-2.5.0/security-tls-authentication.md   |  6 ++---
 .../version-2.5.0/security-tls-transport.md        | 10 ++++----
 .../version-2.5.0/security-token-admin.md          |  2 +-
 .../version-2.5.0/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.5.0/sql-overview.md   |  2 +-
 .../version-2.5.0/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.5.0/standalone.md     | 18 +++++++-------
 .../version-2.5.1/admin-api-clusters.md            |  6 ++---
 .../version-2.5.1/admin-api-functions.md           |  2 +-
 .../version-2.5.1/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.5.1/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.5.1/admin-api-tenants.md             |  4 ++--
 .../version-2.5.1/administration-geo.md            |  4 ++--
 .../version-2.5.1/administration-zk-bk.md          |  2 +-
 .../version-2.5.1/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.5.1/client-libraries-cpp.md          |  2 +-
 .../version-2.5.1/client-libraries-go.md           |  6 ++---
 .../version-2.5.1/client-libraries-java.md         | 20 ++++++++--------
 .../version-2.5.1/client-libraries-node.md         |  8 +++----
 .../version-2.5.1/client-libraries-python.md       |  2 +-
 .../version-2.5.1/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.5.1/concepts-authentication.md       |  2 +-
 .../version-2.5.1/concepts-clients.md              |  6 ++---
 .../version-2.5.1/concepts-messaging.md            | 20 ++++++++--------
 .../version-2.5.1/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.5.1/concepts-overview.md             | 10 ++++----
 .../version-2.5.1/concepts-replication.md          |  2 +-
 .../version-2.5.1/concepts-tiered-storage.md       |  2 +-
 .../version-2.5.1/concepts-topic-compaction.md     |  4 ++--
 .../version-2.5.1/cookbooks-compaction.md          |  2 +-
 .../version-2.5.1/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.5.1/cookbooks-partitioned.md         |  4 ++--
 .../version-2.5.1/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.5.1/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.5.1/deploy-bare-metal.md             | 18 +++++++-------
 .../versioned_docs/version-2.5.1/deploy-dcos.md    |  2 +-
 .../version-2.5.1/deploy-kubernetes.md             |  4 ++--
 .../version-2.5.1/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.5.1/develop-schema.md |  2 +-
 .../version-2.5.1/functions-deploy.md              |  8 +++----
 .../version-2.5.1/functions-develop.md             |  6 ++---
 .../version-2.5.1/functions-overview.md            |  2 +-
 .../version-2.5.1/functions-worker.md              | 10 ++++----
 .../version-2.5.1/getting-started-docker.md        |  6 ++---
 .../version-2.5.1/getting-started-helm.md          |  6 ++---
 .../version-2.5.1/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.5.1/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.5.1/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.5.1/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.5.1/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.5.1/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.5.1/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.5.1/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.5.1/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.5.1/io-use.md |  2 +-
 .../versioned_docs/version-2.5.1/pulsar-2.0.md     |  4 ++--
 .../version-2.5.1/reference-cli-tools.md           |  2 +-
 .../version-2.5.1/schema-get-started.md            |  2 +-
 .../versioned_docs/version-2.5.1/schema-manage.md  |  2 +-
 .../version-2.5.1/schema-understand.md             |  2 +-
 .../version-2.5.1/security-athenz.md               |  2 +-
 .../version-2.5.1/security-authorization.md        |  8 +++----
 .../version-2.5.1/security-bouncy-castle.md        |  2 +-
 .../versioned_docs/version-2.5.1/security-jwt.md   |  6 ++---
 .../version-2.5.1/security-kerberos.md             |  2 +-
 .../version-2.5.1/security-overview.md             |  2 +-
 .../version-2.5.1/security-tls-authentication.md   |  8 +++----
 .../version-2.5.1/security-tls-transport.md        | 12 +++++-----
 .../version-2.5.1/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.5.1/sql-overview.md   |  2 +-
 .../versioned_docs/version-2.5.1/standalone.md     | 16 ++++++-------
 .../version-2.5.2/admin-api-clusters.md            |  6 ++---
 .../version-2.5.2/admin-api-functions.md           |  2 +-
 .../version-2.5.2/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.5.2/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.5.2/admin-api-tenants.md             |  4 ++--
 .../version-2.5.2/administration-geo.md            |  4 ++--
 .../version-2.5.2/administration-zk-bk.md          |  2 +-
 .../version-2.5.2/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.5.2/client-libraries-cpp.md          |  2 +-
 .../version-2.5.2/client-libraries-go.md           |  6 ++---
 .../version-2.5.2/client-libraries-java.md         | 20 ++++++++--------
 .../version-2.5.2/client-libraries-node.md         |  8 +++----
 .../version-2.5.2/client-libraries-python.md       |  2 +-
 .../version-2.5.2/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.5.2/concepts-authentication.md       |  2 +-
 .../version-2.5.2/concepts-clients.md              |  6 ++---
 .../version-2.5.2/concepts-messaging.md            | 20 ++++++++--------
 .../version-2.5.2/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.5.2/concepts-overview.md             | 10 ++++----
 .../version-2.5.2/concepts-replication.md          |  2 +-
 .../version-2.5.2/concepts-tiered-storage.md       |  2 +-
 .../version-2.5.2/concepts-topic-compaction.md     |  4 ++--
 .../version-2.5.2/cookbooks-compaction.md          |  2 +-
 .../version-2.5.2/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.5.2/cookbooks-partitioned.md         |  4 ++--
 .../version-2.5.2/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.5.2/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.5.2/deploy-bare-metal.md             | 18 +++++++-------
 .../versioned_docs/version-2.5.2/deploy-dcos.md    |  2 +-
 .../version-2.5.2/deploy-kubernetes.md             |  4 ++--
 .../version-2.5.2/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.5.2/develop-schema.md |  2 +-
 .../version-2.5.2/functions-deploy.md              |  8 +++----
 .../version-2.5.2/functions-develop.md             |  6 ++---
 .../version-2.5.2/functions-overview.md            |  2 +-
 .../version-2.5.2/functions-worker.md              | 10 ++++----
 .../version-2.5.2/getting-started-docker.md        |  6 ++---
 .../version-2.5.2/getting-started-helm.md          |  6 ++---
 .../version-2.5.2/getting-started-standalone.md    | 18 +++++++-------
 .../versioned_docs/version-2.5.2/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.5.2/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.5.2/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.5.2/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.5.2/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.5.2/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.5.2/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.5.2/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.5.2/io-use.md |  2 +-
 .../version-2.5.2/kubernetes-helm.md               |  6 ++---
 .../versioned_docs/version-2.5.2/pulsar-2.0.md     |  4 ++--
 .../version-2.5.2/reference-cli-tools.md           |  2 +-
 .../version-2.5.2/schema-get-started.md            |  2 +-
 .../versioned_docs/version-2.5.2/schema-manage.md  |  2 +-
 .../version-2.5.2/schema-understand.md             |  2 +-
 .../version-2.5.2/security-athenz.md               |  2 +-
 .../version-2.5.2/security-authorization.md        |  8 +++----
 .../version-2.5.2/security-bouncy-castle.md        |  2 +-
 .../versioned_docs/version-2.5.2/security-jwt.md   |  6 ++---
 .../version-2.5.2/security-kerberos.md             |  2 +-
 .../version-2.5.2/security-overview.md             |  2 +-
 .../version-2.5.2/security-tls-authentication.md   |  8 +++----
 .../version-2.5.2/security-tls-transport.md        | 12 +++++-----
 .../version-2.5.2/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.5.2/sql-overview.md   |  2 +-
 .../version-2.5.2/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.5.2/standalone.md     | 18 +++++++-------
 .../version-2.6.0/admin-api-brokers.md             |  4 ++--
 .../version-2.6.0/admin-api-clusters.md            |  8 +++----
 .../version-2.6.0/admin-api-functions.md           |  4 ++--
 .../version-2.6.0/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../version-2.6.0/admin-api-overview.md            |  8 +++----
 .../version-2.6.0/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.6.0/admin-api-tenants.md             |  2 +-
 .../version-2.6.0/administration-dashboard.md      |  2 +-
 .../version-2.6.0/administration-geo.md            |  4 ++--
 .../version-2.6.0/administration-zk-bk.md          |  2 +-
 .../version-2.6.0/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.6.0/client-libraries-cpp.md          |  2 +-
 .../version-2.6.0/client-libraries-dotnet.md       |  2 +-
 .../version-2.6.0/client-libraries-go.md           |  6 ++---
 .../version-2.6.0/client-libraries-java.md         | 20 ++++++++--------
 .../version-2.6.0/client-libraries-node.md         |  8 +++----
 .../version-2.6.0/client-libraries-python.md       |  2 +-
 .../version-2.6.0/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.6.0/concepts-authentication.md       |  2 +-
 .../version-2.6.0/concepts-clients.md              |  4 ++--
 .../version-2.6.0/concepts-messaging.md            | 20 ++++++++--------
 .../version-2.6.0/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.6.0/concepts-overview.md             | 10 ++++----
 .../version-2.6.0/concepts-replication.md          |  2 +-
 .../version-2.6.0/concepts-tiered-storage.md       |  2 +-
 .../version-2.6.0/concepts-topic-compaction.md     |  4 ++--
 .../version-2.6.0/cookbooks-compaction.md          |  2 +-
 .../version-2.6.0/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.6.0/cookbooks-partitioned.md         |  4 ++--
 .../version-2.6.0/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.6.0/deploy-aws.md     |  2 +-
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.6.0/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.6.0/deploy-dcos.md    |  2 +-
 .../version-2.6.0/deploy-kubernetes.md             |  4 ++--
 .../version-2.6.0/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.6.0/develop-schema.md |  2 +-
 .../version-2.6.0/functions-deploy.md              |  6 ++---
 .../version-2.6.0/functions-develop.md             |  6 ++---
 .../version-2.6.0/functions-overview.md            |  2 +-
 .../version-2.6.0/functions-worker.md              |  6 ++---
 .../version-2.6.0/getting-started-docker.md        |  6 ++---
 .../version-2.6.0/getting-started-helm.md          |  6 ++---
 .../version-2.6.0/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.6.0/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.6.0/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.6.0/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.6.0/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.6.0/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.6.0/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.6.0/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.6.0/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.6.0/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.6.0/io-use.md |  2 +-
 .../version-2.6.0/kubernetes-helm.md               |  6 ++---
 .../versioned_docs/version-2.6.0/pulsar-2.0.md     |  4 ++--
 .../version-2.6.0/reference-cli-tools.md           |  2 +-
 .../version-2.6.0/schema-get-started.md            |  2 +-
 .../versioned_docs/version-2.6.0/schema-manage.md  |  2 +-
 .../version-2.6.0/schema-understand.md             |  2 +-
 .../version-2.6.0/security-athenz.md               |  2 +-
 .../version-2.6.0/security-authorization.md        |  6 ++---
 .../version-2.6.0/security-bouncy-castle.md        |  2 +-
 .../version-2.6.0/security-extending.md            |  2 +-
 .../versioned_docs/version-2.6.0/security-jwt.md   |  6 ++---
 .../version-2.6.0/security-kerberos.md             |  2 +-
 .../version-2.6.0/security-overview.md             |  2 +-
 .../version-2.6.0/security-tls-authentication.md   |  8 +++----
 .../version-2.6.0/security-tls-keystore.md         |  6 ++---
 .../version-2.6.0/security-tls-transport.md        | 12 +++++-----
 .../version-2.6.0/security-token-admin.md          |  2 +-
 .../version-2.6.0/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.6.0/sql-overview.md   |  2 +-
 .../version-2.6.0/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.6.0/standalone.md     | 16 ++++++-------
 .../version-2.6.1/admin-api-brokers.md             |  4 ++--
 .../version-2.6.1/admin-api-clusters.md            |  8 +++----
 .../version-2.6.1/admin-api-functions.md           |  4 ++--
 .../version-2.6.1/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../version-2.6.1/admin-api-overview.md            |  8 +++----
 .../version-2.6.1/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.6.1/admin-api-tenants.md             |  2 +-
 .../version-2.6.1/administration-dashboard.md      |  2 +-
 .../version-2.6.1/administration-geo.md            |  4 ++--
 .../version-2.6.1/administration-zk-bk.md          |  2 +-
 .../version-2.6.1/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.6.1/client-libraries-cpp.md          |  2 +-
 .../version-2.6.1/client-libraries-dotnet.md       |  2 +-
 .../version-2.6.1/client-libraries-go.md           |  8 +++----
 .../version-2.6.1/client-libraries-java.md         | 22 ++++++++---------
 .../version-2.6.1/client-libraries-node.md         |  8 +++----
 .../version-2.6.1/client-libraries-python.md       |  2 +-
 .../version-2.6.1/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.6.1/concepts-authentication.md       |  2 +-
 .../version-2.6.1/concepts-clients.md              |  4 ++--
 .../version-2.6.1/concepts-messaging.md            | 20 ++++++++--------
 .../version-2.6.1/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.6.1/concepts-overview.md             | 10 ++++----
 .../version-2.6.1/concepts-replication.md          |  2 +-
 .../version-2.6.1/concepts-tiered-storage.md       |  2 +-
 .../version-2.6.1/concepts-topic-compaction.md     |  4 ++--
 .../version-2.6.1/cookbooks-compaction.md          |  2 +-
 .../version-2.6.1/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.6.1/cookbooks-partitioned.md         |  4 ++--
 .../version-2.6.1/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.6.1/deploy-aws.md     |  2 +-
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.6.1/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.6.1/deploy-dcos.md    |  2 +-
 .../version-2.6.1/deploy-kubernetes.md             |  4 ++--
 .../version-2.6.1/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.6.1/develop-schema.md |  2 +-
 .../version-2.6.1/functions-deploy.md              |  6 ++---
 .../version-2.6.1/functions-develop.md             |  6 ++---
 .../version-2.6.1/functions-overview.md            |  2 +-
 .../version-2.6.1/functions-worker.md              |  8 +++----
 .../version-2.6.1/getting-started-docker.md        |  6 ++---
 .../version-2.6.1/getting-started-helm.md          |  6 ++---
 .../version-2.6.1/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.6.1/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.6.1/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.6.1/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.6.1/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.6.1/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.6.1/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.6.1/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.6.1/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.6.1/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.6.1/io-use.md |  2 +-
 .../version-2.6.1/kubernetes-helm.md               |  6 ++---
 .../versioned_docs/version-2.6.1/pulsar-2.0.md     |  4 ++--
 .../version-2.6.1/reference-cli-tools.md           |  2 +-
 .../versioned_docs/version-2.6.1/schema-manage.md  |  2 +-
 .../version-2.6.1/schema-understand.md             |  2 +-
 .../version-2.6.1/security-athenz.md               |  2 +-
 .../version-2.6.1/security-authorization.md        |  6 ++---
 .../version-2.6.1/security-bouncy-castle.md        |  2 +-
 .../version-2.6.1/security-extending.md            |  2 +-
 .../versioned_docs/version-2.6.1/security-jwt.md   |  6 ++---
 .../version-2.6.1/security-kerberos.md             |  2 +-
 .../version-2.6.1/security-overview.md             |  2 +-
 .../version-2.6.1/security-tls-authentication.md   |  8 +++----
 .../version-2.6.1/security-tls-keystore.md         |  6 ++---
 .../version-2.6.1/security-tls-transport.md        | 12 +++++-----
 .../version-2.6.1/security-token-admin.md          |  2 +-
 .../version-2.6.1/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.6.1/sql-overview.md   |  2 +-
 .../version-2.6.1/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.6.1/standalone.md     | 16 ++++++-------
 .../version-2.6.2/admin-api-brokers.md             |  4 ++--
 .../version-2.6.2/admin-api-clusters.md            |  8 +++----
 .../version-2.6.2/admin-api-functions.md           |  4 ++--
 .../version-2.6.2/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../version-2.6.2/admin-api-overview.md            |  8 +++----
 .../version-2.6.2/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.6.2/admin-api-tenants.md             |  2 +-
 .../version-2.6.2/administration-dashboard.md      |  2 +-
 .../version-2.6.2/administration-geo.md            |  4 ++--
 .../version-2.6.2/administration-zk-bk.md          |  2 +-
 .../version-2.6.2/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.6.2/client-libraries-cpp.md          |  2 +-
 .../version-2.6.2/client-libraries-dotnet.md       |  2 +-
 .../version-2.6.2/client-libraries-go.md           |  8 +++----
 .../version-2.6.2/client-libraries-java.md         | 22 ++++++++---------
 .../version-2.6.2/client-libraries-node.md         |  8 +++----
 .../version-2.6.2/client-libraries-python.md       |  2 +-
 .../version-2.6.2/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.6.2/concepts-authentication.md       |  2 +-
 .../version-2.6.2/concepts-clients.md              |  4 ++--
 .../version-2.6.2/concepts-messaging.md            | 20 ++++++++--------
 .../version-2.6.2/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.6.2/concepts-overview.md             | 10 ++++----
 .../version-2.6.2/concepts-replication.md          |  2 +-
 .../version-2.6.2/concepts-tiered-storage.md       |  2 +-
 .../version-2.6.2/concepts-topic-compaction.md     |  4 ++--
 .../version-2.6.2/cookbooks-compaction.md          |  2 +-
 .../version-2.6.2/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.6.2/cookbooks-partitioned.md         |  4 ++--
 .../version-2.6.2/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.6.2/deploy-aws.md     |  2 +-
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.6.2/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.6.2/deploy-dcos.md    |  2 +-
 .../version-2.6.2/deploy-kubernetes.md             |  4 ++--
 .../version-2.6.2/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.6.2/develop-schema.md |  2 +-
 .../version-2.6.2/functions-deploy.md              |  6 ++---
 .../version-2.6.2/functions-develop.md             |  6 ++---
 .../version-2.6.2/functions-overview.md            |  2 +-
 .../version-2.6.2/functions-worker.md              |  8 +++----
 .../version-2.6.2/getting-started-docker.md        |  6 ++---
 .../version-2.6.2/getting-started-helm.md          |  6 ++---
 .../version-2.6.2/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.6.2/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.6.2/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.6.2/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.6.2/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.6.2/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.6.2/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.6.2/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.6.2/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.6.2/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.6.2/io-use.md |  2 +-
 .../version-2.6.2/kubernetes-helm.md               |  6 ++---
 .../versioned_docs/version-2.6.2/pulsar-2.0.md     |  4 ++--
 .../version-2.6.2/reference-cli-tools.md           |  2 +-
 .../versioned_docs/version-2.6.2/schema-manage.md  |  2 +-
 .../version-2.6.2/schema-understand.md             |  2 +-
 .../version-2.6.2/security-athenz.md               |  2 +-
 .../version-2.6.2/security-authorization.md        |  6 ++---
 .../version-2.6.2/security-bouncy-castle.md        |  2 +-
 .../version-2.6.2/security-extending.md            |  2 +-
 .../versioned_docs/version-2.6.2/security-jwt.md   |  6 ++---
 .../version-2.6.2/security-kerberos.md             |  2 +-
 .../version-2.6.2/security-overview.md             |  2 +-
 .../version-2.6.2/security-tls-authentication.md   |  8 +++----
 .../version-2.6.2/security-tls-keystore.md         |  6 ++---
 .../version-2.6.2/security-tls-transport.md        | 12 +++++-----
 .../version-2.6.2/security-token-admin.md          |  2 +-
 .../version-2.6.2/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.6.2/sql-overview.md   |  2 +-
 .../version-2.6.2/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.6.2/standalone.md     | 16 ++++++-------
 .../version-2.6.3/admin-api-brokers.md             |  4 ++--
 .../version-2.6.3/admin-api-clusters.md            |  8 +++----
 .../version-2.6.3/admin-api-functions.md           |  4 ++--
 .../version-2.6.3/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../version-2.6.3/admin-api-overview.md            |  8 +++----
 .../version-2.6.3/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.6.3/admin-api-tenants.md             |  2 +-
 .../version-2.6.3/administration-dashboard.md      |  2 +-
 .../version-2.6.3/administration-geo.md            |  4 ++--
 .../version-2.6.3/administration-zk-bk.md          |  2 +-
 .../version-2.6.3/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.6.3/client-libraries-cpp.md          |  2 +-
 .../version-2.6.3/client-libraries-dotnet.md       |  2 +-
 .../version-2.6.3/client-libraries-go.md           |  8 +++----
 .../version-2.6.3/client-libraries-java.md         | 22 ++++++++---------
 .../version-2.6.3/client-libraries-node.md         |  8 +++----
 .../version-2.6.3/client-libraries-python.md       |  2 +-
 .../version-2.6.3/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.6.3/concepts-authentication.md       |  2 +-
 .../version-2.6.3/concepts-clients.md              |  4 ++--
 .../version-2.6.3/concepts-messaging.md            | 20 ++++++++--------
 .../version-2.6.3/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.6.3/concepts-overview.md             | 10 ++++----
 .../version-2.6.3/concepts-replication.md          |  2 +-
 .../version-2.6.3/concepts-tiered-storage.md       |  2 +-
 .../version-2.6.3/concepts-topic-compaction.md     |  4 ++--
 .../version-2.6.3/cookbooks-compaction.md          |  2 +-
 .../version-2.6.3/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.6.3/cookbooks-partitioned.md         |  4 ++--
 .../version-2.6.3/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.6.3/deploy-aws.md     |  2 +-
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.6.3/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.6.3/deploy-dcos.md    |  2 +-
 .../version-2.6.3/deploy-kubernetes.md             |  4 ++--
 .../version-2.6.3/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.6.3/develop-schema.md |  2 +-
 .../version-2.6.3/functions-deploy.md              |  6 ++---
 .../version-2.6.3/functions-develop.md             |  6 ++---
 .../version-2.6.3/functions-overview.md            |  2 +-
 .../version-2.6.3/functions-worker.md              |  8 +++----
 .../version-2.6.3/getting-started-docker.md        |  6 ++---
 .../version-2.6.3/getting-started-helm.md          |  6 ++---
 .../version-2.6.3/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.6.3/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.6.3/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.6.3/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.6.3/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.6.3/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.6.3/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.6.3/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.6.3/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.6.3/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.6.3/io-use.md |  2 +-
 .../version-2.6.3/kubernetes-helm.md               |  6 ++---
 .../versioned_docs/version-2.6.3/pulsar-2.0.md     |  4 ++--
 .../version-2.6.3/reference-cli-tools.md           |  2 +-
 .../versioned_docs/version-2.6.3/schema-manage.md  |  2 +-
 .../version-2.6.3/schema-understand.md             |  2 +-
 .../version-2.6.3/security-athenz.md               |  2 +-
 .../version-2.6.3/security-authorization.md        |  6 ++---
 .../version-2.6.3/security-bouncy-castle.md        |  2 +-
 .../version-2.6.3/security-extending.md            |  2 +-
 .../versioned_docs/version-2.6.3/security-jwt.md   |  6 ++---
 .../version-2.6.3/security-kerberos.md             |  2 +-
 .../version-2.6.3/security-overview.md             |  2 +-
 .../version-2.6.3/security-tls-authentication.md   |  8 +++----
 .../version-2.6.3/security-tls-keystore.md         |  6 ++---
 .../version-2.6.3/security-tls-transport.md        | 12 +++++-----
 .../version-2.6.3/security-token-admin.md          |  2 +-
 .../version-2.6.3/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.6.3/sql-overview.md   |  2 +-
 .../version-2.6.3/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.6.3/standalone.md     | 16 ++++++-------
 .../version-2.6.4/admin-api-brokers.md             |  4 ++--
 .../version-2.6.4/admin-api-clusters.md            |  8 +++----
 .../version-2.6.4/admin-api-functions.md           |  4 ++--
 .../version-2.6.4/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../version-2.6.4/admin-api-overview.md            |  8 +++----
 .../version-2.6.4/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.6.4/admin-api-tenants.md             |  2 +-
 .../version-2.6.4/administration-dashboard.md      |  2 +-
 .../version-2.6.4/administration-geo.md            |  4 ++--
 .../version-2.6.4/administration-zk-bk.md          |  2 +-
 .../version-2.6.4/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.6.4/client-libraries-cpp.md          |  2 +-
 .../version-2.6.4/client-libraries-dotnet.md       |  2 +-
 .../version-2.6.4/client-libraries-go.md           |  8 +++----
 .../version-2.6.4/client-libraries-java.md         | 22 ++++++++---------
 .../version-2.6.4/client-libraries-node.md         |  8 +++----
 .../version-2.6.4/client-libraries-python.md       |  2 +-
 .../version-2.6.4/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.6.4/concepts-authentication.md       |  2 +-
 .../version-2.6.4/concepts-clients.md              |  4 ++--
 .../version-2.6.4/concepts-messaging.md            | 20 ++++++++--------
 .../version-2.6.4/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.6.4/concepts-overview.md             | 10 ++++----
 .../version-2.6.4/concepts-replication.md          |  2 +-
 .../version-2.6.4/concepts-tiered-storage.md       |  2 +-
 .../version-2.6.4/concepts-topic-compaction.md     |  4 ++--
 .../version-2.6.4/cookbooks-compaction.md          |  2 +-
 .../version-2.6.4/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.6.4/cookbooks-partitioned.md         |  4 ++--
 .../version-2.6.4/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.6.4/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.6.4/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.6.4/deploy-dcos.md    |  2 +-
 .../version-2.6.4/deploy-kubernetes.md             |  4 ++--
 .../version-2.6.4/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.6.4/develop-schema.md |  2 +-
 .../version-2.6.4/functions-deploy.md              |  6 ++---
 .../version-2.6.4/functions-develop.md             |  6 ++---
 .../version-2.6.4/functions-overview.md            |  2 +-
 .../version-2.6.4/functions-worker.md              |  8 +++----
 .../version-2.6.4/getting-started-docker.md        |  6 ++---
 .../version-2.6.4/getting-started-helm.md          |  6 ++---
 .../version-2.6.4/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.6.4/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.6.4/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.6.4/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.6.4/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.6.4/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.6.4/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.6.4/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.6.4/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.6.4/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.6.4/io-use.md |  2 +-
 .../version-2.6.4/kubernetes-helm.md               |  6 ++---
 .../versioned_docs/version-2.6.4/pulsar-2.0.md     |  4 ++--
 .../version-2.6.4/reference-cli-tools.md           |  2 +-
 .../versioned_docs/version-2.6.4/schema-manage.md  |  2 +-
 .../version-2.6.4/schema-understand.md             |  2 +-
 .../version-2.6.4/security-athenz.md               |  2 +-
 .../version-2.6.4/security-authorization.md        |  6 ++---
 .../version-2.6.4/security-bouncy-castle.md        |  2 +-
 .../version-2.6.4/security-extending.md            |  2 +-
 .../versioned_docs/version-2.6.4/security-jwt.md   |  6 ++---
 .../version-2.6.4/security-kerberos.md             |  2 +-
 .../version-2.6.4/security-overview.md             |  2 +-
 .../version-2.6.4/security-tls-authentication.md   |  8 +++----
 .../version-2.6.4/security-tls-keystore.md         |  6 ++---
 .../version-2.6.4/security-tls-transport.md        | 12 +++++-----
 .../version-2.6.4/security-token-admin.md          |  2 +-
 .../version-2.6.4/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.6.4/sql-overview.md   |  2 +-
 .../version-2.6.4/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.6.4/standalone.md     | 16 ++++++-------
 .../version-2.7.0/admin-api-brokers.md             |  4 ++--
 .../version-2.7.0/admin-api-clusters.md            |  8 +++----
 .../version-2.7.0/admin-api-functions.md           |  4 ++--
 .../version-2.7.0/admin-api-namespaces.md          |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.7.0/admin-api-overview.md            |  4 ++--
 .../version-2.7.0/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.7.0/admin-api-persistent-topics.md   |  2 +-
 .../version-2.7.0/admin-api-tenants.md             |  4 ++--
 .../version-2.7.0/admin-api-topics.md              |  6 ++---
 .../version-2.7.0/administration-dashboard.md      |  2 +-
 .../version-2.7.0/administration-geo.md            |  6 ++---
 .../version-2.7.0/administration-zk-bk.md          |  2 +-
 .../version-2.7.0/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.7.0/client-libraries-cpp.md          |  2 +-
 .../version-2.7.0/client-libraries-dotnet.md       |  2 +-
 .../version-2.7.0/client-libraries-go.md           |  8 +++----
 .../version-2.7.0/client-libraries-java.md         | 22 ++++++++---------
 .../version-2.7.0/client-libraries-node.md         |  8 +++----
 .../version-2.7.0/client-libraries-python.md       |  2 +-
 .../version-2.7.0/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.7.0/concepts-authentication.md       |  2 +-
 .../version-2.7.0/concepts-clients.md              |  6 ++---
 .../version-2.7.0/concepts-messaging.md            | 22 ++++++++---------
 .../version-2.7.0/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.7.0/concepts-overview.md             | 10 ++++----
 .../version-2.7.0/concepts-replication.md          |  2 +-
 .../version-2.7.0/concepts-tiered-storage.md       |  2 +-
 .../version-2.7.0/concepts-topic-compaction.md     |  4 ++--
 .../version-2.7.0/cookbooks-compaction.md          |  2 +-
 .../version-2.7.0/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.7.0/cookbooks-partitioned.md         |  2 +-
 .../version-2.7.0/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.7.0/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.7.0/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.7.0/deploy-dcos.md    |  2 +-
 .../versioned_docs/version-2.7.0/deploy-docker.md  |  2 +-
 .../version-2.7.0/deploy-kubernetes.md             |  4 ++--
 .../version-2.7.0/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.7.0/develop-schema.md |  2 +-
 .../version-2.7.0/functions-deploy.md              |  6 ++---
 .../version-2.7.0/functions-develop.md             |  6 ++---
 .../version-2.7.0/functions-overview.md            |  2 +-
 .../version-2.7.0/functions-package.md             |  2 +-
 .../version-2.7.0/functions-worker.md              | 10 ++++----
 .../version-2.7.0/getting-started-docker.md        |  6 ++---
 .../version-2.7.0/getting-started-helm.md          |  6 ++---
 .../version-2.7.0/getting-started-pulsar.md        |  4 ++--
 .../version-2.7.0/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.7.0/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.7.0/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.7.0/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.7.0/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.7.0/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.7.0/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.7.0/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.7.0/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.7.0/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.7.0/io-use.md |  2 +-
 .../version-2.7.0/kubernetes-helm.md               |  6 ++---
 .../version-2.7.0/reference-cli-tools.md           |  2 +-
 .../version-2.7.0/schema-get-started.md            |  2 +-
 .../versioned_docs/version-2.7.0/schema-manage.md  |  2 +-
 .../version-2.7.0/schema-understand.md             |  2 +-
 .../version-2.7.0/security-athenz.md               |  2 +-
 .../version-2.7.0/security-authorization.md        |  6 ++---
 .../version-2.7.0/security-bouncy-castle.md        |  2 +-
 .../version-2.7.0/security-extending.md            |  2 +-
 .../versioned_docs/version-2.7.0/security-jwt.md   |  6 ++---
 .../version-2.7.0/security-kerberos.md             |  2 +-
 .../version-2.7.0/security-overview.md             |  2 +-
 .../version-2.7.0/security-tls-authentication.md   |  8 +++----
 .../version-2.7.0/security-tls-keystore.md         |  6 ++---
 .../version-2.7.0/security-tls-transport.md        | 12 +++++-----
 .../version-2.7.0/security-token-admin.md          |  2 +-
 .../version-2.7.0/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.7.0/sql-overview.md   |  2 +-
 .../version-2.7.0/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.7.0/standalone.md     | 16 ++++++-------
 .../version-2.7.0/tiered-storage-overview.md       |  6 ++---
 .../version-2.7.1/admin-api-brokers.md             |  4 ++--
 .../version-2.7.1/admin-api-clusters.md            |  8 +++----
 .../version-2.7.1/admin-api-functions.md           |  4 ++--
 .../version-2.7.1/admin-api-namespaces.md          |  4 ++--
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.7.1/admin-api-overview.md            |  6 ++---
 .../version-2.7.1/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.7.1/admin-api-persistent-topics.md   |  2 +-
 .../version-2.7.1/admin-api-tenants.md             |  4 ++--
 .../version-2.7.1/admin-api-topics.md              |  6 ++---
 .../version-2.7.1/administration-dashboard.md      |  2 +-
 .../version-2.7.1/administration-geo.md            |  6 ++---
 .../version-2.7.1/administration-zk-bk.md          |  2 +-
 .../version-2.7.1/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.7.1/client-libraries-cpp.md          |  2 +-
 .../version-2.7.1/client-libraries-dotnet.md       |  2 +-
 .../version-2.7.1/client-libraries-go.md           |  8 +++----
 .../version-2.7.1/client-libraries-java.md         | 22 ++++++++---------
 .../version-2.7.1/client-libraries-node.md         |  8 +++----
 .../version-2.7.1/client-libraries-python.md       |  2 +-
 .../version-2.7.1/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.7.1/concepts-authentication.md       |  2 +-
 .../version-2.7.1/concepts-clients.md              |  6 ++---
 .../version-2.7.1/concepts-messaging.md            | 22 ++++++++---------
 .../version-2.7.1/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.7.1/concepts-overview.md             | 10 ++++----
 .../version-2.7.1/concepts-replication.md          |  2 +-
 .../version-2.7.1/concepts-tiered-storage.md       |  2 +-
 .../version-2.7.1/concepts-topic-compaction.md     |  4 ++--
 .../version-2.7.1/cookbooks-compaction.md          |  2 +-
 .../version-2.7.1/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.7.1/cookbooks-partitioned.md         |  2 +-
 .../version-2.7.1/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.7.1/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.7.1/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.7.1/deploy-dcos.md    |  2 +-
 .../versioned_docs/version-2.7.1/deploy-docker.md  |  2 +-
 .../version-2.7.1/deploy-kubernetes.md             |  4 ++--
 .../version-2.7.1/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.7.1/develop-schema.md |  2 +-
 .../version-2.7.1/functions-deploy.md              |  6 ++---
 .../version-2.7.1/functions-develop.md             |  6 ++---
 .../version-2.7.1/functions-overview.md            |  2 +-
 .../version-2.7.1/functions-package.md             |  2 +-
 .../version-2.7.1/functions-worker.md              | 10 ++++----
 .../version-2.7.1/getting-started-docker.md        |  6 ++---
 .../version-2.7.1/getting-started-helm.md          |  6 ++---
 .../version-2.7.1/getting-started-pulsar.md        |  4 ++--
 .../version-2.7.1/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.7.1/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.7.1/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.7.1/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.7.1/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.7.1/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.7.1/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.7.1/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.7.1/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.7.1/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.7.1/io-use.md |  2 +-
 .../version-2.7.1/kubernetes-helm.md               |  6 ++---
 .../version-2.7.1/reference-cli-tools.md           |  2 +-
 .../version-2.7.1/schema-get-started.md            |  2 +-
 .../versioned_docs/version-2.7.1/schema-manage.md  |  2 +-
 .../version-2.7.1/schema-understand.md             |  2 +-
 .../version-2.7.1/security-athenz.md               |  2 +-
 .../version-2.7.1/security-authorization.md        |  6 ++---
 .../version-2.7.1/security-bouncy-castle.md        |  2 +-
 .../version-2.7.1/security-extending.md            |  2 +-
 .../versioned_docs/version-2.7.1/security-jwt.md   |  6 ++---
 .../version-2.7.1/security-kerberos.md             |  2 +-
 .../version-2.7.1/security-overview.md             |  2 +-
 .../version-2.7.1/security-tls-authentication.md   |  8 +++----
 .../version-2.7.1/security-tls-keystore.md         |  6 ++---
 .../version-2.7.1/security-tls-transport.md        | 12 +++++-----
 .../version-2.7.1/security-token-admin.md          |  2 +-
 .../version-2.7.1/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.7.1/sql-overview.md   |  2 +-
 .../version-2.7.1/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.7.1/standalone.md     | 16 ++++++-------
 .../version-2.7.1/tiered-storage-overview.md       |  6 ++---
 .../version-2.7.2/admin-api-brokers.md             |  4 ++--
 .../version-2.7.2/admin-api-clusters.md            |  8 +++----
 .../version-2.7.2/admin-api-functions.md           |  4 ++--
 .../version-2.7.2/admin-api-namespaces.md          |  4 ++--
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.7.2/admin-api-overview.md            |  6 ++---
 .../version-2.7.2/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.7.2/admin-api-persistent-topics.md   |  2 +-
 .../version-2.7.2/admin-api-tenants.md             |  4 ++--
 .../version-2.7.2/admin-api-topics.md              |  6 ++---
 .../version-2.7.2/administration-dashboard.md      |  2 +-
 .../version-2.7.2/administration-geo.md            |  6 ++---
 .../version-2.7.2/administration-zk-bk.md          |  2 +-
 .../version-2.7.2/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.7.2/client-libraries-cpp.md          |  2 +-
 .../version-2.7.2/client-libraries-dotnet.md       |  2 +-
 .../version-2.7.2/client-libraries-go.md           |  8 +++----
 .../version-2.7.2/client-libraries-java.md         | 22 ++++++++---------
 .../version-2.7.2/client-libraries-node.md         |  8 +++----
 .../version-2.7.2/client-libraries-python.md       |  2 +-
 .../version-2.7.2/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.7.2/concepts-authentication.md       |  2 +-
 .../version-2.7.2/concepts-clients.md              |  6 ++---
 .../version-2.7.2/concepts-messaging.md            | 22 ++++++++---------
 .../version-2.7.2/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.7.2/concepts-overview.md             | 10 ++++----
 .../version-2.7.2/concepts-replication.md          |  2 +-
 .../version-2.7.2/concepts-tiered-storage.md       |  2 +-
 .../version-2.7.2/concepts-topic-compaction.md     |  4 ++--
 .../version-2.7.2/cookbooks-compaction.md          |  2 +-
 .../version-2.7.2/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.7.2/cookbooks-partitioned.md         |  2 +-
 .../version-2.7.2/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.7.2/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.7.2/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.7.2/deploy-dcos.md    |  2 +-
 .../versioned_docs/version-2.7.2/deploy-docker.md  |  2 +-
 .../version-2.7.2/deploy-kubernetes.md             |  4 ++--
 .../version-2.7.2/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.7.2/develop-schema.md |  2 +-
 .../version-2.7.2/functions-deploy.md              |  6 ++---
 .../version-2.7.2/functions-develop.md             |  6 ++---
 .../version-2.7.2/functions-overview.md            |  2 +-
 .../version-2.7.2/functions-package.md             |  2 +-
 .../version-2.7.2/functions-worker.md              | 10 ++++----
 .../version-2.7.2/getting-started-docker.md        |  6 ++---
 .../version-2.7.2/getting-started-helm.md          |  6 ++---
 .../version-2.7.2/getting-started-pulsar.md        |  4 ++--
 .../version-2.7.2/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.7.2/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.7.2/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.7.2/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.7.2/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.7.2/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.7.2/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.7.2/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.7.2/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.7.2/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.7.2/io-use.md |  2 +-
 .../version-2.7.2/kubernetes-helm.md               |  6 ++---
 .../version-2.7.2/reference-cli-tools.md           |  2 +-
 .../version-2.7.2/schema-get-started.md            |  2 +-
 .../versioned_docs/version-2.7.2/schema-manage.md  |  2 +-
 .../version-2.7.2/schema-understand.md             |  2 +-
 .../version-2.7.2/security-athenz.md               |  2 +-
 .../version-2.7.2/security-authorization.md        |  6 ++---
 .../version-2.7.2/security-bouncy-castle.md        |  2 +-
 .../version-2.7.2/security-extending.md            |  2 +-
 .../versioned_docs/version-2.7.2/security-jwt.md   |  6 ++---
 .../version-2.7.2/security-kerberos.md             |  2 +-
 .../version-2.7.2/security-overview.md             |  2 +-
 .../version-2.7.2/security-tls-authentication.md   |  8 +++----
 .../version-2.7.2/security-tls-keystore.md         |  6 ++---
 .../version-2.7.2/security-tls-transport.md        | 12 +++++-----
 .../version-2.7.2/security-token-admin.md          |  2 +-
 .../version-2.7.2/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.7.2/sql-overview.md   |  2 +-
 .../version-2.7.2/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.7.2/standalone.md     | 16 ++++++-------
 .../version-2.7.2/tiered-storage-overview.md       |  6 ++---
 .../version-2.7.3/admin-api-brokers.md             |  4 ++--
 .../version-2.7.3/admin-api-clusters.md            |  8 +++----
 .../version-2.7.3/admin-api-functions.md           |  4 ++--
 .../version-2.7.3/admin-api-namespaces.md          |  4 ++--
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.7.3/admin-api-overview.md            |  6 ++---
 .../version-2.7.3/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.7.3/admin-api-persistent-topics.md   |  2 +-
 .../version-2.7.3/admin-api-tenants.md             |  4 ++--
 .../version-2.7.3/admin-api-topics.md              |  6 ++---
 .../version-2.7.3/administration-dashboard.md      |  2 +-
 .../version-2.7.3/administration-geo.md            |  6 ++---
 .../version-2.7.3/administration-zk-bk.md          |  2 +-
 .../version-2.7.3/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.7.3/client-libraries-cpp.md          |  2 +-
 .../version-2.7.3/client-libraries-dotnet.md       |  2 +-
 .../version-2.7.3/client-libraries-go.md           |  8 +++----
 .../version-2.7.3/client-libraries-java.md         | 22 ++++++++---------
 .../version-2.7.3/client-libraries-node.md         |  8 +++----
 .../version-2.7.3/client-libraries-python.md       |  2 +-
 .../version-2.7.3/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.7.3/concepts-authentication.md       |  2 +-
 .../version-2.7.3/concepts-clients.md              |  6 ++---
 .../version-2.7.3/concepts-messaging.md            | 22 ++++++++---------
 .../version-2.7.3/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.7.3/concepts-overview.md             | 10 ++++----
 .../version-2.7.3/concepts-replication.md          |  2 +-
 .../version-2.7.3/concepts-tiered-storage.md       |  2 +-
 .../version-2.7.3/concepts-topic-compaction.md     |  4 ++--
 .../version-2.7.3/cookbooks-compaction.md          |  2 +-
 .../version-2.7.3/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.7.3/cookbooks-partitioned.md         |  2 +-
 .../version-2.7.3/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.7.3/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.7.3/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.7.3/deploy-dcos.md    |  2 +-
 .../versioned_docs/version-2.7.3/deploy-docker.md  |  2 +-
 .../version-2.7.3/deploy-kubernetes.md             |  4 ++--
 .../version-2.7.3/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.7.3/develop-schema.md |  2 +-
 .../version-2.7.3/functions-deploy.md              |  6 ++---
 .../version-2.7.3/functions-develop.md             |  6 ++---
 .../version-2.7.3/functions-overview.md            |  2 +-
 .../version-2.7.3/functions-package.md             |  2 +-
 .../version-2.7.3/functions-worker.md              | 10 ++++----
 .../version-2.7.3/getting-started-docker.md        |  6 ++---
 .../version-2.7.3/getting-started-helm.md          |  6 ++---
 .../version-2.7.3/getting-started-pulsar.md        |  4 ++--
 .../version-2.7.3/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.7.3/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.7.3/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.7.3/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.7.3/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.7.3/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.7.3/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.7.3/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.7.3/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.7.3/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.7.3/io-use.md |  2 +-
 .../version-2.7.3/kubernetes-helm.md               |  6 ++---
 .../version-2.7.3/reference-cli-tools.md           |  2 +-
 .../version-2.7.3/schema-get-started.md            |  2 +-
 .../versioned_docs/version-2.7.3/schema-manage.md  |  2 +-
 .../version-2.7.3/schema-understand.md             |  2 +-
 .../version-2.7.3/security-athenz.md               |  2 +-
 .../version-2.7.3/security-authorization.md        |  6 ++---
 .../version-2.7.3/security-bouncy-castle.md        |  2 +-
 .../version-2.7.3/security-extending.md            |  2 +-
 .../versioned_docs/version-2.7.3/security-jwt.md   |  6 ++---
 .../version-2.7.3/security-kerberos.md             |  2 +-
 .../version-2.7.3/security-overview.md             |  2 +-
 .../version-2.7.3/security-tls-authentication.md   |  8 +++----
 .../version-2.7.3/security-tls-keystore.md         |  6 ++---
 .../version-2.7.3/security-tls-transport.md        | 12 +++++-----
 .../version-2.7.3/security-token-admin.md          |  2 +-
 .../version-2.7.3/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.7.3/sql-overview.md   |  2 +-
 .../version-2.7.3/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.7.3/standalone.md     | 16 ++++++-------
 .../version-2.7.3/tiered-storage-overview.md       |  6 ++---
 .../version-2.7.4/admin-api-brokers.md             |  4 ++--
 .../version-2.7.4/admin-api-clusters.md            |  8 +++----
 .../version-2.7.4/admin-api-functions.md           |  4 ++--
 .../version-2.7.4/admin-api-namespaces.md          |  4 ++--
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.7.4/admin-api-overview.md            |  6 ++---
 .../version-2.7.4/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.7.4/admin-api-persistent-topics.md   |  2 +-
 .../version-2.7.4/admin-api-tenants.md             |  4 ++--
 .../version-2.7.4/admin-api-topics.md              |  6 ++---
 .../version-2.7.4/administration-dashboard.md      |  2 +-
 .../version-2.7.4/administration-geo.md            |  6 ++---
 .../version-2.7.4/administration-zk-bk.md          |  2 +-
 .../version-2.7.4/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.7.4/client-libraries-cpp.md          |  2 +-
 .../version-2.7.4/client-libraries-dotnet.md       |  2 +-
 .../version-2.7.4/client-libraries-go.md           |  8 +++----
 .../version-2.7.4/client-libraries-java.md         | 22 ++++++++---------
 .../version-2.7.4/client-libraries-node.md         |  8 +++----
 .../version-2.7.4/client-libraries-python.md       |  2 +-
 .../version-2.7.4/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.7.4/concepts-authentication.md       |  2 +-
 .../version-2.7.4/concepts-clients.md              |  6 ++---
 .../version-2.7.4/concepts-messaging.md            | 22 ++++++++---------
 .../version-2.7.4/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.7.4/concepts-overview.md             | 10 ++++----
 .../version-2.7.4/concepts-replication.md          |  2 +-
 .../version-2.7.4/concepts-tiered-storage.md       |  2 +-
 .../version-2.7.4/concepts-topic-compaction.md     |  4 ++--
 .../version-2.7.4/cookbooks-compaction.md          |  2 +-
 .../version-2.7.4/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.7.4/cookbooks-partitioned.md         |  2 +-
 .../version-2.7.4/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.7.4/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.7.4/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.7.4/deploy-dcos.md    |  2 +-
 .../versioned_docs/version-2.7.4/deploy-docker.md  |  2 +-
 .../version-2.7.4/deploy-kubernetes.md             |  4 ++--
 .../version-2.7.4/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.7.4/develop-schema.md |  2 +-
 .../version-2.7.4/functions-deploy.md              |  6 ++---
 .../version-2.7.4/functions-develop.md             |  6 ++---
 .../version-2.7.4/functions-overview.md            |  2 +-
 .../version-2.7.4/functions-package.md             |  2 +-
 .../version-2.7.4/functions-worker.md              | 10 ++++----
 .../version-2.7.4/getting-started-docker.md        |  6 ++---
 .../version-2.7.4/getting-started-helm.md          |  6 ++---
 .../version-2.7.4/getting-started-pulsar.md        |  4 ++--
 .../version-2.7.4/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.7.4/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.7.4/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.7.4/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.7.4/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.7.4/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.7.4/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.7.4/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.7.4/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.7.4/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.7.4/io-use.md |  2 +-
 .../version-2.7.4/kubernetes-helm.md               |  6 ++---
 .../version-2.7.4/reference-cli-tools.md           |  2 +-
 .../version-2.7.4/schema-get-started.md            |  2 +-
 .../versioned_docs/version-2.7.4/schema-manage.md  |  2 +-
 .../version-2.7.4/schema-understand.md             |  2 +-
 .../version-2.7.4/security-athenz.md               |  2 +-
 .../version-2.7.4/security-authorization.md        |  6 ++---
 .../version-2.7.4/security-bouncy-castle.md        |  2 +-
 .../version-2.7.4/security-extending.md            |  2 +-
 .../versioned_docs/version-2.7.4/security-jwt.md   |  6 ++---
 .../version-2.7.4/security-kerberos.md             |  2 +-
 .../version-2.7.4/security-overview.md             |  2 +-
 .../version-2.7.4/security-tls-authentication.md   |  8 +++----
 .../version-2.7.4/security-tls-keystore.md         |  6 ++---
 .../version-2.7.4/security-tls-transport.md        | 12 +++++-----
 .../version-2.7.4/security-token-admin.md          |  2 +-
 .../version-2.7.4/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.7.4/sql-overview.md   |  2 +-
 .../version-2.7.4/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.7.4/standalone.md     | 16 ++++++-------
 .../version-2.7.4/tiered-storage-overview.md       |  6 ++---
 .../version-2.7.5/admin-api-brokers.md             |  4 ++--
 .../version-2.7.5/admin-api-clusters.md            |  8 +++----
 .../version-2.7.5/admin-api-functions.md           |  4 ++--
 .../version-2.7.5/admin-api-namespaces.md          |  4 ++--
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../version-2.7.5/admin-api-overview.md            |  6 ++---
 .../version-2.7.5/admin-api-partitioned-topics.md  |  2 +-
 .../version-2.7.5/admin-api-permissions.md         |  2 +-
 .../version-2.7.5/admin-api-persistent-topics.md   |  2 +-
 .../version-2.7.5/admin-api-tenants.md             |  4 ++--
 .../version-2.7.5/admin-api-topics.md              |  6 ++---
 .../version-2.7.5/administration-dashboard.md      |  2 +-
 .../version-2.7.5/administration-geo.md            |  6 ++---
 .../version-2.7.5/administration-zk-bk.md          |  2 +-
 .../version-2.7.5/client-libraries-cgo.md          | 12 +++++-----
 .../version-2.7.5/client-libraries-cpp.md          |  2 +-
 .../version-2.7.5/client-libraries-dotnet.md       |  2 +-
 .../version-2.7.5/client-libraries-go.md           |  8 +++----
 .../version-2.7.5/client-libraries-java.md         | 24 +++++++++----------
 .../version-2.7.5/client-libraries-node.md         |  8 +++----
 .../version-2.7.5/client-libraries-python.md       |  2 +-
 .../version-2.7.5/client-libraries-websocket.md    |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../version-2.7.5/concepts-authentication.md       |  2 +-
 .../version-2.7.5/concepts-clients.md              |  6 ++---
 .../version-2.7.5/concepts-messaging.md            | 22 ++++++++---------
 .../version-2.7.5/concepts-multi-tenancy.md        |  6 ++---
 .../version-2.7.5/concepts-overview.md             | 10 ++++----
 .../version-2.7.5/concepts-replication.md          |  2 +-
 .../version-2.7.5/concepts-tiered-storage.md       |  2 +-
 .../version-2.7.5/concepts-topic-compaction.md     |  4 ++--
 .../version-2.7.5/cookbooks-compaction.md          |  2 +-
 .../version-2.7.5/cookbooks-non-persistent.md      |  4 ++--
 .../version-2.7.5/cookbooks-partitioned.md         |  2 +-
 .../version-2.7.5/cookbooks-retention-expiry.md    |  2 +-
 .../versioned_docs/version-2.7.5/deploy-aws.md     |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.7.5/deploy-bare-metal.md             | 20 ++++++++--------
 .../versioned_docs/version-2.7.5/deploy-dcos.md    |  2 +-
 .../versioned_docs/version-2.7.5/deploy-docker.md  |  2 +-
 .../version-2.7.5/deploy-kubernetes.md             |  4 ++--
 .../version-2.7.5/deploy-monitoring.md             |  4 ++--
 .../versioned_docs/version-2.7.5/develop-schema.md |  2 +-
 .../version-2.7.5/functions-deploy.md              |  6 ++---
 .../version-2.7.5/functions-develop.md             |  6 ++---
 .../version-2.7.5/functions-overview.md            |  2 +-
 .../version-2.7.5/functions-package.md             |  2 +-
 .../version-2.7.5/functions-worker.md              | 10 ++++----
 .../version-2.7.5/getting-started-docker.md        |  6 ++---
 .../version-2.7.5/getting-started-helm.md          |  6 ++---
 .../version-2.7.5/getting-started-pulsar.md        |  4 ++--
 .../version-2.7.5/getting-started-standalone.md    | 16 ++++++-------
 .../versioned_docs/version-2.7.5/helm-install.md   |  6 ++---
 .../versioned_docs/version-2.7.5/helm-overview.md  |  8 +++----
 .../versioned_docs/version-2.7.5/helm-prepare.md   |  2 +-
 .../versioned_docs/version-2.7.5/helm-tools.md     |  2 +-
 .../versioned_docs/version-2.7.5/helm-upgrade.md   |  2 +-
 .../website/versioned_docs/version-2.7.5/io-cdc.md |  4 ++--
 .../versioned_docs/version-2.7.5/io-develop.md     | 10 ++++----
 .../versioned_docs/version-2.7.5/io-overview.md    |  4 ++--
 .../versioned_docs/version-2.7.5/io-quickstart.md  | 28 +++++++++++-----------
 .../website/versioned_docs/version-2.7.5/io-use.md |  2 +-
 .../version-2.7.5/kubernetes-helm.md               |  6 ++---
 .../version-2.7.5/reference-cli-tools.md           |  2 +-
 .../version-2.7.5/schema-get-started.md            |  2 +-
 .../versioned_docs/version-2.7.5/schema-manage.md  |  2 +-
 .../version-2.7.5/schema-understand.md             |  2 +-
 .../version-2.7.5/security-athenz.md               |  2 +-
 .../version-2.7.5/security-authorization.md        |  6 ++---
 .../version-2.7.5/security-bouncy-castle.md        |  2 +-
 .../version-2.7.5/security-extending.md            |  2 +-
 .../versioned_docs/version-2.7.5/security-jwt.md   |  6 ++---
 .../version-2.7.5/security-kerberos.md             |  2 +-
 .../version-2.7.5/security-overview.md             |  2 +-
 .../version-2.7.5/security-tls-authentication.md   |  8 +++----
 .../version-2.7.5/security-tls-keystore.md         |  6 ++---
 .../version-2.7.5/security-tls-transport.md        | 12 +++++-----
 .../version-2.7.5/security-token-admin.md          |  2 +-
 .../version-2.7.5/sql-deployment-configurations.md |  2 +-
 .../versioned_docs/version-2.7.5/sql-overview.md   |  2 +-
 .../version-2.7.5/standalone-docker.md             |  6 ++---
 .../versioned_docs/version-2.7.5/standalone.md     | 16 ++++++-------
 .../version-2.7.5/tiered-storage-overview.md       |  6 ++---
 .../version-2.8.0-deprecated/admin-api-brokers.md  |  4 ++--
 .../version-2.8.0-deprecated/admin-api-clusters.md |  8 +++----
 .../admin-api-functions.md                         |  4 ++--
 .../admin-api-namespaces.md                        |  4 ++--
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../admin-api-partitioned-topics.md                |  2 +-
 .../admin-api-persistent-topics.md                 |  2 +-
 .../version-2.8.0-deprecated/admin-api-tenants.md  |  4 ++--
 .../version-2.8.0-deprecated/admin-api-topics.md   |  6 ++---
 .../administration-dashboard.md                    |  2 +-
 .../version-2.8.0-deprecated/administration-geo.md |  6 ++---
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-cgo.md                        | 12 +++++-----
 .../client-libraries-cpp.md                        |  2 +-
 .../client-libraries-dotnet.md                     |  2 +-
 .../client-libraries-go.md                         |  8 +++----
 .../client-libraries-java.md                       | 22 ++++++++---------
 .../client-libraries-node.md                       |  8 +++----
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.8.0-deprecated/concepts-clients.md   |  6 ++---
 .../version-2.8.0-deprecated/concepts-messaging.md | 22 ++++++++---------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.8.0-deprecated/concepts-overview.md  | 10 ++++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  2 +-
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.8.0-deprecated/deploy-aws.md         |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.8.0-deprecated/deploy-bare-metal.md  | 20 ++++++++--------
 .../version-2.8.0-deprecated/deploy-dcos.md        |  2 +-
 .../version-2.8.0-deprecated/deploy-docker.md      |  2 +-
 .../version-2.8.0-deprecated/deploy-kubernetes.md  |  4 ++--
 .../version-2.8.0-deprecated/deploy-monitoring.md  |  4 ++--
 .../version-2.8.0-deprecated/develop-schema.md     |  2 +-
 .../version-2.8.0-deprecated/functions-deploy.md   |  6 ++---
 .../version-2.8.0-deprecated/functions-develop.md  |  4 ++--
 .../version-2.8.0-deprecated/functions-overview.md |  2 +-
 .../version-2.8.0-deprecated/functions-package.md  |  2 +-
 .../version-2.8.0-deprecated/functions-worker.md   | 10 ++++----
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-helm.md                        |  6 ++---
 .../getting-started-pulsar.md                      |  4 ++--
 .../getting-started-standalone.md                  | 16 ++++++-------
 .../version-2.8.0-deprecated/helm-install.md       |  6 ++---
 .../version-2.8.0-deprecated/helm-overview.md      |  8 +++----
 .../version-2.8.0-deprecated/helm-prepare.md       |  2 +-
 .../version-2.8.0-deprecated/helm-tools.md         |  2 +-
 .../version-2.8.0-deprecated/helm-upgrade.md       |  2 +-
 .../version-2.8.0-deprecated/io-cdc.md             |  4 ++--
 .../version-2.8.0-deprecated/io-develop.md         | 12 +++++-----
 .../version-2.8.0-deprecated/io-overview.md        |  4 ++--
 .../version-2.8.0-deprecated/io-quickstart.md      | 28 +++++++++++-----------
 .../version-2.8.0-deprecated/io-use.md             |  2 +-
 .../version-2.8.0-deprecated/kubernetes-helm.md    |  6 ++---
 .../reference-cli-tools.md                         |  2 +-
 .../reference-configuration.md                     |  2 +-
 .../version-2.8.0-deprecated/schema-get-started.md |  2 +-
 .../version-2.8.0-deprecated/schema-manage.md      |  2 +-
 .../version-2.8.0-deprecated/schema-understand.md  |  2 +-
 .../version-2.8.0-deprecated/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  6 ++---
 .../security-bouncy-castle.md                      |  2 +-
 .../version-2.8.0-deprecated/security-extending.md |  2 +-
 .../version-2.8.0-deprecated/security-jwt.md       |  6 ++---
 .../version-2.8.0-deprecated/security-kerberos.md  |  2 +-
 .../version-2.8.0-deprecated/security-overview.md  |  2 +-
 .../security-tls-authentication.md                 |  8 +++----
 .../security-tls-keystore.md                       |  6 ++---
 .../security-tls-transport.md                      | 12 +++++-----
 .../security-token-admin.md                        |  2 +-
 .../sql-deployment-configurations.md               |  2 +-
 .../version-2.8.0-deprecated/sql-overview.md       |  2 +-
 .../version-2.8.0-deprecated/standalone-docker.md  |  6 ++---
 .../version-2.8.0-deprecated/standalone.md         | 16 ++++++-------
 .../tiered-storage-overview.md                     |  6 ++---
 .../version-2.8.1-deprecated/admin-api-brokers.md  |  4 ++--
 .../version-2.8.1-deprecated/admin-api-clusters.md |  8 +++----
 .../admin-api-functions.md                         |  4 ++--
 .../admin-api-namespaces.md                        |  4 ++--
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../admin-api-partitioned-topics.md                |  2 +-
 .../admin-api-persistent-topics.md                 |  2 +-
 .../version-2.8.1-deprecated/admin-api-tenants.md  |  4 ++--
 .../version-2.8.1-deprecated/admin-api-topics.md   |  6 ++---
 .../administration-dashboard.md                    |  2 +-
 .../version-2.8.1-deprecated/administration-geo.md |  6 ++---
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-cgo.md                        | 12 +++++-----
 .../client-libraries-cpp.md                        |  2 +-
 .../client-libraries-dotnet.md                     |  2 +-
 .../client-libraries-go.md                         |  8 +++----
 .../client-libraries-java.md                       | 22 ++++++++---------
 .../client-libraries-node.md                       |  8 +++----
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.8.1-deprecated/concepts-clients.md   |  6 ++---
 .../version-2.8.1-deprecated/concepts-messaging.md | 22 ++++++++---------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.8.1-deprecated/concepts-overview.md  | 10 ++++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  2 +-
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.8.1-deprecated/deploy-aws.md         |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.8.1-deprecated/deploy-bare-metal.md  | 20 ++++++++--------
 .../version-2.8.1-deprecated/deploy-dcos.md        |  2 +-
 .../version-2.8.1-deprecated/deploy-docker.md      |  2 +-
 .../version-2.8.1-deprecated/deploy-kubernetes.md  |  4 ++--
 .../version-2.8.1-deprecated/deploy-monitoring.md  |  4 ++--
 .../version-2.8.1-deprecated/develop-schema.md     |  2 +-
 .../version-2.8.1-deprecated/functions-deploy.md   |  8 +++----
 .../version-2.8.1-deprecated/functions-develop.md  |  4 ++--
 .../version-2.8.1-deprecated/functions-overview.md |  2 +-
 .../version-2.8.1-deprecated/functions-package.md  |  2 +-
 .../version-2.8.1-deprecated/functions-worker.md   | 10 ++++----
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-helm.md                        |  6 ++---
 .../getting-started-pulsar.md                      |  4 ++--
 .../getting-started-standalone.md                  | 16 ++++++-------
 .../version-2.8.1-deprecated/helm-install.md       |  6 ++---
 .../version-2.8.1-deprecated/helm-overview.md      |  8 +++----
 .../version-2.8.1-deprecated/helm-prepare.md       |  2 +-
 .../version-2.8.1-deprecated/helm-tools.md         |  2 +-
 .../version-2.8.1-deprecated/helm-upgrade.md       |  2 +-
 .../version-2.8.1-deprecated/io-cdc.md             |  4 ++--
 .../version-2.8.1-deprecated/io-develop.md         | 12 +++++-----
 .../version-2.8.1-deprecated/io-overview.md        |  4 ++--
 .../version-2.8.1-deprecated/io-quickstart.md      | 28 +++++++++++-----------
 .../version-2.8.1-deprecated/io-use.md             |  2 +-
 .../version-2.8.1-deprecated/kubernetes-helm.md    |  6 ++---
 .../reference-cli-tools.md                         |  2 +-
 .../reference-configuration.md                     |  2 +-
 .../version-2.8.1-deprecated/schema-get-started.md |  2 +-
 .../version-2.8.1-deprecated/schema-manage.md      |  2 +-
 .../version-2.8.1-deprecated/schema-understand.md  |  2 +-
 .../version-2.8.1-deprecated/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  8 +++----
 .../security-bouncy-castle.md                      |  2 +-
 .../version-2.8.1-deprecated/security-extending.md |  2 +-
 .../version-2.8.1-deprecated/security-jwt.md       |  6 ++---
 .../version-2.8.1-deprecated/security-kerberos.md  |  2 +-
 .../version-2.8.1-deprecated/security-overview.md  |  2 +-
 .../security-tls-authentication.md                 |  8 +++----
 .../security-tls-keystore.md                       |  6 ++---
 .../security-tls-transport.md                      | 12 +++++-----
 .../security-token-admin.md                        |  2 +-
 .../sql-deployment-configurations.md               |  2 +-
 .../version-2.8.1-deprecated/sql-overview.md       |  2 +-
 .../version-2.8.1-deprecated/standalone-docker.md  |  6 ++---
 .../version-2.8.1-deprecated/standalone.md         | 16 ++++++-------
 .../tiered-storage-overview.md                     |  6 ++---
 .../version-2.8.2-deprecated/admin-api-brokers.md  |  4 ++--
 .../version-2.8.2-deprecated/admin-api-clusters.md |  8 +++----
 .../admin-api-functions.md                         |  4 ++--
 .../admin-api-namespaces.md                        |  4 ++--
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../admin-api-partitioned-topics.md                |  2 +-
 .../admin-api-persistent-topics.md                 |  2 +-
 .../version-2.8.2-deprecated/admin-api-tenants.md  |  4 ++--
 .../version-2.8.2-deprecated/admin-api-topics.md   |  6 ++---
 .../administration-dashboard.md                    |  2 +-
 .../version-2.8.2-deprecated/administration-geo.md |  6 ++---
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-cgo.md                        | 12 +++++-----
 .../client-libraries-cpp.md                        |  2 +-
 .../client-libraries-dotnet.md                     |  2 +-
 .../client-libraries-go.md                         |  8 +++----
 .../client-libraries-java.md                       | 22 ++++++++---------
 .../client-libraries-node.md                       |  8 +++----
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.8.2-deprecated/concepts-clients.md   |  6 ++---
 .../version-2.8.2-deprecated/concepts-messaging.md | 22 ++++++++---------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.8.2-deprecated/concepts-overview.md  | 10 ++++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  2 +-
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.8.2-deprecated/deploy-aws.md         |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.8.2-deprecated/deploy-bare-metal.md  | 20 ++++++++--------
 .../version-2.8.2-deprecated/deploy-dcos.md        |  2 +-
 .../version-2.8.2-deprecated/deploy-docker.md      |  2 +-
 .../version-2.8.2-deprecated/deploy-kubernetes.md  |  4 ++--
 .../version-2.8.2-deprecated/deploy-monitoring.md  |  4 ++--
 .../version-2.8.2-deprecated/develop-schema.md     |  2 +-
 .../version-2.8.2-deprecated/functions-deploy.md   |  8 +++----
 .../version-2.8.2-deprecated/functions-develop.md  |  4 ++--
 .../version-2.8.2-deprecated/functions-overview.md |  2 +-
 .../version-2.8.2-deprecated/functions-package.md  |  2 +-
 .../version-2.8.2-deprecated/functions-worker.md   | 10 ++++----
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-helm.md                        |  6 ++---
 .../getting-started-pulsar.md                      |  4 ++--
 .../getting-started-standalone.md                  | 16 ++++++-------
 .../version-2.8.2-deprecated/helm-install.md       |  6 ++---
 .../version-2.8.2-deprecated/helm-overview.md      |  8 +++----
 .../version-2.8.2-deprecated/helm-prepare.md       |  2 +-
 .../version-2.8.2-deprecated/helm-tools.md         |  2 +-
 .../version-2.8.2-deprecated/helm-upgrade.md       |  2 +-
 .../version-2.8.2-deprecated/io-cdc.md             |  4 ++--
 .../version-2.8.2-deprecated/io-develop.md         | 12 +++++-----
 .../version-2.8.2-deprecated/io-overview.md        |  4 ++--
 .../version-2.8.2-deprecated/io-quickstart.md      | 28 +++++++++++-----------
 .../version-2.8.2-deprecated/io-use.md             |  2 +-
 .../version-2.8.2-deprecated/kubernetes-helm.md    |  6 ++---
 .../reference-cli-tools.md                         |  2 +-
 .../reference-configuration.md                     |  2 +-
 .../version-2.8.2-deprecated/schema-get-started.md |  2 +-
 .../version-2.8.2-deprecated/schema-manage.md      |  2 +-
 .../version-2.8.2-deprecated/schema-understand.md  |  2 +-
 .../version-2.8.2-deprecated/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  8 +++----
 .../security-bouncy-castle.md                      |  2 +-
 .../version-2.8.2-deprecated/security-extending.md |  2 +-
 .../version-2.8.2-deprecated/security-jwt.md       |  6 ++---
 .../version-2.8.2-deprecated/security-kerberos.md  |  2 +-
 .../version-2.8.2-deprecated/security-overview.md  |  2 +-
 .../security-tls-authentication.md                 |  8 +++----
 .../security-tls-keystore.md                       |  6 ++---
 .../security-tls-transport.md                      | 12 +++++-----
 .../security-token-admin.md                        |  2 +-
 .../sql-deployment-configurations.md               |  2 +-
 .../version-2.8.2-deprecated/sql-overview.md       |  2 +-
 .../version-2.8.2-deprecated/standalone-docker.md  |  6 ++---
 .../version-2.8.2-deprecated/standalone.md         | 16 ++++++-------
 .../tiered-storage-overview.md                     |  6 ++---
 .../version-2.8.3-deprecated/admin-api-brokers.md  |  4 ++--
 .../version-2.8.3-deprecated/admin-api-clusters.md |  8 +++----
 .../admin-api-functions.md                         |  4 ++--
 .../admin-api-namespaces.md                        |  4 ++--
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../admin-api-partitioned-topics.md                |  2 +-
 .../admin-api-persistent-topics.md                 |  2 +-
 .../version-2.8.3-deprecated/admin-api-tenants.md  |  4 ++--
 .../version-2.8.3-deprecated/admin-api-topics.md   |  6 ++---
 .../administration-dashboard.md                    |  2 +-
 .../version-2.8.3-deprecated/administration-geo.md |  6 ++---
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-cgo.md                        | 12 +++++-----
 .../client-libraries-cpp.md                        |  2 +-
 .../client-libraries-dotnet.md                     |  2 +-
 .../client-libraries-go.md                         |  8 +++----
 .../client-libraries-java.md                       | 22 ++++++++---------
 .../client-libraries-node.md                       |  8 +++----
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.8.3-deprecated/concepts-clients.md   |  6 ++---
 .../version-2.8.3-deprecated/concepts-messaging.md | 22 ++++++++---------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.8.3-deprecated/concepts-overview.md  | 10 ++++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  2 +-
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.8.3-deprecated/deploy-aws.md         |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 28 +++++++++++-----------
 .../version-2.8.3-deprecated/deploy-bare-metal.md  | 20 ++++++++--------
 .../version-2.8.3-deprecated/deploy-dcos.md        |  2 +-
 .../version-2.8.3-deprecated/deploy-docker.md      |  2 +-
 .../version-2.8.3-deprecated/deploy-kubernetes.md  |  4 ++--
 .../version-2.8.3-deprecated/deploy-monitoring.md  |  4 ++--
 .../version-2.8.3-deprecated/develop-schema.md     |  2 +-
 .../version-2.8.3-deprecated/functions-deploy.md   |  8 +++----
 .../version-2.8.3-deprecated/functions-develop.md  |  4 ++--
 .../version-2.8.3-deprecated/functions-overview.md |  2 +-
 .../version-2.8.3-deprecated/functions-package.md  |  2 +-
 .../version-2.8.3-deprecated/functions-worker.md   | 10 ++++----
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-helm.md                        |  6 ++---
 .../getting-started-pulsar.md                      |  4 ++--
 .../getting-started-standalone.md                  | 16 ++++++-------
 .../version-2.8.3-deprecated/helm-install.md       |  6 ++---
 .../version-2.8.3-deprecated/helm-overview.md      |  8 +++----
 .../version-2.8.3-deprecated/helm-prepare.md       |  2 +-
 .../version-2.8.3-deprecated/helm-tools.md         |  2 +-
 .../version-2.8.3-deprecated/helm-upgrade.md       |  2 +-
 .../version-2.8.3-deprecated/io-cdc.md             |  4 ++--
 .../version-2.8.3-deprecated/io-develop.md         | 12 +++++-----
 .../version-2.8.3-deprecated/io-overview.md        |  4 ++--
 .../version-2.8.3-deprecated/io-quickstart.md      | 28 +++++++++++-----------
 .../version-2.8.3-deprecated/io-use.md             |  2 +-
 .../reference-cli-tools.md                         |  2 +-
 .../reference-configuration.md                     |  2 +-
 .../version-2.8.3-deprecated/schema-get-started.md |  2 +-
 .../version-2.8.3-deprecated/schema-manage.md      |  2 +-
 .../version-2.8.3-deprecated/schema-understand.md  |  2 +-
 .../version-2.8.3-deprecated/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  6 ++---
 .../security-bouncy-castle.md                      |  2 +-
 .../version-2.8.3-deprecated/security-extending.md |  2 +-
 .../version-2.8.3-deprecated/security-jwt.md       |  6 ++---
 .../version-2.8.3-deprecated/security-kerberos.md  |  2 +-
 .../version-2.8.3-deprecated/security-overview.md  |  2 +-
 .../security-tls-authentication.md                 |  8 +++----
 .../security-tls-keystore.md                       |  6 ++---
 .../security-tls-transport.md                      | 12 +++++-----
 .../security-token-admin.md                        |  2 +-
 .../sql-deployment-configurations.md               |  2 +-
 .../version-2.8.3-deprecated/sql-overview.md       |  2 +-
 .../version-2.8.3-deprecated/standalone.md         | 16 ++++++-------
 .../tiered-storage-overview.md                     |  6 ++---
 .../version-2.9.0-deprecated/admin-api-brokers.md  |  2 +-
 .../version-2.9.0-deprecated/admin-api-clusters.md |  6 ++---
 .../admin-api-functions.md                         |  2 +-
 .../admin-api-namespaces.md                        |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../admin-api-partitioned-topics.md                |  2 +-
 .../admin-api-persistent-topics.md                 |  2 +-
 .../version-2.9.0-deprecated/admin-api-tenants.md  |  4 ++--
 .../version-2.9.0-deprecated/admin-api-topics.md   |  4 ++--
 .../administration-dashboard.md                    |  2 +-
 .../version-2.9.0-deprecated/administration-geo.md |  6 ++---
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-cgo.md                        | 12 +++++-----
 .../client-libraries-cpp.md                        |  2 +-
 .../client-libraries-dotnet.md                     |  2 +-
 .../client-libraries-go.md                         |  8 +++----
 .../client-libraries-java.md                       | 22 ++++++++---------
 .../client-libraries-node.md                       |  8 +++----
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.9.0-deprecated/concepts-clients.md   |  6 ++---
 .../version-2.9.0-deprecated/concepts-messaging.md | 20 ++++++++--------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.9.0-deprecated/concepts-overview.md  | 10 ++++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  2 +-
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.9.0-deprecated/deploy-aws.md         |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.9.0-deprecated/deploy-bare-metal.md  | 16 ++++++-------
 .../version-2.9.0-deprecated/deploy-dcos.md        |  2 +-
 .../version-2.9.0-deprecated/deploy-docker.md      |  2 +-
 .../version-2.9.0-deprecated/deploy-kubernetes.md  |  4 ++--
 .../version-2.9.0-deprecated/deploy-monitoring.md  |  4 ++--
 .../version-2.9.0-deprecated/develop-schema.md     |  2 +-
 .../version-2.9.0-deprecated/functions-deploy.md   |  8 +++----
 .../version-2.9.0-deprecated/functions-develop.md  |  4 ++--
 .../version-2.9.0-deprecated/functions-overview.md |  2 +-
 .../version-2.9.0-deprecated/functions-package.md  |  2 +-
 .../version-2.9.0-deprecated/functions-worker.md   | 10 ++++----
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-helm.md                        |  6 ++---
 .../getting-started-pulsar.md                      |  4 ++--
 .../getting-started-standalone.md                  | 16 ++++++-------
 .../version-2.9.0-deprecated/helm-install.md       |  6 ++---
 .../version-2.9.0-deprecated/helm-overview.md      |  8 +++----
 .../version-2.9.0-deprecated/helm-tools.md         |  2 +-
 .../version-2.9.0-deprecated/helm-upgrade.md       |  2 +-
 .../version-2.9.0-deprecated/io-cdc.md             |  4 ++--
 .../version-2.9.0-deprecated/io-develop.md         | 12 +++++-----
 .../version-2.9.0-deprecated/io-overview.md        |  4 ++--
 .../version-2.9.0-deprecated/io-quickstart.md      | 28 +++++++++++-----------
 .../version-2.9.0-deprecated/io-use.md             |  2 +-
 .../version-2.9.0-deprecated/kubernetes-helm.md    |  6 ++---
 .../reference-cli-tools.md                         |  2 +-
 .../reference-configuration.md                     |  2 +-
 .../version-2.9.0-deprecated/schema-get-started.md |  2 +-
 .../version-2.9.0-deprecated/schema-manage.md      |  2 +-
 .../version-2.9.0-deprecated/schema-understand.md  |  2 +-
 .../version-2.9.0-deprecated/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  8 +++----
 .../security-bouncy-castle.md                      |  2 +-
 .../version-2.9.0-deprecated/security-extending.md |  2 +-
 .../version-2.9.0-deprecated/security-jwt.md       |  6 ++---
 .../version-2.9.0-deprecated/security-kerberos.md  |  2 +-
 .../version-2.9.0-deprecated/security-overview.md  |  2 +-
 .../security-tls-authentication.md                 |  8 +++----
 .../security-tls-keystore.md                       |  6 ++---
 .../security-tls-transport.md                      | 12 +++++-----
 .../security-token-admin.md                        |  2 +-
 .../sql-deployment-configurations.md               |  2 +-
 .../version-2.9.0-deprecated/sql-overview.md       |  2 +-
 .../version-2.9.0-deprecated/standalone-docker.md  |  6 ++---
 .../version-2.9.0-deprecated/standalone.md         | 16 ++++++-------
 .../tiered-storage-overview.md                     |  6 ++---
 .../version-2.9.1-deprecated/admin-api-brokers.md  |  2 +-
 .../version-2.9.1-deprecated/admin-api-clusters.md |  6 ++---
 .../admin-api-functions.md                         |  2 +-
 .../admin-api-namespaces.md                        |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../admin-api-partitioned-topics.md                |  2 +-
 .../admin-api-persistent-topics.md                 |  2 +-
 .../version-2.9.1-deprecated/admin-api-tenants.md  |  4 ++--
 .../version-2.9.1-deprecated/admin-api-topics.md   |  4 ++--
 .../administration-dashboard.md                    |  2 +-
 .../version-2.9.1-deprecated/administration-geo.md |  4 ++--
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-cgo.md                        | 12 +++++-----
 .../client-libraries-cpp.md                        |  2 +-
 .../client-libraries-dotnet.md                     |  2 +-
 .../client-libraries-go.md                         |  8 +++----
 .../client-libraries-java.md                       | 22 ++++++++---------
 .../client-libraries-node.md                       |  8 +++----
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.9.1-deprecated/concepts-clients.md   |  6 ++---
 .../version-2.9.1-deprecated/concepts-messaging.md | 20 ++++++++--------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.9.1-deprecated/concepts-overview.md  | 10 ++++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  2 +-
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.9.1-deprecated/deploy-aws.md         |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.9.1-deprecated/deploy-bare-metal.md  | 16 ++++++-------
 .../version-2.9.1-deprecated/deploy-dcos.md        |  2 +-
 .../version-2.9.1-deprecated/deploy-docker.md      |  2 +-
 .../version-2.9.1-deprecated/deploy-kubernetes.md  |  4 ++--
 .../version-2.9.1-deprecated/deploy-monitoring.md  |  4 ++--
 .../version-2.9.1-deprecated/develop-schema.md     |  2 +-
 .../version-2.9.1-deprecated/functions-deploy.md   |  8 +++----
 .../version-2.9.1-deprecated/functions-develop.md  |  4 ++--
 .../version-2.9.1-deprecated/functions-overview.md |  2 +-
 .../version-2.9.1-deprecated/functions-package.md  |  2 +-
 .../version-2.9.1-deprecated/functions-worker.md   | 10 ++++----
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-helm.md                        |  6 ++---
 .../getting-started-pulsar.md                      |  4 ++--
 .../getting-started-standalone.md                  | 16 ++++++-------
 .../version-2.9.1-deprecated/helm-install.md       |  6 ++---
 .../version-2.9.1-deprecated/helm-overview.md      |  8 +++----
 .../version-2.9.1-deprecated/helm-tools.md         |  2 +-
 .../version-2.9.1-deprecated/helm-upgrade.md       |  2 +-
 .../version-2.9.1-deprecated/io-cdc.md             |  4 ++--
 .../version-2.9.1-deprecated/io-develop.md         | 12 +++++-----
 .../version-2.9.1-deprecated/io-overview.md        |  4 ++--
 .../version-2.9.1-deprecated/io-quickstart.md      | 28 +++++++++++-----------
 .../version-2.9.1-deprecated/io-use.md             |  2 +-
 .../version-2.9.1-deprecated/kubernetes-helm.md    |  6 ++---
 .../reference-cli-tools.md                         |  2 +-
 .../reference-configuration.md                     |  2 +-
 .../version-2.9.1-deprecated/schema-get-started.md |  2 +-
 .../version-2.9.1-deprecated/schema-manage.md      |  2 +-
 .../version-2.9.1-deprecated/schema-understand.md  |  2 +-
 .../version-2.9.1-deprecated/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  8 +++----
 .../security-bouncy-castle.md                      |  2 +-
 .../version-2.9.1-deprecated/security-extending.md |  2 +-
 .../version-2.9.1-deprecated/security-jwt.md       |  6 ++---
 .../version-2.9.1-deprecated/security-kerberos.md  |  2 +-
 .../version-2.9.1-deprecated/security-overview.md  |  2 +-
 .../security-tls-authentication.md                 |  8 +++----
 .../security-tls-keystore.md                       |  6 ++---
 .../security-tls-transport.md                      | 12 +++++-----
 .../security-token-admin.md                        |  2 +-
 .../sql-deployment-configurations.md               |  2 +-
 .../version-2.9.1-deprecated/sql-overview.md       |  2 +-
 .../version-2.9.1-deprecated/standalone-docker.md  |  6 ++---
 .../version-2.9.1-deprecated/standalone.md         | 16 ++++++-------
 .../tiered-storage-overview.md                     |  6 ++---
 .../version-2.9.2-deprecated/admin-api-brokers.md  |  2 +-
 .../version-2.9.2-deprecated/admin-api-clusters.md |  6 ++---
 .../admin-api-functions.md                         |  2 +-
 .../admin-api-namespaces.md                        |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../admin-api-partitioned-topics.md                |  2 +-
 .../admin-api-persistent-topics.md                 |  2 +-
 .../version-2.9.2-deprecated/admin-api-tenants.md  |  4 ++--
 .../version-2.9.2-deprecated/admin-api-topics.md   |  4 ++--
 .../administration-dashboard.md                    |  2 +-
 .../version-2.9.2-deprecated/administration-geo.md |  4 ++--
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-cgo.md                        | 12 +++++-----
 .../client-libraries-cpp.md                        |  2 +-
 .../client-libraries-dotnet.md                     |  2 +-
 .../client-libraries-go.md                         |  8 +++----
 .../client-libraries-java.md                       | 22 ++++++++---------
 .../client-libraries-node.md                       |  8 +++----
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.9.2-deprecated/concepts-clients.md   |  6 ++---
 .../version-2.9.2-deprecated/concepts-messaging.md | 20 ++++++++--------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.9.2-deprecated/concepts-overview.md  | 10 ++++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  2 +-
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.9.2-deprecated/deploy-aws.md         |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.9.2-deprecated/deploy-bare-metal.md  | 16 ++++++-------
 .../version-2.9.2-deprecated/deploy-dcos.md        |  2 +-
 .../version-2.9.2-deprecated/deploy-docker.md      |  2 +-
 .../version-2.9.2-deprecated/deploy-kubernetes.md  |  4 ++--
 .../version-2.9.2-deprecated/deploy-monitoring.md  |  4 ++--
 .../version-2.9.2-deprecated/develop-schema.md     |  2 +-
 .../version-2.9.2-deprecated/functions-deploy.md   |  8 +++----
 .../version-2.9.2-deprecated/functions-develop.md  |  4 ++--
 .../version-2.9.2-deprecated/functions-overview.md |  2 +-
 .../version-2.9.2-deprecated/functions-package.md  |  2 +-
 .../version-2.9.2-deprecated/functions-worker.md   | 10 ++++----
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-helm.md                        |  6 ++---
 .../getting-started-pulsar.md                      |  4 ++--
 .../getting-started-standalone.md                  | 16 ++++++-------
 .../version-2.9.2-deprecated/helm-install.md       |  6 ++---
 .../version-2.9.2-deprecated/helm-overview.md      |  8 +++----
 .../version-2.9.2-deprecated/helm-tools.md         |  2 +-
 .../version-2.9.2-deprecated/helm-upgrade.md       |  2 +-
 .../version-2.9.2-deprecated/io-cdc.md             |  4 ++--
 .../version-2.9.2-deprecated/io-develop.md         | 12 +++++-----
 .../version-2.9.2-deprecated/io-overview.md        |  4 ++--
 .../version-2.9.2-deprecated/io-quickstart.md      | 28 +++++++++++-----------
 .../version-2.9.2-deprecated/io-use.md             |  2 +-
 .../reference-cli-tools.md                         |  2 +-
 .../reference-configuration.md                     |  2 +-
 .../version-2.9.2-deprecated/schema-get-started.md |  2 +-
 .../version-2.9.2-deprecated/schema-manage.md      |  2 +-
 .../version-2.9.2-deprecated/schema-understand.md  |  2 +-
 .../version-2.9.2-deprecated/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  8 +++----
 .../security-bouncy-castle.md                      |  2 +-
 .../version-2.9.2-deprecated/security-extending.md |  2 +-
 .../version-2.9.2-deprecated/security-jwt.md       |  6 ++---
 .../version-2.9.2-deprecated/security-kerberos.md  |  2 +-
 .../version-2.9.2-deprecated/security-overview.md  |  2 +-
 .../security-tls-authentication.md                 |  8 +++----
 .../security-tls-keystore.md                       |  6 ++---
 .../security-tls-transport.md                      | 12 +++++-----
 .../security-token-admin.md                        |  2 +-
 .../sql-deployment-configurations.md               |  2 +-
 .../version-2.9.2-deprecated/sql-overview.md       |  2 +-
 .../version-2.9.2-deprecated/standalone.md         | 16 ++++++-------
 .../tiered-storage-overview.md                     |  6 ++---
 .../version-2.9.3-deprecated/admin-api-brokers.md  |  2 +-
 .../version-2.9.3-deprecated/admin-api-clusters.md |  6 ++---
 .../admin-api-functions.md                         |  2 +-
 .../admin-api-namespaces.md                        |  2 +-
 .../admin-api-non-partitioned-topics.md            |  2 +-
 .../admin-api-non-persistent-topics.md             |  2 +-
 .../admin-api-partitioned-topics.md                |  2 +-
 .../admin-api-persistent-topics.md                 |  2 +-
 .../version-2.9.3-deprecated/admin-api-tenants.md  |  4 ++--
 .../version-2.9.3-deprecated/admin-api-topics.md   |  4 ++--
 .../administration-dashboard.md                    |  2 +-
 .../version-2.9.3-deprecated/administration-geo.md |  4 ++--
 .../administration-zk-bk.md                        |  2 +-
 .../client-libraries-cgo.md                        | 12 +++++-----
 .../client-libraries-cpp.md                        |  2 +-
 .../client-libraries-dotnet.md                     |  2 +-
 .../client-libraries-go.md                         |  8 +++----
 .../client-libraries-java.md                       | 24 +++++++++----------
 .../client-libraries-node.md                       |  8 +++----
 .../client-libraries-python.md                     |  2 +-
 .../client-libraries-websocket.md                  |  4 ++--
 .../concepts-architecture-overview.md              | 22 ++++++++---------
 .../concepts-authentication.md                     |  2 +-
 .../version-2.9.3-deprecated/concepts-clients.md   |  6 ++---
 .../version-2.9.3-deprecated/concepts-messaging.md | 20 ++++++++--------
 .../concepts-multi-tenancy.md                      |  6 ++---
 .../version-2.9.3-deprecated/concepts-overview.md  | 10 ++++----
 .../concepts-replication.md                        |  2 +-
 .../concepts-tiered-storage.md                     |  2 +-
 .../concepts-topic-compaction.md                   |  4 ++--
 .../cookbooks-compaction.md                        |  2 +-
 .../cookbooks-non-persistent.md                    |  4 ++--
 .../cookbooks-partitioned.md                       |  2 +-
 .../cookbooks-retention-expiry.md                  |  2 +-
 .../version-2.9.3-deprecated/deploy-aws.md         |  4 ++--
 .../deploy-bare-metal-multi-cluster.md             | 22 ++++++++---------
 .../version-2.9.3-deprecated/deploy-bare-metal.md  | 16 ++++++-------
 .../version-2.9.3-deprecated/deploy-dcos.md        |  2 +-
 .../version-2.9.3-deprecated/deploy-docker.md      |  2 +-
 .../version-2.9.3-deprecated/deploy-kubernetes.md  |  4 ++--
 .../version-2.9.3-deprecated/deploy-monitoring.md  |  4 ++--
 .../version-2.9.3-deprecated/develop-schema.md     |  2 +-
 .../version-2.9.3-deprecated/functions-deploy.md   |  8 +++----
 .../version-2.9.3-deprecated/functions-develop.md  |  4 ++--
 .../version-2.9.3-deprecated/functions-overview.md |  2 +-
 .../version-2.9.3-deprecated/functions-package.md  |  2 +-
 .../version-2.9.3-deprecated/functions-worker.md   | 10 ++++----
 .../getting-started-docker.md                      |  6 ++---
 .../getting-started-helm.md                        |  6 ++---
 .../getting-started-pulsar.md                      |  4 ++--
 .../getting-started-standalone.md                  | 16 ++++++-------
 .../version-2.9.3-deprecated/helm-install.md       |  6 ++---
 .../version-2.9.3-deprecated/helm-overview.md      |  8 +++----
 .../version-2.9.3-deprecated/helm-tools.md         |  2 +-
 .../version-2.9.3-deprecated/helm-upgrade.md       |  2 +-
 .../version-2.9.3-deprecated/io-cdc.md             |  4 ++--
 .../version-2.9.3-deprecated/io-develop.md         | 12 +++++-----
 .../version-2.9.3-deprecated/io-overview.md        |  4 ++--
 .../version-2.9.3-deprecated/io-quickstart.md      | 28 +++++++++++-----------
 .../version-2.9.3-deprecated/io-use.md             |  2 +-
 .../reference-cli-tools.md                         |  2 +-
 .../reference-configuration.md                     |  2 +-
 .../version-2.9.3-deprecated/schema-get-started.md |  2 +-
 .../version-2.9.3-deprecated/schema-manage.md      |  2 +-
 .../version-2.9.3-deprecated/schema-understand.md  |  2 +-
 .../version-2.9.3-deprecated/security-athenz.md    |  2 +-
 .../security-authorization.md                      |  8 +++----
 .../security-bouncy-castle.md                      |  2 +-
 .../version-2.9.3-deprecated/security-extending.md |  2 +-
 .../version-2.9.3-deprecated/security-jwt.md       |  6 ++---
 .../version-2.9.3-deprecated/security-kerberos.md  |  2 +-
 .../version-2.9.3-deprecated/security-overview.md  |  2 +-
 .../security-tls-authentication.md                 |  8 +++----
 .../security-tls-keystore.md                       |  6 ++---
 .../security-tls-transport.md                      | 12 +++++-----
 .../security-token-admin.md                        |  2 +-
 .../sql-deployment-configurations.md               |  2 +-
 .../version-2.9.3-deprecated/sql-overview.md       |  2 +-
 .../version-2.9.3-deprecated/standalone.md         | 16 ++++++-------
 .../tiered-storage-overview.md                     |  6 ++---
 2325 files changed, 6905 insertions(+), 6905 deletions(-)

diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-brokers.md b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-brokers.md
index fb353957e0e..57454d9d572 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-brokers.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-brokers.md
@@ -12,7 +12,7 @@ Pulsar brokers consist of two components:
 
 [Brokers](reference-terminology.md#broker) can be managed via:
 
-* The [`brokers`](reference-pulsar-admin.md#brokers) command of the [`pulsar-admin`](reference-pulsar-admin) tool
+* The [`brokers`](reference-pulsar-admin.md#brokers) command of the [`pulsar-admin`](reference-pulsar-admin.md) tool
 * The `/admin/v2/brokers` endpoint of the admin {@inject: rest:REST:/} API
 * The `brokers` method of the {@inject: javadoc:PulsarAdmin:/admin/org/apache/pulsar/client/admin/PulsarAdmin.html} object in the [Java API](client-libraries-java.md)
 
@@ -95,7 +95,7 @@ One way to configure a Pulsar [broker](reference-terminology.md#broker) is to su
 
 But since all broker configuration in Pulsar is stored in ZooKeeper, configuration values can also be dynamically updated *while the broker is running*. When you update broker configuration dynamically, ZooKeeper will notify the broker of the change and the broker will then override any existing configuration values.
 
-* The [`brokers`](reference-pulsar-admin.md#brokers) command for the [`pulsar-admin`](reference-pulsar-admin) tool has a variety of subcommands that enable you to manipulate a broker's configuration dynamically, enabling you to [update config values](#update-dynamic-configuration) and more.
+* The [`brokers`](reference-pulsar-admin.md#brokers) command for the [`pulsar-admin`](reference-pulsar-admin.md) tool has a variety of subcommands that enable you to manipulate a broker's configuration dynamically, enabling you to [update config values](#update-dynamic-configuration) and more.
 * In the Pulsar admin {@inject: rest:REST:/} API, dynamic configuration is managed through the `/admin/v2/brokers/configuration` endpoint.
 
 ### Update dynamic configuration
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-clusters.md b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-clusters.md
index c51046cd906..7b3635de58f 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-clusters.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-clusters.md
@@ -10,7 +10,7 @@ servers (aka [bookies](reference-terminology.md#bookie)), and a [ZooKeeper](http
 
 Clusters can be managed via:
 
-* The [`clusters`](reference-pulsar-admin.md#clusters) command of the [`pulsar-admin`](reference-pulsar-admin) tool
+* The [`clusters`](reference-pulsar-admin.md#clusters) command of the [`pulsar-admin`](reference-pulsar-admin.md) tool
 * The `/admin/v2/clusters` endpoint of the admin {@inject: rest:REST:/} API
 * The `clusters` method of the {@inject: javadoc:PulsarAdmin:/admin/org/apache/pulsar/client/admin/PulsarAdmin} object in the [Java API](client-libraries-java.md)
 
@@ -62,7 +62,7 @@ When provision a new cluster, you need to initialize that cluster's [metadata](c
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers) that will belong to the cluster.
+You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers.md) that will belong to the cluster.
 
 > #### No cluster metadata initialization through the REST API or the Java admin API
 >
@@ -86,11 +86,11 @@ bin/pulsar initialize-cluster-metadata \
 
 ```
 
-You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication) in your instance.
+You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication.md) in your instance.
 
 ### Get configuration
 
-You can fetch the [configuration](reference-configuration) for an existing cluster at any time.
+You can fetch the [configuration](reference-configuration.md) for an existing cluster at any time.
 
 #### pulsar-admin
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-namespaces.md b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-namespaces.md
index f07cec7efcc..33a278de8de 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-namespaces.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-namespaces.md
@@ -9,7 +9,7 @@ Pulsar [namespaces](reference-terminology.md#namespace) are logical groupings of
 
 Namespaces can be managed via:
 
-* The [`namespaces`](reference-pulsar-admin.md#clusters) command of the [`pulsar-admin`](reference-pulsar-admin) tool
+* The [`namespaces`](reference-pulsar-admin.md#clusters) command of the [`pulsar-admin`](reference-pulsar-admin.md) tool
 * The `/admin/v2/namespaces` endpoint of the admin {@inject: rest:REST:/} API
 * The `namespaces` method of the {@inject: javadoc:PulsarAdmin:/admin/org/apache/pulsar/client/admin/PulsarAdmin} object in the [Java API](client-libraries-java.md)
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-overview.md b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-overview.md
index 3d5a05bdaad..182697cc803 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-overview.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-overview.md
@@ -12,7 +12,7 @@ You can currently interact with the admin interface via:
 - Making HTTP calls against the admin {@inject: rest:REST:/} API provided by Pulsar [brokers](reference-terminology.md#broker). For some restful apis, they might be redirected to topic owner brokers for serving
    with [`307 Temporary Redirect`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307), hence the HTTP callers should handle `307 Temporary Redirect`. If you are using `curl`, you should specify `-L`
    to handle redirections.
-- The `pulsar-admin` CLI tool, which is available in the `bin` folder of your [Pulsar installation](getting-started-standalone):
+- The `pulsar-admin` CLI tool, which is available in the `bin` folder of your [Pulsar installation](getting-started-standalone.md):
 
 ```shell
 
@@ -20,7 +20,7 @@ $ bin/pulsar-admin
 
 ```
 
-Full documentation for this tool can be found in the [Pulsar command-line tools](reference-pulsar-admin) doc.
+Full documentation for this tool can be found in the [Pulsar command-line tools](reference-pulsar-admin.md) doc.
 
 - A Java client interface.
 
@@ -31,11 +31,11 @@ In this document, examples from each of the three available interfaces will be s
 
 ## Admin setup
 
-Each of Pulsar's three admin interfaces---the [`pulsar-admin`](reference-pulsar-admin) CLI tool, the [Java admin API](/api/admin), and the {@inject: rest:REST:/} API ---requires some special setup if you have [authentication](security-overview.md#authentication-providers) enabled in your Pulsar [instance](reference-terminology.md#instance).
+Each of Pulsar's three admin interfaces---the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool, the [Java admin API](/api/admin), and the {@inject: rest:REST:/} API ---requires some special setup if you have [authentication](security-overview.md#authentication-providers) enabled in your Pulsar [instance](reference-terminology.md#instance).
 
 ### pulsar-admin
 
-If you have [authentication](security-overview.md#authentication-providers) enabled, you will need to provide an auth configuration to use the [`pulsar-admin`](reference-pulsar-admin) tool. By default, the configuration for the `pulsar-admin` tool is found in the [`conf/client.conf`](reference-configuration.md#client) file. Here are the available parameters:
+If you have [authentication](security-overview.md#authentication-providers) enabled, you will need to provide an auth configuration to use the [`pulsar-admin`](reference-pulsar-admin.md) tool. By default, the configuration for the `pulsar-admin` tool is found in the [`conf/client.conf`](reference-configuration.md#client) file. Here are the available parameters:
 
 |Name|Description|Default|
 |----|-----------|-------|
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-partitioned-topics.md b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-partitioned-topics.md
index 0042b8650f8..4051f494b7a 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-partitioned-topics.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-partitioned-topics.md
@@ -6,7 +6,7 @@ original_id: admin-api-partitioned-topics
 ---
 
 
-You can use Pulsar's [admin API](admin-api-overview) to create and manage partitioned topics.
+You can use Pulsar's [admin API](admin-api-overview.md) to create and manage partitioned topics.
 
 In all of the instructions and commands below, the topic name structure is:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-schemas.md b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-schemas.md
index ed18490dbdf..161f1ee3a34 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-schemas.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-schemas.md
@@ -5,7 +5,7 @@ sidebar_label: "Schemas"
 original_id: admin-api-schemas
 ---
 
-Schemas, like other entities in Pulsar, can be managed using the [admin API](admin-api-overview). 
+Schemas, like other entities in Pulsar, can be managed using the [admin API](admin-api-overview.md). 
 
 ## Schema resources
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-tenants.md b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-tenants.md
index 924cbce3d41..27764d6da38 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-tenants.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/admin-api-tenants.md
@@ -5,7 +5,7 @@ sidebar_label: "Tenants"
 original_id: admin-api-tenants
 ---
 
-Tenants, like namespaces, can be managed using the [admin API](admin-api-overview). There are currently two configurable aspects of tenants:
+Tenants, like namespaces, can be managed using the [admin API](admin-api-overview.md). There are currently two configurable aspects of tenants:
 
 * Admin roles
 * Allowed clusters
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/administration-geo.md b/site2/website/versioned_docs/version-2.1.0-incubating/administration-geo.md
index bd3cbfa518c..2b30491803c 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/administration-geo.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/administration-geo.md
@@ -94,7 +94,7 @@ Once you've created a global namespace, any topics that producers or consumers c
 
 By default, messages are replicated to all clusters configured for the namespace. You can restrict replication selectively by specifying a replication list for a message. That message will then be replicated only to the subset in the replication list.
 
-Below is an example for the [Java API](client-libraries-java). Note the use of the `setReplicationClusters` method when constructing the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
+Below is an example for the [Java API](client-libraries-java.md). Note the use of the `setReplicationClusters` method when constructing the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
 
 ```java
 
@@ -116,7 +116,7 @@ producer.newMessage()
 
 #### Topic stats
 
-Topic-specific statistics for global topics are available via the [`pulsar-admin`](reference-pulsar-admin) tool and {@inject: rest:REST:/} API:
+Topic-specific statistics for global topics are available via the [`pulsar-admin`](reference-pulsar-admin.md) tool and {@inject: rest:REST:/} API:
 
 ```shell
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/administration-proxy.md b/site2/website/versioned_docs/version-2.1.0-incubating/administration-proxy.md
index a60d6b9df20..c3948e979be 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/administration-proxy.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/administration-proxy.md
@@ -9,7 +9,7 @@ The [Pulsar proxy](concepts-architecture-overview.md#pulsar-proxy) is an optiona
 
 ## Running the proxy
 
-In order to run the Pulsar proxy, you need to have both a local [ZooKeeper](https://zookeeper.apache.org) and configuration store quorum set up for use by your Pulsar cluster. For instructions, see [this document](deploy-bare-metal). Once you have ZooKeeper set up and have connection strings for both ZooKeeper quorums, you can use the [`proxy`](reference-cli-tools.md#pulsar-proxy) command of the [`pulsar`](reference-cli-tools.md#pulsar) CLI tool to start up the proxy (preferably on its o [...]
+In order to run the Pulsar proxy, you need to have both a local [ZooKeeper](https://zookeeper.apache.org) and configuration store quorum set up for use by your Pulsar cluster. For instructions, see [this document](deploy-bare-metal.md). Once you have ZooKeeper set up and have connection strings for both ZooKeeper quorums, you can use the [`proxy`](reference-cli-tools.md#pulsar-proxy) command of the [`pulsar`](reference-cli-tools.md#pulsar) CLI tool to start up the proxy (preferably on it [...]
 
 To start the proxy:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/administration-zk-bk.md b/site2/website/versioned_docs/version-2.1.0-incubating/administration-zk-bk.md
index eff0a24f05b..bdc41b5e07d 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/administration-zk-bk.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/administration-zk-bk.md
@@ -182,7 +182,7 @@ Configuration for configuration store is handled by the [`conf/global-zookeeper.
 
 BookKeeper is responsible for all durable message storage in Pulsar. BookKeeper is a distributed [write-ahead log](https://en.wikipedia.org/wiki/Write-ahead_logging) WAL system that guarantees read consistency of independent message logs called ledgers. Individual BookKeeper servers are also called *bookies*.
 
-> For a guide to managing message persistence, retention, and expiry in Pulsar, see [this cookbook](cookbooks-retention-expiry).
+> For a guide to managing message persistence, retention, and expiry in Pulsar, see [this cookbook](cookbooks-retention-expiry.md).
 
 ### Deploying BookKeeper
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-go.md b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-go.md
index 8f3fc7a174c..05082c38bfd 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-go.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-go.md
@@ -16,7 +16,7 @@ The Pulsar Go client can be used to create Pulsar [producers](#producers), [cons
 ### Requirements
 
 Pulsar Go client library is based on the C++ client library. Follow
-the instructions for [C++ library](client-libraries-cpp) for installing the binaries
+the instructions for [C++ library](client-libraries-cpp.md) for installing the binaries
 through [RPM](client-libraries-cpp.md#rpm), [Deb](client-libraries-cpp.md#deb) or [Homebrew packages](client-libraries-cpp.md#macos).
 
 ### Installing go package
@@ -52,7 +52,7 @@ import "github.com/apache/incubator-pulsar/pulsar-client-go/pulsar"
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 Pulsar protocol URLs are assigned to specific clusters, use the `pulsar` scheme and have a default port of 6650. Here's an example for `localhost`:
 
@@ -70,7 +70,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you're using [TLS](security-tls-authentication) authentication, the URL will look like something like this:
+If you're using [TLS](security-tls-authentication.md) authentication, the URL will look like something like this:
 
 ```http
 
@@ -225,14 +225,14 @@ Parameter | Description | Default
 :---------|:------------|:-------
 `Topic` | The Pulsar [topic](reference-terminology.md#topic) to which the producer will publish messages |
 `Name` | A name for the producer. If you don't explicitly assign a name, Pulsar will automatically generate a globally unique name that you can access later using the `Name()` method.  If you choose to explicitly assign a name, it will need to be unique across *all* Pulsar clusters, otherwise the creation operation will throw an error. |
-`SendTimeout` | When publishing a message to a topic, the producer will wait for an acknowledgment from the responsible Pulsar [broker](reference-terminology.md#broker). If a message is not acknowledged within the threshold set by this parameter, an error will be thrown. If you set `SendTimeout` to -1, the timeout will be set to infinity (and thus removed). Removing the send timeout is recommended when using Pulsar's [message de-duplication](cookbooks-deduplication) feature. | 30 seconds
+`SendTimeout` | When publishing a message to a topic, the producer will wait for an acknowledgment from the responsible Pulsar [broker](reference-terminology.md#broker). If a message is not acknowledged within the threshold set by this parameter, an error will be thrown. If you set `SendTimeout` to -1, the timeout will be set to infinity (and thus removed). Removing the send timeout is recommended when using Pulsar's [message de-duplication](cookbooks-deduplication.md) feature. | 30 seconds
 `MaxPendingMessages` | The maximum size of the queue holding pending messages (i.e. messages waiting to receive an acknowledgment from the [broker](reference-terminology.md#broker)). By default, when the queue is full all calls to the `Send` and `SendAsync` methods will fail *unless* `BlockIfQueueFull` is set to `true`. |
 `MaxPendingMessagesAcrossPartitions` | |
 `BlockIfQueueFull` | If set to `true`, the producer's `Send` and `SendAsync` methods will block when the outgoing message queue is full rather than failing and throwing an error (the size of that queue is dictated by the `MaxPendingMessages` parameter); if set to `false` (the default), `Send` and `SendAsync` operations will fail and throw a `ProducerQueueIsFullError` when the queue is full. | `false`
 `MessageRoutingMode` | The message routing logic (for producers on [partitioned topics](concepts-architecture-overview.md#partitioned-topics)). This logic is applied only when no key is set on messages. The available options are: round robin (`pulsar.RoundRobinDistribution`, the default), publishing all messages to a single partition (`pulsar.UseSinglePartition`), or a custom partitioning scheme (`pulsar.CustomPartition`). | `pulsar.RoundRobinDistribution`
 `HashingScheme` | The hashing function that determines the partition on which a particular message is published (partitioned topics only). The available options are: `pulsar.JavaStringHash` (the equivalent of `String.hashCode()` in Java), `pulsar.Murmur3_32Hash` (applies the [Murmur3](https://en.wikipedia.org/wiki/MurmurHash) hashing function), or `pulsar.BoostHash` (applies the hashing function from C++'s [Boost](https://www.boost.org/doc/libs/1_62_0/doc/html/hash.html) library) | `puls [...]
 `CompressionType` | The message data compression type used by the producer. The available options are [`LZ4`](https://github.com/lz4/lz4) and [`ZLIB`](https://zlib.net/). | No compression
-`MessageRouter` | By default, Pulsar uses a round-robin routing scheme for [partitioned topics](cookbooks-partitioned). The `MessageRouter` parameter enables you to specify custom routing logic via a function that takes the Pulsar message and topic metadata as an argument and returns an integer (where the ), i.e. a function signature of `func(Message, TopicMetadata) int`. |
+`MessageRouter` | By default, Pulsar uses a round-robin routing scheme for [partitioned topics](cookbooks-partitioned.md). The `MessageRouter` parameter enables you to specify custom routing logic via a function that takes the Pulsar message and topic metadata as an argument and returns an integer (where the ), i.e. a function signature of `func(Message, TopicMetadata) int`. |
 
 ## Consumers
 
@@ -477,7 +477,7 @@ Parameter | Description
 
 ## TLS encryption and authentication
 
-In order to use [TLS encryption](security-tls-transport), you'll need to configure your client to do so:
+In order to use [TLS encryption](security-tls-transport.md), you'll need to configure your client to do so:
 
  * Use `pulsar+ssl` URL type
  * Set `TLSTrustCertsFilePath` to the path to the TLS certs used by your client and the Pulsar broker
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-java.md b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-java.md
index 18961cd46cb..c0b6c0762a2 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-java.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-java.md
@@ -5,16 +5,16 @@ sidebar_label: "Java"
 original_id: client-libraries-java
 ---
 
-The Pulsar Java client can be used both to create Java producers, consumers, and [readers](#readers) of messages and to perform [administrative tasks](admin-api-overview). The current version of the Java client is **@pulsar:version@**.
+The Pulsar Java client can be used both to create Java producers, consumers, and [readers](#readers) of messages and to perform [administrative tasks](admin-api-overview.md). The current version of the Java client is **@pulsar:version@**.
 
 Javadoc for the Pulsar client is divided up into two domains, by package:
 
 Package | Description | Maven Artifact
 :-------|:------------|:--------------
 [`org.apache.pulsar.client.api`](/api/client) | The producer and consumer API | [org.apache.pulsar:pulsar-client:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client%7C@pulsar:version@%7Cjar)
-[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
+[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview.md) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
 
-This document will focus only on the client API for producing and consuming messages on Pulsar topics. For a guide to using the Java admin client, see [The Pulsar admin interface](admin-api-overview).
+This document will focus only on the client API for producing and consuming messages on Pulsar topics. For a guide to using the Java admin client, see [The Pulsar admin interface](admin-api-overview.md).
 
 ## Installation
 
@@ -54,7 +54,7 @@ dependencies {
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 Pulsar protocol URLs are assigned to specific clusters, use the `pulsar` scheme and have a default port of 6650. Here's an example for `localhost`:
 
@@ -72,7 +72,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you're using [TLS](security-tls-authentication) authentication, the URL will look like something like this:
+If you're using [TLS](security-tls-authentication.md) authentication, the URL will look like something like this:
 
 ```http
 
@@ -93,7 +93,7 @@ PulsarClient client = PulsarClient.builder()
 ```
 
 > #### Default broker URLs for standalone clusters
-> If you're running a cluster in [standalone mode](getting-started-standalone), the broker will be available at the `pulsar://localhost:6650` URL by default.
+> If you're running a cluster in [standalone mode](getting-started-standalone.md), the broker will be available at the `pulsar://localhost:6650` URL by default.
 
 Check out the Javadoc for the {@inject: javadoc:PulsarClient:/client/org/apache/pulsar/client/api/PulsarClient} class for a full listing of configurable parameters.
 
@@ -171,7 +171,7 @@ Producer<byte[]> producer = client.newProducer()
 
 ### Message routing
 
-When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more on specifying a routing mode using the Java client, see the [Partitioned Topics](cookbooks-partitioned) cookbook.
+When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more on specifying a routing mode using the Java client, see the [Partitioned Topics](cookbooks-partitioned.md) cookbook.
 
 ### Async send
 
@@ -376,7 +376,7 @@ The code sample above shows pointing the `Reader` object to a specific message (
 
 ## Schemas
 
-In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](concepts-schema-registry) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types). If you construct, say, a [producer](#producers) without specifying a schema, then the producer can only produce messages of type `byte[]`. Here's an example:
+In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](concepts-schema-registry.md) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types.md). If you construct, say, a [producer](#producers) without specifying a schema, then the producer can only produce messages of type `byte[]`. Here's an example:
 
 ```java
 
@@ -471,7 +471,7 @@ The following schema formats are currently available for Java:
 
 ## Authentication
 
-Pulsar currently supports two authentication schemes: [TLS](security-tls-authentication.md) and [Athenz](security-athenz). The Pulsar Java client can be used with both.
+Pulsar currently supports two authentication schemes: [TLS](security-tls-authentication.md) and [Athenz](security-athenz.md). The Pulsar Java client can be used with both.
 
 ### TLS Authentication
 
@@ -498,7 +498,7 @@ PulsarClient client = PulsarClient.builder()
 
 ### Athenz
 
-To use [Athenz](security-athenz) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
+To use [Athenz](security-athenz.md) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
 
 * `tenantDomain`
 * `tenantService`
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-python.md b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-python.md
index dc3b22bd1d0..013802db1bf 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-python.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-python.md
@@ -5,7 +5,7 @@ sidebar_label: "Python"
 original_id: client-libraries-python
 ---
 
-The Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp) and exposes all of the [same features](/api/cpp). You can find the code in the [`python` subdirectory](https://github.com/apache/incubator-pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
+The Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp.md) and exposes all of the [same features](/api/cpp). You can find the code in the [`python` subdirectory](https://github.com/apache/incubator-pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
 
 ## Installation
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-websocket.md b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-websocket.md
index 6a56a8b4487..dfc9cbde2f4 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-websocket.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries-websocket.md
@@ -5,14 +5,14 @@ sidebar_label: "WebSocket"
 original_id: client-libraries-websocket
 ---
 
-Pulsar's [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API is meant to provide a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients.md). Through WebSockets you can publish and consume messages and use all the features available in the [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp) client libraries.
+Pulsar's [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API is meant to provide a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients.md). Through WebSockets you can publish and consume messages and use all the features available in the [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp.md) client libraries.
 
 
 > You can use Pulsar's WebSocket API with any WebSocket client library. See examples for Python and Node.js [below](#client-examples).
 
 ## Running the WebSocket service
 
-The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone) already has the WebSocket service enabled.
+The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone.md) already has the WebSocket service enabled.
 
 In non-standalone mode, there are two ways to deploy the WebSocket service:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries.md b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries.md
index a28b6b3d434..c8f9d4b83a0 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/client-libraries.md
@@ -14,29 +14,29 @@ Pulsar currently has client libraries available for following languages:
 
 ## Java client
 
-For a tutorial on using the Pulsar Java client to produce and consume messages, see [The Pulsar Java client](client-libraries-java).
+For a tutorial on using the Pulsar Java client to produce and consume messages, see [The Pulsar Java client](client-libraries-java.md).
 
 There are also two independent sets of Javadoc API docs available:
 
 Library | Purpose
 :-------|:-------
-[`org.apache.pulsar.client.api`](/api/client) | The [Pulsar Java client](client-libraries-java) for producing and consuming messages on Pulsar topics [`org.apache.pulsar.client.admin`](/api/admin) | The Java client for the [Pulsar admin interface](admin-api-overview.md)
+[`org.apache.pulsar.client.api`](/api/client) | The [Pulsar Java client](client-libraries-java.md) for producing and consuming messages on Pulsar topics [`org.apache.pulsar.client.admin`](/api/admin) | The Java client for the [Pulsar admin interface](admin-api-overview.md)
 
 
 ## Go client
 
-For a tutorial on using the Pulsar Go client, see [The Pulsar Go client](client-libraries-go).
+For a tutorial on using the Pulsar Go client, see [The Pulsar Go client](client-libraries-go.md).
 
 
 ## Python client
 
-For a tutorial on using the Pulsar Python client, see [The Pulsar Python client](client-libraries-python).
+For a tutorial on using the Pulsar Python client, see [The Pulsar Python client](client-libraries-python.md).
 
 There are also [pdoc](https://github.com/BurntSushi/pdoc)-generated API docs for the Python client [here](/api/python).
 
 ## C++ client
 
-For a tutorial on using the Pulsar C++ clent, see [The Pulsar C++ client](client-libraries-cpp).
+For a tutorial on using the Pulsar C++ clent, see [The Pulsar C++ client](client-libraries-cpp.md).
 
 There are also [Doxygen](http://www.stack.nl/~dimitri/doxygen/)-generated API docs for the C++ client [here](/api/cpp).
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-architecture-overview.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-architecture-overview.md
index 99fdc8de886..7dd93f7115e 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-architecture-overview.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-architecture-overview.md
@@ -5,7 +5,7 @@ sidebar_label: "Architecture"
 original_id: concepts-architecture-overview
 ---
 
-At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication) data amongst themselves.
+At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication.md) data amongst themselves.
 
 In a Pulsar cluster:
 
@@ -17,20 +17,20 @@ The diagram below provides an illustration of a Pulsar cluster:
 
 ![Pulsar architecture diagram](/assets/pulsar-system-architecture.png)
 
-At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication).
+At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication.md).
 
 ## Brokers
 
 The Pulsar message broker is a stateless component that's primarily responsible for running two other components:
 
 * An HTTP server that exposes a {@inject: rest:REST:/} API for both administrative tasks and [topic lookup](concepts-clients.md#client-setup-phase) for producers and consumers
-* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol) used for all data transfers
+* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol.md) used for all data transfers
 
 Messages are typically dispatched out of a [managed ledger](#managed-ledgers) cache for the sake of performance, *unless* the backlog exceeds the cache size. If the backlog grows too large for the cache, the broker will start reading entries from BookKeeper.
 
-Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java).
+Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java.md).
 
-> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers) guide.
+> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers.md) guide.
 
 ## Clusters
 
@@ -40,9 +40,9 @@ A Pulsar instance consists of one or more Pulsar *clusters*. Clusters, in turn,
 * A ZooKeeper quorum used for cluster-level configuration and coordination
 * An ensemble of bookies used for [persistent storage](#persistent-storage) of messages
 
-Clusters can replicate amongst themselves using [geo-replication](concepts-replication).
+Clusters can replicate amongst themselves using [geo-replication](concepts-replication.md).
 
-> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters) guide.
+> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters.md) guide.
 
 ## Metadata store
 
@@ -130,17 +130,17 @@ $ bin/pulsar proxy \
 ```
 
 > #### Pulsar proxy docs
-> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy).
+> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy.md).
 
 
 Some important things to know about the Pulsar proxy:
 
 * Connecting clients don't need to provide *any* specific configuration to use the Pulsar proxy. You won't need to update the client configuration for existing applications beyond updating the IP used for the service URL (for example if you're running a load balancer over the Pulsar proxy).
-* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication) is supported by the Pulsar proxy
+* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication.md) is supported by the Pulsar proxy
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL. Pulsar provides a built-in service discovery mechanism that you can set up using the instructions in the [Deploying a Pulsar instance](deploy-bare-metal.md#service-discovery-setup) guide.
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL. Pulsar provides a built-in service discovery mechanism that you can set up using the instructions in the [Deploying a Pulsar instance](deploy-bare-metal.md#service-discovery-setup) guide.
 
 You can use your own service discovery system if you'd like. If you use your own system, there is just one requirement: when a client performs an HTTP request to an endpoint, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to *some* active broker in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
@@ -148,7 +148,7 @@ The diagram below illustrates Pulsar service discovery:
 
 ![alt-text](/assets/pulsar-service-discovery.png)
 
-In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python), for example, could access this Pulsar cluster like this:
+In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python.md), for example, could access this Pulsar cluster like this:
 
 ```python
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-authentication.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-authentication.md
index 5b94e89e169..d48e25a1dff 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-authentication.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-authentication.md
@@ -5,5 +5,5 @@ sidebar_label: "Authentication and Authorization"
 original_id: concepts-authentication
 ---
 
-Pulsar supports a pluggable [authentication](security-overview) mechanism which can be configured at broker and it also supports authorization to identify client and its access rights on topics and tenants.
+Pulsar supports a pluggable [authentication](security-overview.md) mechanism which can be configured at broker and it also supports authorization to identify client and its access rights on topics and tenants.
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-clients.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-clients.md
index 0e8388d950a..f3b5ae38932 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-clients.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-clients.md
@@ -5,7 +5,7 @@ sidebar_label: "Clients"
 original_id: concepts-clients
 ---
 
-Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md) and [C++](client-libraries-cpp). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
+Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md) and [C++](client-libraries-cpp.md). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
 
 Under the hood, the current official Pulsar client libraries support transparent reconnection and/or connection failover to brokers, queuing of messages until acknowledged by the broker, and heuristics such as connection retries with backoff.
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-messaging.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-messaging.md
index 4049a8b2602..9f66ba5e5c7 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-messaging.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-messaging.md
@@ -24,7 +24,7 @@ Publish time | The timestamp of when the message was published (automatically ap
 Event time | An optional timestamp that applications can attach to the message representing when something happened, e.g. when the message was processed. The event time of a message is 0 if none is explicitly set.
 
 
-> For a more in-depth breakdown of Pulsar message contents, see the documentation on Pulsar's [binary protocol](developing-binary-protocol).
+> For a more in-depth breakdown of Pulsar message contents, see the documentation on Pulsar's [binary protocol](developing-binary-protocol.md).
 
 ## Producers
 
@@ -74,7 +74,7 @@ Messages can be acknowledged either one by one or cumulatively. With cumulative
 
 ### Listeners
 
-Client libraries can provide their own listener implementations for consumers. The [Java client](client-libraries-java), for example, provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
+Client libraries can provide their own listener implementations for consumers. The [Java client](client-libraries-java.md), for example, provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
 
 ## Topics
 
@@ -198,7 +198,7 @@ Decisions about routing and subscription types can be made separately in most ca
 
 There is no difference between partitioned topics and normal topics in terms of how subscription types work, as partitioning only determines what happens between when a message is published by a producer and processed and acknowledged by a consumer.
 
-Partitioned topics need to be explicitly created via the [admin API](admin-api-overview). The number of partitions can be specified when creating the topic.
+Partitioned topics need to be explicitly created via the [admin API](admin-api-overview.md). The number of partitions can be specified when creating the topic.
 
 ### Routing modes
 
@@ -212,7 +212,7 @@ Key hash | If a key property has been specified on the message, the partitioned
 Single default partition | If no key is provided, each producer's message will be routed to a dedicated partition, initially random selected | Per-producer ordering
 Round robin distribution | If no key is provided, all messages will be routed to different partitions in round-robin fashion to achieve maximum throughput. | None
 
-In addition to these default modes, you can also create a custom routing mode if you're using the [Java client](client-libraries-java) by implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
+In addition to these default modes, you can also create a custom routing mode if you're using the [Java client](client-libraries-java.md) by implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
 
 
 
@@ -231,7 +231,7 @@ non-persistent://tenant/namespace/topic
 
 ```
 
-> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent).
+> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent.md).
 
 In non-persistent topics, brokers immediately deliver messages to all connected subscribers *without persisting them* in [BookKeeper](concepts-architecture-overview.md#persistent-storage). If a subscriber is disconnected, the broker will not be able to deliver those in-transit messages, and subscribers will never be able to receive those messages again. Eliminating the persistent storage step makes messaging on non-persistent topics slightly faster than on persistent topics in some cases [...]
 
@@ -279,7 +279,7 @@ Pulsar has two features, however, that enable you to override this default behav
 * Message **retention** enables you to store messages that have been acknowledged by a consumer
 * Message **expiry** enables you to set a time to live (TTL) for messages that have not yet been acknowledged
 
-> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry) cookbook.
+> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry.md) cookbook.
 
 The diagram below illustrates both concepts:
 
@@ -302,12 +302,12 @@ Message deduplication is disabled in the scenario shown at the top. Here, a prod
 
 In the second scenario at the bottom, the producer publishes message 1, which is received by the broker and persisted, as in the first scenario. When the producer attempts to publish the message again, however, the broker knows that it has already seen message 1 and thus does not persist the message.
 
-> Message deduplication is handled at the namespace level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication).
+> Message deduplication is handled at the namespace level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication.md).
 
 
 ### Producer idempotency
 
-The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, which means that you don't need to modify your Pulsar client code. Instead, you only need to make administrative changes (see the [Managi [...]
+The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, which means that you don't need to modify your Pulsar client code. Instead, you only need to make administrative changes (see the [Managi [...]
 
 ### Deduplication and effectively-once semantics
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-multi-tenancy.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-multi-tenancy.md
index 685c3031d4a..8cba09547d2 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-multi-tenancy.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-multi-tenancy.md
@@ -5,7 +5,7 @@ sidebar_label: "Multi Tenancy"
 original_id: concepts-multi-tenancy
 ---
 
-Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
+Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview.md) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
 
 The multi-tenant nature of Pulsar is reflected mostly visibly in topic URLs, which have this structure:
 
@@ -21,7 +21,7 @@ As you can see, the tenant is the most basic unit of categorization for topics (
 
 To each tenant in a Pulsar instance you can assign:
 
-* An [authorization](security-authorization) scheme
+* An [authorization](security-authorization.md) scheme
 * The set of [clusters](reference-terminology.md#cluster) to which the tenant's configuration applies
 
 ## Namespaces
@@ -29,7 +29,7 @@ To each tenant in a Pulsar instance you can assign:
 Tenants and namespaces are two key concepts of Pulsar to support multi-tenancy.
 
 * Pulsar is provisioned for specified tenants with appropriate capacity allocated to the tenant.
-* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
+* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
 
 Names for topics in the same namespace will look like this:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-overview.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-overview.md
index 743a6f9a477..02b4ef3d5bb 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-overview.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-overview.md
@@ -9,15 +9,15 @@ Pulsar is a multi-tenant, high-performance solution for server-to-server messagi
 
 Pulsar's key features include:
 
-* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo) of messages across clusters
+* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo.md) of messages across clusters
 * Very low publish and end-to-end latency
 * Seamless scalability out to over a million topics
 * A simple [client API](concepts-clients.md) with bindings for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp.md)
 * Multiple [subscription types](concepts-messaging.md#subscription-types) for topics ([exclusive](concepts-messaging.md#exclusive), [shared](concepts-messaging.md#shared), and [failover](concepts-messaging.md#failover))
 * Guaranteed message delivery with [persistent message storage](concepts-architecture-overview.md#persistent-storage) provided by [Apache BookKeeper](http://bookkeeper.apache.org/)
-* A serverless lightweight computing framework [Pulsar Functions](functions-overview) offers stream native data processing.
-* A serverless connector framework [Pulsar IO](io-overview) built on-top-of Pulsar Functions to make moving data in and out Apache Pulsar easier.
-* [Tiered Storage](concepts-tiered-storage) offloads data from hot/warn storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
+* A serverless lightweight computing framework [Pulsar Functions](functions-overview.md) offers stream native data processing.
+* A serverless connector framework [Pulsar IO](io-overview.md) built on-top-of Pulsar Functions to make moving data in and out Apache Pulsar easier.
+* [Tiered Storage](concepts-tiered-storage.md) offloads data from hot/warn storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
 
 ## Contents
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-replication.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-replication.md
index 6e23962e997..799f0eb4d92 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-replication.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-replication.md
@@ -5,5 +5,5 @@ sidebar_label: "Geo Replication"
 original_id: concepts-replication
 ---
 
-Pulsar enables messages to be produced and consumed in different geo-locations. For instance, your application may be publishing data in one region or market and you would like to process it for consumption in other regions or markets. [Geo-replication](administration-geo) in Pulsar enables you to do that.
+Pulsar enables messages to be produced and consumed in different geo-locations. For instance, your application may be publishing data in one region or market and you would like to process it for consumption in other regions or markets. [Geo-replication](administration-geo.md) in Pulsar enables you to do that.
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-schema-registry.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-schema-registry.md
index 651a3b897a8..d08c0cfa0a9 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-schema-registry.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-schema-registry.md
@@ -15,7 +15,7 @@ Both approaches are available in Pulsar, and you're free to adopt one or the oth
 1. For the "client-side" approach, producers and consumers can send and receive messages consisting of raw byte arrays and leave all type safety enforcement to the application on an "out-of-band" basis.
 1. For the "server-side" approach, Pulsar has a built-in **schema registry** that enables clients to upload data schemas on a per-topic basis. Those schemas dictate which data types are recognized as valid for that topic.
 
-> The Pulsar schema registry is currently available only for the [Java client](client-libraries-java).
+> The Pulsar schema registry is currently available only for the [Java client](client-libraries-java.md).
 
 ## Basic architecture
 
@@ -37,7 +37,7 @@ Pulsar schemas are fairly simple data structures that consist of:
 
 ## Schema versions
 
-In order to illustrate how schema versioning works, let's walk through an example. Imagine that the Pulsar [Java client](client-libraries-java) created using the code below attempts to connect to Pulsar and begin sending messages:
+In order to illustrate how schema versioning works, let's walk through an example. Imagine that the Pulsar [Java client](client-libraries-java.md) created using the code below attempts to connect to Pulsar and begin sending messages:
 
 ```java
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-tiered-storage.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-tiered-storage.md
index a0c7abd99ac..3a67f094905 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-tiered-storage.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-tiered-storage.md
@@ -15,4 +15,4 @@ One way to alleviate this cost is to use Tiered Storage. With tiered storage, ol
 
 Pulsar currently supports S3 as a long term store. Offloading to S3 triggered via a Rest API or command line interface. The user passes in the amount of topic data they wish to retain on bookkeeper, and the broker will copy the backlog data to S3. The original data will then be deleted from bookkeeper after a configured delay (4 hours by default).
 
-> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage).
+> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage.md).
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-topic-compaction.md b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-topic-compaction.md
index e402c965384..34b7ed7fbbd 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/concepts-topic-compaction.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/concepts-topic-compaction.md
@@ -7,7 +7,7 @@ original_id: concepts-topic-compaction
 
 Pulsar was built with highly scalable [persistent storage](concepts-architecture-overview.md#persistent-storage) of message data as a primary objective. Pulsar topics enable you to persistently store as many unacknowledged messages as you need while preserving message ordering. By default, Pulsar stores *all* unacknowledged/unprocessed messages produced on a topic. Accumulating many unacknowledged messages on a topic is necessary for many Pulsar use cases but it can also be very time int [...]
 
-> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction).
+> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction.md).
 
 For some use cases consumers don't need a complete "image" of the topic log. They may only need a few values to construct a more "shallow" image of the log, perhaps even just the most recent value. For these kinds of use cases Pulsar offers **topic compaction**. When you run compaction on a topic, Pulsar goes through a topic's backlog and removes messages that are *obscured* by later messages, i.e. it goes through the topic on a per-key basis and leaves only the most recent message assoc [...]
 
@@ -24,7 +24,7 @@ Pulsar's topic compaction feature:
 
 ## How topic compaction works
 
-When topic compaction is triggered [via the CLI](cookbooks-compaction), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
+When topic compaction is triggered [via the CLI](cookbooks-compaction.md), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
 
 After that, the broker will create a new [BookKeeper ledger](concepts-architecture-overview.md#ledgers) and make a second iteration through each message on the topic. For each message, if the key matches the latest occurrence of that key, then the key's data payload, message ID, and metadata will be written to the newly created ledger. If the key doesn't match the latest then the message will be skipped and left alone. If any given message has an empty payload, it will be skipped and con [...]
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-compaction.md b/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-compaction.md
index d1a3bafffb5..58ee52a622e 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-compaction.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-compaction.md
@@ -45,7 +45,7 @@ Configuring the compaction threshold on a namespace will apply to all topics wit
 
 ## Triggering compaction manually {#trigger}
 
-In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin) CLI tool. Here's an example:
+In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. Here's an example:
 
 ```bash
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-non-persistent.md b/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-non-persistent.md
index 8eb1307c3ea..f8311196816 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-non-persistent.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-non-persistent.md
@@ -41,7 +41,7 @@ $ bin/pulsar-client produce non-persistent://public/default/example-np-topic \
 
 ```
 
-> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-non-persistent-topics) guide.
+> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-non-persistent-topics.md) guide.
 
 ## Enabling
 
@@ -55,7 +55,7 @@ If you'd like to enable *only* non-persistent topics in a broker, you can set th
 
 ## Managing with cli
 
-Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin) non-persistent topics under a namespace, and more.
+Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin.md) non-persistent topics under a namespace, and more.
 
 ## Using with Pulsar clients
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-partitioned.md b/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-partitioned.md
index 2de88249412..b033d547904 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-partitioned.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-partitioned.md
@@ -7,7 +7,7 @@ original_id: cookbooks-partitioned
 
 By default, Pulsar topics are served by a single broker. Using only a single broker, however, limits a topic's maximum throughput. *Partitioned topics* are a special type of topic that can span multiple brokers and thus allow for much higher throughput. For an explanation of how partitioned topics work, see the [Partitioned Topics](concepts-messaging.md#partitioned-topics) concepts.
 
-You can [publish](#publishing-to-partitioned-topics) to partitioned topics using Pulsar's client libraries and you can [create and manage](#managing-partitioned-topics) partitioned topics using Pulsar's [admin API](admin-api-overview).
+You can [publish](#publishing-to-partitioned-topics) to partitioned topics using Pulsar's client libraries and you can [create and manage](#managing-partitioned-topics) partitioned topics using Pulsar's [admin API](admin-api-overview.md).
 
 ## Publishing to partitioned topics
 
@@ -83,4 +83,4 @@ producer.send("Partitioned topic message".getBytes());
 
 ## Managing partitioned topics
 
-You can use Pulsar's [admin API](admin-api-overview.md) to create and manage [partitioned topics](admin-api-partitioned-topics).
+You can use Pulsar's [admin API](admin-api-overview.md) to create and manage [partitioned topics](admin-api-partitioned-topics.md).
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-retention-expiry.md b/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-retention-expiry.md
index 3d2881fbb87..ea2fd385e2e 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-retention-expiry.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/cookbooks-retention-expiry.md
@@ -15,7 +15,7 @@ In Pulsar, you can override both of these default behaviors, at the namespace le
 * You can persistently store messages that have already been consumed and acknowledged for a minimum time by setting [retention policies](#retention-policies).
 * Messages that are not acknowledged within a specified timeframe, can be automatically marked as consumed, by specifying the [time to live](#time-to-live-ttl) (TTL).
 
-Pulsar's [admin interface](admin-api-overview) enables you to manage both retention policies and TTL at the namespace level (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
+Pulsar's [admin interface](admin-api-overview.md) enables you to manage both retention policies and TTL at the namespace level (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
 
 
 > #### Retention and TTL are solving two different problems
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-aws.md b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-aws.md
index f7e0f5490e0..488a8de2804 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-aws.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-aws.md
@@ -5,7 +5,7 @@ sidebar_label: "Amazon Web Services"
 original_id: deploy-aws
 ---
 
-> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster).
+> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster.md).
 
 One of the easiest ways to get a Pulsar [cluster](reference-terminology.md#cluster) running on [Amazon Web Services](https://aws.amazon.com/) (AWS) is to use the the [Terraform](https://terraform.io) infrastructure provisioning tool and the [Ansible](https://www.ansible.com) server automation tool. Terraform can create the resources necessary to run the Pulsar cluster---[EC2](https://aws.amazon.com/ec2/) instances, networking and security infrastructure, etc.---while Ansible can install  [...]
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-bare-metal-multi-cluster.md b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-bare-metal-multi-cluster.md
index 1dc7d9e76b7..407f04deba5 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-bare-metal-multi-cluster.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-bare-metal-multi-cluster.md
@@ -9,14 +9,14 @@ original_id: deploy-bare-metal-multi-cluster
 
 1. Single-cluster Pulsar installations should be sufficient for all but the most ambitious use cases. If you're interested in experimenting with
 Pulsar or using it in a startup or on a single team, we recommend opting for a single cluster. For instructions on deploying a single cluster,
-see the guide [here](deploy-bare-metal).
-2. If you want to use all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
+see the guide [here](deploy-bare-metal.md).
+2. If you want to use all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
 package and make sure it is installed under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you
-have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
+have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
 
 :::
 
-A Pulsar *instance* consists of multiple Pulsar clusters working in unison. Clusters can be distributed across data centers or geographical regions and can replicate amongst themselves using [geo-replication](administration-geo). Deploying a multi-cluster Pulsar instance involves the following basic steps:
+A Pulsar *instance* consists of multiple Pulsar clusters working in unison. Clusters can be distributed across data centers or geographical regions and can replicate amongst themselves using [geo-replication](administration-geo.md). Deploying a multi-cluster Pulsar instance involves the following basic steps:
 
 * Deploying two separate [ZooKeeper](#deploying-zookeeper) quorums: a [local](#deploying-local-zookeeper) quorum for each cluster in the instance and a [configuration store](#configuration-store) quorum for instance-wide tasks
 * Initializing [cluster metadata](#cluster-metadata-initialization) for each cluster
@@ -26,7 +26,7 @@ A Pulsar *instance* consists of multiple Pulsar clusters working in unison. Clus
 If you're deploying a single Pulsar cluster, see the [Clusters and Brokers](getting-started-standalone.md#starting-the-cluster) guide.
 
 > #### Running Pulsar locally or on Kubernetes?
-> This guide shows you how to deploy Pulsar in production in a non-Kubernetes. If you'd like to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you're looking to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes) guide, which includes sections on running Pulsar on Kubernetes on [Google Kubernetes Engine](deploy-kubernetes#pulsar-on- [...]
+> This guide shows you how to deploy Pulsar in production in a non-Kubernetes. If you'd like to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you're looking to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes.md) guide, which includes sections on running Pulsar on Kubernetes on [Google Kubernetes Engine](deploy-kubernetes#pulsar- [...]
 
 ## System requirement
 Currently, Pulsar is available for 64-bit **macOS**, **Linux**, and **Windows**. To use Pulsar, you need to install 64-bit JRE/JDK 8 or later versions.
@@ -243,7 +243,7 @@ As you can see from the example above, the following needs to be specified:
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
+If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
 
 Make sure to run `initialize-cluster-metadata` for each cluster in your instance.
 
@@ -344,17 +344,17 @@ $ bin/pulsar broker
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL. Pulsar provides a built-in service discovery mechanism that you can set up using the instructions [immediately below](#service-discovery-setup).
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL. Pulsar provides a built-in service discovery mechanism that you can set up using the instructions [immediately below](#service-discovery-setup).
 
-You can also use your own service discovery system if you'd like. If you use your own system, there is just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to *some* active broker in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
+You can also use your own service discovery system if you'd like. If you use your own system, there is just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration.md) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to *some* active broker in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
 > #### Service discovery already provided by many scheduling systems
-> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes), have service discovery systems built in. If you're running Pulsar on such a system, you may not need to provide your own service discovery mechanism.
+> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes.md), have service discovery systems built in. If you're running Pulsar on such a system, you may not need to provide your own service discovery mechanism.
 
 
 ### Service discovery setup
 
-The service discovery mechanism included with Pulsar maintains a list of active brokers, stored in ZooKeeper, and supports lookup using HTTP and also Pulsar's [binary protocol](developing-binary-protocol).
+The service discovery mechanism included with Pulsar maintains a list of active brokers, stored in ZooKeeper, and supports lookup using HTTP and also Pulsar's [binary protocol](developing-binary-protocol.md).
 
 To get started setting up Pulsar's built-in service discovery, you need to change a few parameters in the [`conf/discovery.conf`](reference-configuration.md#service-discovery) configuration file. Set the [`zookeeperServers`](reference-configuration.md#service-discovery-zookeeperServers) parameter to the cluster's ZooKeeper quorum connection string and the [`configurationStoreServers`](reference-configuration.md#service-discovery-configurationStoreServers) setting to the [configuration
 store](reference-terminology.md#configuration-store) quorum connection string.
@@ -379,7 +379,7 @@ $ bin/pulsar-daemon start discovery
 
 ## Admin client and verification
 
-At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
+At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview.md) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
 
 The most important thing is that you point the [`serviceUrl`](reference-configuration.md#client-serviceUrl) parameter to the correct service URL for the cluster:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-bare-metal.md b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-bare-metal.md
index c3dc7b9a377..7bc83e01769 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-bare-metal.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-bare-metal.md
@@ -9,10 +9,10 @@ original_id: deploy-bare-metal
 
 1. Single-cluster Pulsar installations should be sufficient for all but the most ambitious use cases. If you're interested in experimenting with
 Pulsar or using it in a startup or on a single team, we recommend opting for a single cluster. If you do need to run a multi-cluster Pulsar instance,
-however, see the guide [here](deploy-bare-metal-multi-cluster).
-2. If you want to use all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
+however, see the guide [here](deploy-bare-metal-multi-cluster.md).
+2. If you want to use all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
 package and make sure it is installed under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you
-have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
+have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
 
 :::
 
@@ -211,9 +211,9 @@ Flag | Description
 `--zookeeper` | A "local" ZooKeeper connection string for the cluster. This connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--configuration-store` | The configuration store connection string for the entire instance. As with the `--zookeeper` flag, this connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--web-service-url` | The web service URL for the cluster, plus a port. This URL should be a standard DNS name. The default port is 8080 (we don't recommend using a different port).
-`--web-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
+`--web-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
 `--broker-service-url` | A broker service URL enabling interaction with the brokers in the cluster. This URL should use the same DNS name as the web service URL but should use the `pulsar` scheme instead. The default port is 6650 (we don't recommend using a different port).
-`--broker-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
+`--broker-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
 
 ## Deploying a BookKeeper cluster
 
@@ -294,7 +294,7 @@ clusterName=pulsar-cluster-1
 
 ### Enabling Pulsar Functions (optional)
 
-If you want to enable [Pulsar Functions](functions-overview), you can follow the instructions as below:
+If you want to enable [Pulsar Functions](functions-overview.md), you can follow the instructions as below:
 
 1. Edit `conf/broker.conf` to enable function worker, by setting `functionsWorkerEnabled` to `true`.
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-dcos.md b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-dcos.md
index 264597a5875..79919a525c3 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-dcos.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-dcos.md
@@ -7,7 +7,7 @@ original_id: deploy-dcos
 
 :::tip
 
-If you want to enable all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you can choose to use `apachepulsar/pulsar-all` image instead of
+If you want to enable all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you can choose to use `apachepulsar/pulsar-all` image instead of
 `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 :::
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-kubernetes.md b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-kubernetes.md
index 58446cf789a..0684dee9633 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-kubernetes.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-kubernetes.md
@@ -7,7 +7,7 @@ original_id: deploy-kubernetes
 
 :::tip
 
-If you want to enable all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you can choose to use `apachepulsar/pulsar-all` image instead of
+If you want to enable all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you can choose to use `apachepulsar/pulsar-all` image instead of
 `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 :::
@@ -20,7 +20,7 @@ The deployment method shown in this guide relies on [YAML](http://yaml.org/) def
 * A three-node ZooKeeper cluster
 * A three-broker Pulsar cluster
 * A [monitoring stack](#) consisting of [Prometheus](https://prometheus.io/), [Grafana](https://grafana.com), and the [Pulsar dashboard](administration-dashboard.md)
-* A [pod](https://kubernetes.io/docs/concepts/workloads/pods/pod/) from which you can run administrative commands using the [`pulsar-admin`](reference-pulsar-admin) CLI tool
+* A [pod](https://kubernetes.io/docs/concepts/workloads/pods/pod/) from which you can run administrative commands using the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool
 
 ## Setup
 
@@ -252,7 +252,7 @@ $ bin/pulsar initialize-cluster-metadata \
 
 ### Deploy the rest of the components
 
-Once cluster metadata has been successfully initialized, you can then deploy the bookies, brokers, monitoring stack ([Prometheus](https://prometheus.io), [Grafana](https://grafana.com), and the [Pulsar dashboard](administration-dashboard)), and Pulsar cluster proxy:
+Once cluster metadata has been successfully initialized, you can then deploy the bookies, brokers, monitoring stack ([Prometheus](https://prometheus.io), [Grafana](https://grafana.com), and the [Pulsar dashboard](administration-dashboard.md)), and Pulsar cluster proxy:
 
 ```bash
 
@@ -276,9 +276,9 @@ $ kubectl get pods -w -l app=pulsar
 
 Once all of the components are up and running, you'll need to create at least one Pulsar tenant and at least one namespace.
 
-> This step is not strictly required if Pulsar [authentication and authorization](security-overview.md) is turned on, though it allows you to change [policies](admin-api-namespaces) for each of the namespaces later.
+> This step is not strictly required if Pulsar [authentication and authorization](security-overview.md) is turned on, though it allows you to change [policies](admin-api-namespaces.md) for each of the namespaces later.
 
-You can create properties and namespaces (and perform any other administrative tasks) using the `pulsar-admin` pod that is already configured to act as an admin client for your newly created Pulsar cluster. One easy way to perform administrative tasks is to create an alias for the [`pulsar-admin`](reference-pulsar-admin) tool installed on the admin pod.
+You can create properties and namespaces (and perform any other administrative tasks) using the `pulsar-admin` pod that is already configured to act as an admin client for your newly created Pulsar cluster. One easy way to perform administrative tasks is to create an alias for the [`pulsar-admin`](reference-pulsar-admin.md) tool installed on the admin pod.
 
 ```bash
 
@@ -349,7 +349,7 @@ $ pulsar-perf consume persistent://public/default/my-topic \
 
 ```
 
-You can also view [stats](administration-stats) for the topic using the [`pulsar-admin`](reference-pulsar-admin.md#persistent-stats) tool:
+You can also view [stats](administration-stats.md) for the topic using the [`pulsar-admin`](reference-pulsar-admin.md#persistent-stats) tool:
 
 ```bash
 
@@ -359,7 +359,7 @@ $ pulsar-admin persistent stats persistent://public/default/my-topic
 
 ### Monitoring
 
-The default monitoring stack for Pulsar on Kubernetes has consists of [Prometheus](#prometheus), [Grafana](#grafana), and the [Pulsar dashboard](administration-dashboard).
+The default monitoring stack for Pulsar on Kubernetes has consists of [Prometheus](#prometheus), [Grafana](#grafana), and the [Pulsar dashboard](administration-dashboard.md).
 
 > If you deployed the cluster to Minikube, the following monitoring ports are mapped at the minikube VM:
 >
@@ -389,7 +389,7 @@ You can then access the dashboard in your web browser at [localhost:3000](http:/
 
 #### Pulsar dashboard
 
-While Grafana and Prometheus are used to provide graphs with historical data, [Pulsar dashboard](administration-dashboard) reports more detailed current data for individual [topics](reference-terminology.md#topic).
+While Grafana and Prometheus are used to provide graphs with historical data, [Pulsar dashboard](administration-dashboard.md) reports more detailed current data for individual [topics](reference-terminology.md#topic).
 
 For example, you can have sortable tables showing all namespaces, topics, and broker stats, with details on the IP address for consumers, how long they've been connected, and much more.
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-monitoring.md b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-monitoring.md
index 8c537e5b1ce..7a58fa2e3b8 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/deploy-monitoring.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/deploy-monitoring.md
@@ -89,7 +89,7 @@ For that reason we only collect time series of metrics aggregated at the namespa
 
 ### Pulsar per-topic dashboard
 
-The per-topic dashboard instructions are available at [Dashboard](administration-dashboard).
+The per-topic dashboard instructions are available at [Dashboard](administration-dashboard.md).
 
 ### Grafana
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/develop-schema.md b/site2/website/versioned_docs/version-2.1.0-incubating/develop-schema.md
index 42a6a698367..6940438390e 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/develop-schema.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/develop-schema.md
@@ -5,7 +5,7 @@ sidebar_label: "Custom schema storage"
 original_id: develop-schema
 ---
 
-By default, Pulsar stores data type [schemas](concepts-schema-registry) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
+By default, Pulsar stores data type [schemas](concepts-schema-registry.md) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
 
 In order to use a non-default (i.e. non-BookKeeper) storage system for Pulsar schemas, you need to implement two Java interfaces: [`SchemaStorage`](#schemastorage-interface) and [`SchemaStorageFactory`](#schemastoragefactory-interface).
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/functions-api.md b/site2/website/versioned_docs/version-2.1.0-incubating/functions-api.md
index 40480139375..36f8586e88b 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/functions-api.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/functions-api.md
@@ -5,9 +5,9 @@ sidebar_label: "API"
 original_id: functions-api
 ---
 
-[Pulsar Functions](functions-overview) provides an easy-to-use API that developers can use to create and manage processing logic for the Apache Pulsar messaging system. With Pulsar Functions, you can write functions of any level of complexity in [Java](#functions-for-java) or [Python](#functions-for-python) and run them in conjunction with a Pulsar cluster without needing to run a separate stream processing engine.
+[Pulsar Functions](functions-overview.md) provides an easy-to-use API that developers can use to create and manage processing logic for the Apache Pulsar messaging system. With Pulsar Functions, you can write functions of any level of complexity in [Java](#functions-for-java) or [Python](#functions-for-python) and run them in conjunction with a Pulsar cluster without needing to run a separate stream processing engine.
 
-> For a more in-depth overview of the Pulsar Functions feature, see the [Pulsar Functions overview](functions-overview).
+> For a more in-depth overview of the Pulsar Functions feature, see the [Pulsar Functions overview](functions-overview.md).
 
 ## Core programming model
 
@@ -45,7 +45,7 @@ Some things to note about this Pulsar Function:
 
 ### Example deployment
 
-Deploying Pulsar Functions is handled by the [`pulsar-admin`](reference-pulsar-admin) CLI tool, in particular the [`functions`](reference-pulsar-admin.md#functions) command. Here's an example command that would run our [sanitizer](#example-function) function from above in [local run](functions-deploying.md#local-run-mode) mode:
+Deploying Pulsar Functions is handled by the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool, in particular the [`functions`](reference-pulsar-admin.md#functions) command. Here's an example command that would run our [sanitizer](#example-function) function from above in [local run](functions-deploying.md#local-run-mode) mode:
 
 ```bash
 
@@ -61,7 +61,7 @@ $ bin/pulsar-admin functions localrun \
 
 ```
 
-For instructions on running functions in your Pulsar cluster, see the [Deploying Pulsar Functions](functions-deploying) guide.
+For instructions on running functions in your Pulsar cluster, see the [Deploying Pulsar Functions](functions-deploying.md) guide.
 
 ### Available APIs
 
@@ -542,7 +542,7 @@ public class MetricRecorderFunction implements Function<Integer, Void> {
 
 ```
 
-> For instructions on reading and using metrics, see the [Monitoring](deploy-monitoring) guide.
+> For instructions on reading and using metrics, see the [Monitoring](deploy-monitoring.md) guide.
 
 
 ## Functions for Python
@@ -554,7 +554,7 @@ Writing Pulsar Functions in Python entails implementing one of two things:
 
 ### Getting started
 
-Regardless of which [deployment mode](functions-deploying) you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:
+Regardless of which [deployment mode](functions-deploying.md) you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:
 
 * pulsar-client
 * protobuf
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/functions-deploying.md b/site2/website/versioned_docs/version-2.1.0-incubating/functions-deploying.md
index 28276e9deff..dfc6dd6795d 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/functions-deploying.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/functions-deploying.md
@@ -19,8 +19,8 @@ Cluster mode | The function runs *inside of* your Pulsar cluster, on the same ma
 
 In order to deploy and manage Pulsar Functions, you need to have a Pulsar cluster running. There are several options for this:
 
-* You can run a [standalone cluster](getting-started-standalone) locally on your own machine
-* You can deploy a Pulsar cluster on [Kubernetes](deploy-kubernetes.md), [Amazon Web Services](deploy-aws.md), [bare metal](deploy-bare-metal), [DC/OS](https://dcos.io/), and more
+* You can run a [standalone cluster](getting-started-standalone.md) locally on your own machine
+* You can deploy a Pulsar cluster on [Kubernetes](deploy-kubernetes.md), [Amazon Web Services](deploy-aws.md), [bare metal](deploy-bare-metal.md), [DC/OS](https://dcos.io/), and more
 
 If you're running a non-[standalone](reference-terminology.md#standalone) cluster, you'll need to obtain the service URL for the cluster. How you obtain the service URL will depend on how you deployed your Pulsar cluster.
 
@@ -52,7 +52,7 @@ Function name | Whichever value is specified for the class name (minus org, libr
 Tenant | Derived from the input topics' names. If the input topics are under the `marketing` tenant---i.e. the topic names have the form `persistent://marketing/{namespace}/{topicName}`---then the tenant will be `marketing`.
 Namespace | Derived from the input topics' names. If the input topics are under the `asia` namespace under the `marketing` tenant---i.e. the topic names have the form `persistent://marketing/asia/{topicName}`, then the namespace will be `asia`.
 Output topic | `{input topic}-{function name}-output`. A function with an input topic name of `incoming` and a function name of `exclamation`, for example, would have an output topic of `incoming-exclamation-output`.
-Subscription type | For at-least-once and at-most-once [processing guarantees](functions-guarantees), the [`SHARED`](concepts-messaging.md#shared) is applied by default; for effectively-once guarantees, [`FAILOVER`](concepts-messaging.md#failover) is applied
+Subscription type | For at-least-once and at-most-once [processing guarantees](functions-guarantees.md), the [`SHARED`](concepts-messaging.md#shared) is applied by default; for effectively-once guarantees, [`FAILOVER`](concepts-messaging.md#failover) is applied
 Processing guarantees | [`ATLEAST_ONCE`](functions-guarantees.md)
 Pulsar service URL | `pulsar://localhost:6650`
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/functions-metrics.md b/site2/website/versioned_docs/version-2.1.0-incubating/functions-metrics.md
index 05640f2936f..51090086b57 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/functions-metrics.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/functions-metrics.md
@@ -12,7 +12,7 @@ Pulsar Functions can publish arbitrary metrics to the metrics interface which ca
 
 ## Accessing metrics
 
-For a guide to accessing metrics created by Pulsar Functions, see the guide to [Monitoring](deploy-monitoring) in Pulsar.
+For a guide to accessing metrics created by Pulsar Functions, see the guide to [Monitoring](deploy-monitoring.md) in Pulsar.
 
 ## Java SDK
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/functions-overview.md b/site2/website/versioned_docs/version-2.1.0-incubating/functions-overview.md
index bb2246a764b..5dbc04204c2 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/functions-overview.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/functions-overview.md
@@ -154,7 +154,7 @@ class RoutingFunction(Function):
 
 ## Command-line interface
 
-Pulsar Functions are managed using the [`pulsar-admin`](reference-pulsar-admin) CLI tool (in particular the [`functions`](reference-pulsar-admin.md#functions) command). Here's an example command that would run a function in [local run mode](#local-run-mode):
+Pulsar Functions are managed using the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool (in particular the [`functions`](reference-pulsar-admin.md#functions) command). Here's an example command that would run a function in [local run mode](#local-run-mode):
 
 ```bash
 
@@ -492,7 +492,7 @@ $ bin/pulsar-admin functions create \
 
 ## Metrics
 
-Pulsar Functions that use the [Pulsar Functions SDK](#the-pulsar-functions-sdk) can publish metrics to Pulsar. For more information, see [Metrics for Pulsar Functions](functions-metrics).
+Pulsar Functions that use the [Pulsar Functions SDK](#the-pulsar-functions-sdk) can publish metrics to Pulsar. For more information, see [Metrics for Pulsar Functions](functions-metrics.md).
 
 ## State storage
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/getting-started-docker.md b/site2/website/versioned_docs/version-2.1.0-incubating/getting-started-docker.md
index df1b6b31b37..0c3d9068733 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/getting-started-docker.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/getting-started-docker.md
@@ -61,8 +61,8 @@ For more info, see [Topics](concepts-messaging.md#topics).
 
 ## Start publishing and consuming messages
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python),
-and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can
+Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md),
+and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can
 use one of these root URLs for interacting with your cluster:
 
 * `pulsar://localhost:6650`
@@ -117,7 +117,7 @@ client.close()
 ## Get the topic statistics
 
 In Pulsar you can use REST, Java, or command-line tools to control every aspect of the system.
-You can find detailed documentation of all the APIs in the [Admin API Overview](admin-api-overview).
+You can find detailed documentation of all the APIs in the [Admin API Overview](admin-api-overview.md).
 
 In the simplest example, you can use curl to probe the stats for a particular topic:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/getting-started-standalone.md b/site2/website/versioned_docs/version-2.1.0-incubating/getting-started-standalone.md
index c73b6dd0d12..ed672efe719 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/getting-started-standalone.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/getting-started-standalone.md
@@ -8,7 +8,7 @@ original_id: getting-started-standalone
 For the purposes of local development and testing, you can run Pulsar in standalone mode on your own machine. Standalone mode includes a Pulsar broker as well as the necessary ZooKeeper and BookKeeper components running inside of a single Java Virtual Machine (JVM) process.
 
 > #### Pulsar in production? 
-> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal) guide.
+> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal.md) guide.
 
 
 ## Run Pulsar Standalone Manually
@@ -113,7 +113,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you are running Pulsar in a bare metal cluster, you need to make sure `connectors` tarball is unzipped in every broker's pulsar directory
 > (or in every function-worker's pulsar directory if you are running a separate worker cluster for Pulsar functions).
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 ### Starting the cluster
@@ -162,12 +162,12 @@ If the message has been successfully published to the topic, you should see a co
 
 ## Using Pulsar clients locally
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
+Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
 
 * `http://localhost:8080`
 * `pulsar://localhost:6650`
 
-Here's an example producer for a Pulsar topic using the [Java](client-libraries-java) client:
+Here's an example producer for a Pulsar topic using the [Java](client-libraries-java.md) client:
 
 ```java
 
@@ -178,7 +178,7 @@ Producer<byte[]> producer = client.newProducer().topic("my-topic").create();
 
 ```
 
-Here's an example [Python](client-libraries-python) producer:
+Here's an example [Python](client-libraries-python.md) producer:
 
 ```python
 
@@ -189,7 +189,7 @@ producer = client.create_producer('my-topic')
 
 ```
 
-Finally, here's an example [C++](client-libraries-cpp) producer:
+Finally, here's an example [C++](client-libraries-cpp.md) producer:
 
 ```cpp
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/io-cassandra.md b/site2/website/versioned_docs/version-2.1.0-incubating/io-cassandra.md
index 9c46f73da37..68af2c066e9 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/io-cassandra.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/io-cassandra.md
@@ -7,7 +7,7 @@ original_id: io-cassandra
 
 The Cassandra Sink connector is used to write messages to a Cassandra Cluster.
 
-The tutorial [Connecting Pulsar with Apache Cassandra](io-quickstart) shows an example how to use Cassandra Sink
+The tutorial [Connecting Pulsar with Apache Cassandra](io-quickstart.md) shows an example how to use Cassandra Sink
 connector to write messages to a Cassandra table.
 
 ## Sink Configuration Options
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/io-develop.md b/site2/website/versioned_docs/version-2.1.0-incubating/io-develop.md
index b9d211af422..a3291042015 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/io-develop.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/io-develop.md
@@ -8,12 +8,12 @@ original_id: io-develop
 This guide describes how developers can write new connectors for Pulsar IO to move data
 between Pulsar and other systems. It describes how to create a Pulsar IO connector.
 
-Pulsar IO connectors are specialized [Pulsar Functions](functions-overview). So writing
+Pulsar IO connectors are specialized [Pulsar Functions](functions-overview.md). So writing
 a Pulsar IO connector is as simple as writing a Pulsar function. Pulsar IO connectors come
 in two flavors: {@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java},
 which import data from another system, and {@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java},
-which export data to another system. For example, [KinesisSink](io-kinesis) would export
-the messages of a Pulsar topic to a Kinesis stream, and [RabbitmqSource](io-rabbitmq) would import
+which export data to another system. For example, [KinesisSink](io-kinesis.md) would export
+the messages of a Pulsar topic to a Kinesis stream, and [RabbitmqSource](io-rabbitmq.md) would import
 the messages of a RabbitMQ queue to a Pulsar topic.
 
 ### Developing
@@ -137,7 +137,7 @@ separate integration tests to verify end-to-end functionality. In Pulsar, we are
 ### Packaging
 
 Once you've developed and tested your connector, you must package it so that it can be submitted
-to a [Pulsar Functions](functions-overview) cluster. There are two approaches described
+to a [Pulsar Functions](functions-overview.md) cluster. There are two approaches described
 here work with Pulsar Functions' runtime.
 
 If you plan to package and distribute your connector for others to use, you are obligated to
@@ -153,7 +153,7 @@ The easiest approach to packaging a Pulsar IO connector is to create a NAR packa
 
 NAR stands for NiFi Archive. It is a custom packaging mechanism used by Apache NiFi, to provide
 a bit of Java ClassLoader isolation. For more details, you can read this [blog post](https://medium.com/hashmapinc/nifi-nar-files-explained-14113f7796fd) to understand
-how NAR works. Pulsar uses the same mechanism for packaging all the [builtin connectors](io-connectors).
+how NAR works. Pulsar uses the same mechanism for packaging all the [builtin connectors](io-connectors.md).
 
 All what you need is to include this [nifi-nar-maven-plugin](https://mvnrepository.com/artifact/org.apache.nifi/nifi-nar-maven-plugin) in your maven project for your connector. For example:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/io-managing.md b/site2/website/versioned_docs/version-2.1.0-incubating/io-managing.md
index c5c61cc4db7..c25e15641ef 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/io-managing.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/io-managing.md
@@ -50,7 +50,7 @@ For details, consult the documentation for [individual connectors](io-overview.m
 
 ## Running Connectors
 
-Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Running sources
 
@@ -166,8 +166,8 @@ Here's an example to submit a Cassandra sink:
 
 ## Monitoring Connectors
 
-Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview), so you can use [`functions`](reference-pulsar-admin.md#source) commands
-available in the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview.md), so you can use [`functions`](reference-pulsar-admin.md#source) commands
+available in the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Retrieve Connector Metadata
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/io-overview.md b/site2/website/versioned_docs/version-2.1.0-incubating/io-overview.md
index e0f2277e18e..7479e1cf5ff 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/io-overview.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/io-overview.md
@@ -8,7 +8,7 @@ original_id: io-overview
 Messaging systems are most powerful when you can easily use them in conjunction with external systems like databases and other messaging systems. **Pulsar IO** is a feature of Pulsar that enables you to easily create, deploy, and manage Pulsar **connectors** that interact with external systems, such as [Apache Cassandra](https://cassandra.apache.org), [Aerospike](https://www.aerospike.com), and many others.
 
 > #### Pulsar IO and Pulsar Functions
-> Under the hood, Pulsar IO connectors are specialized [Pulsar Functions](functions-overview.md) purpose-built to interface with external systems. The [administrative interface](io-quickstart) for Pulsar IO is, in fact, quite similar to that of Pulsar Functions.
+> Under the hood, Pulsar IO connectors are specialized [Pulsar Functions](functions-overview.md) purpose-built to interface with external systems. The [administrative interface](io-quickstart.md) for Pulsar IO is, in fact, quite similar to that of Pulsar Functions.
 
 ## Sources and sinks
 
@@ -23,7 +23,7 @@ This diagram illustrates the relationship between sources, sinks, and Pulsar:
 
 ## Working with connectors
 
-Pulsar IO connectors can be managed via the [`pulsar-admin`](reference-pulsar-admin) CLI tool, in particular the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands.
+Pulsar IO connectors can be managed via the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool, in particular the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands.
 
 > For a guide to managing connectors in your Pulsar installation, see the [Getting started with Pulsar IO](io-quickstart.md)
 
@@ -31,8 +31,8 @@ The following connectors are currently available for Pulsar:
 
 |Name|Java Class|Documentation|
 |---|---|---|
-|[Aerospike sink](https://www.aerospike.com/)|[`org.apache.pulsar.io.aerospike.AerospikeSink`](https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/aerospike/src/main/java/org/apache/pulsar/io/aerospike/AerospikeStringSink.java)|[Documentation](io-aerospike)|
-|[Cassandra sink](https://cassandra.apache.org)|[`org.apache.pulsar.io.cassandra.CassandraSink`](https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/cassandra/src/main/java/org/apache/pulsar/io/cassandra/CassandraStringSink.java)|[Documentation](io-cassandra)|
+|[Aerospike sink](https://www.aerospike.com/)|[`org.apache.pulsar.io.aerospike.AerospikeSink`](https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/aerospike/src/main/java/org/apache/pulsar/io/aerospike/AerospikeStringSink.java)|[Documentation](io-aerospike.md)|
+|[Cassandra sink](https://cassandra.apache.org)|[`org.apache.pulsar.io.cassandra.CassandraSink`](https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/cassandra/src/main/java/org/apache/pulsar/io/cassandra/CassandraStringSink.java)|[Documentation](io-cassandra.md)|
 |[Kafka source](https://kafka.apache.org)|[`org.apache.pulsar.io.kafka.KafkaSource`](https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaStringSource.java)|[Documentation](io-kafka.md#source)|
 |[Kafka sink](https://kafka.apache.org)|[`org.apache.pulsar.io.kafka.KafkaSink`](https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaStringSink.java)|[Documentation](io-kafka.md#sink)|
 |[Kinesis sink](https://aws.amazon.com/kinesis/)|[`org.apache.pulsar.io.kinesis.KinesisSink`](https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/kinesis/src/main/java/org/apache/pulsar/io/kinesis/KinesisSink.java)|[Documentation](io-kinesis.md#sink)|
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/io-quickstart.md b/site2/website/versioned_docs/version-2.1.0-incubating/io-quickstart.md
index 36e11e280d3..75031e202ed 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/io-quickstart.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/io-quickstart.md
@@ -6,14 +6,14 @@ original_id: io-quickstart
 ---
 
 This tutorial provides a hands-on look at how you can move data out of Pulsar without writing a single line of code.
-It is helpful to review the [concepts](io-overview) for Pulsar I/O in tandem with running the steps in this guide
+It is helpful to review the [concepts](io-overview.md) for Pulsar I/O in tandem with running the steps in this guide
 to gain a deeper understanding. At the end of this tutorial, you will be able to:
 
 - Connect your Pulsar cluster with your Cassandra cluster
 
 :::tip
 
-1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone). However all
+1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone.md). However all
 the commands used in this tutorial should be able to be used in a multi-nodes Pulsar cluster without any changes.
 2. All the instructions are assumed to run at the root directory of a Pulsar binary distribution.
 
@@ -267,11 +267,11 @@ configs:
 
 ```
 
-To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra).
+To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra.md).
 
 ### Submit a Cassandra Sink
 
-Pulsar provides the [CLI](reference-cli-tools) for running and managing Pulsar I/O connectors.
+Pulsar provides the [CLI](reference-cli-tools.md) for running and managing Pulsar I/O connectors.
 
 We can run following command to sink a sink connector with type `cassandra` and config file `examples/cassandra-sink.yml`.
 
@@ -296,7 +296,7 @@ as a Pulsar Function and write the messages produced in topic `test_cassandra` t
 
 ### Inspect the Cassandra Sink
 
-Since an IO connector is running as [Pulsar Functions](functions-overview), you can use [functions CLI](reference-pulsar-admin.md#functions)
+Since an IO connector is running as [Pulsar Functions](functions-overview.md), you can use [functions CLI](reference-pulsar-admin.md#functions)
 for inspecting and managing the IO connectors.
 
 #### Retrieve Sink Info
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/pulsar-2.0.md b/site2/website/versioned_docs/version-2.1.0-incubating/pulsar-2.0.md
index 6a0246562c0..d92cf9c7b52 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/pulsar-2.0.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/pulsar-2.0.md
@@ -5,13 +5,13 @@ sidebar_label: "Pulsar 2.0"
 original_id: pulsar-2.0
 ---
 
-Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview) feature, some terminology changes, and more.
+Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview.md) feature, some terminology changes, and more.
 
 ## New features in Pulsar 2.0
 
 Feature | Description
 :-------|:-----------
-[Pulsar Functions](functions-overview) | A lightweight compute option for Pulsar
+[Pulsar Functions](functions-overview.md) | A lightweight compute option for Pulsar
 
 ## Major changes
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/reference-cli-tools.md b/site2/website/versioned_docs/version-2.1.0-incubating/reference-cli-tools.md
index 31b6a343814..4ae70b77834 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/reference-cli-tools.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/reference-cli-tools.md
@@ -7,7 +7,7 @@ original_id: reference-cli-tools
 
 Pulsar offers several command-line tools that you can use for managing Pulsar installations, performance testing, using command-line producers and consumers, and more.
 
-All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone). The following tools are currently documented:
+All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone.md). The following tools are currently documented:
 
 * [`pulsar`](#pulsar)
 * [`pulsar-client`](#pulsar-client)
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/security-athenz.md b/site2/website/versioned_docs/version-2.1.0-incubating/security-athenz.md
index f7c7e68b0fb..1f9a0bb694c 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/security-athenz.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/security-athenz.md
@@ -76,7 +76,7 @@ For more information on Pulsar client authentication using Athenz, see the follo
 
 ## Configure CLI tools for Athenz
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You’ll need to add the following authentication parameters to that file to use Athenz with Pulsar’s CLI tools:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/security-authorization.md b/site2/website/versioned_docs/version-2.1.0-incubating/security-authorization.md
index 890361fc2da..e2025ad6b27 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/security-authorization.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/security-authorization.md
@@ -29,7 +29,7 @@ superUserRoles=my-super-user-1,my-super-user-2
 > A full list of parameters available in the `conf/broker.conf` file,
 > as well as the default values for those parameters, can be found in [Broker Configuration](reference-configuration.md#broker) 
 
-Typically, superuser roles are used for administrators and clients but also for broker-to-broker authorization. When using [geo-replication](concepts-replication), every broker needs to be able to publish to all the other clusters' topics.
+Typically, superuser roles are used for administrators and clients but also for broker-to-broker authorization. When using [geo-replication](concepts-replication.md), every broker needs to be able to publish to all the other clusters' topics.
 
 ### Proxy Roles
 
@@ -60,7 +60,7 @@ superUserRoles=my-super-user-1,my-super-user-2,my-proxy-role
 
 A Pulsar [tenant](reference-terminology.md#tenant) is typically provisioned by Pulsar [instance](reference-terminology.md#instance) administrators or by some kind of self-service portal.
 
-Tenants are managed using the [`pulsar-admin`](reference-pulsar-admin) tool. Here's an example tenant creation command:
+Tenants are managed using the [`pulsar-admin`](reference-pulsar-admin.md) tool. Here's an example tenant creation command:
 
 ```shell
 
@@ -84,7 +84,7 @@ persistent://tenant/namespace/topic
 
 ### Managing permissions
 
-You can use [Pulsar Admin Tools](admin-api-permissions) for managing permission in Pulsar.
+You can use [Pulsar Admin Tools](admin-api-permissions.md) for managing permission in Pulsar.
 
 ### Pulsar admin authentication
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/security-extending.md b/site2/website/versioned_docs/version-2.1.0-incubating/security-extending.md
index 9fcbc4f4ceb..0c30105616e 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/security-extending.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/security-extending.md
@@ -10,7 +10,7 @@ Pulsar provides a way to use custom authentication and authorization mechanisms
 ## Authentication
 
 Pulsar support mutual TLS and Athenz authentication plugins, and these can be used as described
-in [Security](security-overview).
+in [Security](security-overview.md).
 
 It is possible to use a custom authentication mechanism by providing the implementation in the
 form of two plugins one for the Client library and the other for the Pulsar Broker to validate
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/security-overview.md b/site2/website/versioned_docs/version-2.1.0-incubating/security-overview.md
index 62d51c45c0b..6507a937339 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/security-overview.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/security-overview.md
@@ -22,7 +22,7 @@ In Pulsar, a *role* is a string, like `admin` or `app1`, that can represent a si
 to produce or consume from certain topics, administer the configuration for tenants, and more.
 
 Apache Pulsar uses a [Authentication Provider](#authentication-providers) to establish the identity of a client and then assign that client a *role token*. This
-role token is then used for [Authorization and ACLs](security-authorization) to determine what the client is authorized to do.
+role token is then used for [Authorization and ACLs](security-authorization.md) to determine what the client is authorized to do.
 
 ## Authentication Providers
 
@@ -33,7 +33,7 @@ Currently Pulsar supports two authentication providers:
 
 ## Contents
 
-- [Encryption](security-tls-transport.md) and [Authentication](security-tls-authentication) using TLS
+- [Encryption](security-tls-transport.md) and [Authentication](security-tls-authentication.md) using TLS
 - [Authentication using Athenz](security-athenz.md)
 - [Authorization and ACLs](security-authorization.md)
 - [End-to-End Encryption](security-encryption.md)
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/security-tls-authentication.md b/site2/website/versioned_docs/version-2.1.0-incubating/security-tls-authentication.md
index 3a4fdd7fb1a..5d2f8dcf5a4 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/security-tls-authentication.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/security-tls-authentication.md
@@ -7,7 +7,7 @@ original_id: security-tls-authentication
 
 ## TLS Authentication Overview
 
-TLS authentication is an extension of [TLS transport encryption](security-tls-transport), but instead of only servers having keys and certs which the client uses the verify the server's identity, clients also have keys and certs which the server uses to verify the client's identity. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
+TLS authentication is an extension of [TLS transport encryption](security-tls-transport.md), but instead of only servers having keys and certs which the client uses the verify the server's identity, clients also have keys and certs which the server uses to verify the client's identity. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
 
 ### Creating client certificates
 
@@ -80,7 +80,7 @@ brokerClientTrustCertsFilePath=/path/my-ca/certs/ca.cert.pem
 
 To configure proxies to authenticate clients, put the following in `proxy.conf`, alongside [the configuration to enable tls transport](security-tls-transport.md#proxy-configuration):
 
-The proxy should have its own client key pair for connecting to brokers. The role token for this key pair should be configured in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization) for more details.
+The proxy should have its own client key pair for connecting to brokers. The role token for this key pair should be configured in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization.md) for more details.
 
 ```properties
 
@@ -100,7 +100,7 @@ When TLS authentication, the client needs to connect via TLS transport, so you n
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You'll need to add the following parameters to that file to use TLS authentication with Pulsar's CLI tools:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/security-tls-transport.md b/site2/website/versioned_docs/version-2.1.0-incubating/security-tls-transport.md
index bde940cfbe3..e0851198101 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/security-tls-transport.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/security-tls-transport.md
@@ -9,7 +9,7 @@ original_id: security-tls-transport
 
 By default, Apache Pulsar clients communicate with the Apache Pulsar service in plain text, which means that all data is sent in the clear. TLS can be used to encrypt this traffic so that it cannot be snooped by a man-in-the-middle attacker.
 
-TLS can be configured for both encryption and authentication. You may configure just TLS transport encryption, which is covered in this guide. TLS authentication is covered [elsewhere](security-tls-authentication.md). Alternatively, you can use [another authentication mechanism](security-athenz) on top of TLS transport encryption.
+TLS can be configured for both encryption and authentication. You may configure just TLS transport encryption, which is covered in this guide. TLS authentication is covered [elsewhere](security-tls-authentication.md). Alternatively, you can use [another authentication mechanism](security-athenz.md) on top of TLS transport encryption.
 
 > Note that enabling TLS may have a performance impact due to encryption overhead.
 
@@ -19,7 +19,7 @@ TLS is a form of [public key cryptography](https://en.wikipedia.org/wiki/Public-
 
 To use TLS transport encryption, you need two kinds of key pairs, **server key pairs** and a **certificate authority**.
 
-A third kind of key pair, **client key pairs**, are used for [client authentication](security-tls-authentication).
+A third kind of key pair, **client key pairs**, are used for [client authentication](security-tls-authentication.md).
 
 The **certificate authority** private key should be stored in a very secure location (a fully encrypted, disconnected, air gapped computer). The certificate authority public key, the **trust cert**, can be freely shared.
 
@@ -27,7 +27,7 @@ For both client and server key pairs, the administrator first generates a privat
 
 For TLS transport encryption, the clients can use the **trust cert** to verify that the server they are talking to has a key pair that was signed by the certificate authority. A man-in-the-middle attacker would not have access to the certificate authority, so they couldn't create a server with such a key pair.
 
-For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that was signed by the certificate authority. The Common Name of the **client cert** is then used as the client's role token (see [Overview](security-overview)).
+For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that was signed by the certificate authority. The Common Name of the **client cert** is then used as the client's role token (see [Overview](security-overview.md)).
 
 ## Creating TLS Certificates
 
@@ -127,7 +127,7 @@ At this point, you have a cert, `broker.cert.pem`, and a key, `broker.key-pk8.pe
 
 ## Broker Configuration
 
-To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you'll need to make some changes to `broker.conf`, which is located in the `conf` directory of your [Pulsar installation](getting-started-standalone).
+To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you'll need to make some changes to `broker.conf`, which is located in the `conf` directory of your [Pulsar installation](getting-started-standalone.md).
 
 Add these values to the configuration file (substituting the appropriate certificate paths where necessary):
 
@@ -169,7 +169,7 @@ As the server certificate you generated above doesn't belong to any of the defau
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools) like [`pulsar-admin`](reference-cli-tools#pulsar-admin), [`pulsar-perf`](reference-cli-tools#pulsar-perf), and [`pulsar-client`](reference-cli-tools#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-cli-tools#pulsar-admin), [`pulsar-perf`](reference-cli-tools#pulsar-perf), and [`pulsar-client`](reference-cli-tools#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You'll need to add the following parameters to that file to use TLS transport with Pulsar's CLI tools:
 
diff --git a/site2/website/versioned_docs/version-2.1.0-incubating/standalone.md b/site2/website/versioned_docs/version-2.1.0-incubating/standalone.md
index 244f0b3ea72..73e351cf79a 100644
--- a/site2/website/versioned_docs/version-2.1.0-incubating/standalone.md
+++ b/site2/website/versioned_docs/version-2.1.0-incubating/standalone.md
@@ -8,7 +8,7 @@ original_id: standalone
 For the purposes of local development and testing, you can run Pulsar in standalone mode on your own machine. Standalone mode includes a Pulsar broker as well as the necessary ZooKeeper and BookKeeper components running inside of a single Java Virtual Machine (JVM) process.
 
 > #### Pulsar in production? 
-> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal) guide.
+> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal.md) guide.
 
 
 ## Run Pulsar Standalone Manually
@@ -113,7 +113,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you are running Pulsar in a bare metal cluster, you need to make sure `connectors` tarball is unzipped in every broker's pulsar directory
 > (or in every function-worker's pulsar directory if you are running a separate worker cluster for Pulsar functions).
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 ### Starting the cluster
@@ -162,12 +162,12 @@ If the message has been successfully published to the topic, you should see a co
 
 ## Using Pulsar clients locally
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
+Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
 
 * `http://localhost:8080`
 * `pulsar://localhost:6650`
 
-Here's an example producer for a Pulsar topic using the [Java](client-libraries-java) client:
+Here's an example producer for a Pulsar topic using the [Java](client-libraries-java.md) client:
 
 ```java
 
@@ -178,7 +178,7 @@ Producer<byte[]> producer = client.newProducer().topic("my-topic").create();
 
 ```
 
-Here's an example [Python](client-libraries-python) producer:
+Here's an example [Python](client-libraries-python.md) producer:
 
 ```python
 
@@ -189,7 +189,7 @@ producer = client.create_producer('my-topic')
 
 ```
 
-Finally, here's an example [C++](client-libraries-cpp) producer:
+Finally, here's an example [C++](client-libraries-cpp.md) producer:
 
 ```cpp
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-clusters.md b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-clusters.md
index 04db2f60759..1255ad25d7a 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-clusters.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-clusters.md
@@ -88,7 +88,7 @@ When provision a new cluster, you need to initialize that cluster's [metadata](c
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers) that will belong to the cluster.
+You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers.md) that will belong to the cluster.
 
 > **No cluster metadata initialization through the REST API or the Java admin API**
 >
@@ -112,11 +112,11 @@ bin/pulsar initialize-cluster-metadata \
 
 ```
 
-You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication) in your instance.
+You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication.md) in your instance.
 
 ### Get configuration
 
-You can fetch the [configuration](reference-configuration) for an existing cluster at any time.
+You can fetch the [configuration](reference-configuration.md) for an existing cluster at any time.
 
 ````mdx-code-block
 <Tabs 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-namespaces.md b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-namespaces.md
index e4e099489db..989802f34be 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-namespaces.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-namespaces.md
@@ -1354,7 +1354,7 @@ admin.namespaces().removeDeduplicationSnapshotInterval(namespace)
 
 ### Namespace isolation
 
-You can use the [Pulsar isolation policy](administration-isolation) to allocate resources (broker and bookie) for a namespace. 
+You can use the [Pulsar isolation policy](administration-isolation.md) to allocate resources (broker and bookie) for a namespace. 
 
 ### Unload namespaces from a broker
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-non-persistent-topics.md b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-non-persistent-topics.md
index 78dac355894..2c645e507ca 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-non-persistent-topics.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-non-persistent-topics.md
@@ -4,4 +4,4 @@ title: Managing non-persistent topics
 sidebar_label: "Non-Persistent topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-partitioned-topics.md b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-partitioned-topics.md
index 7221b3d14e0..da99c440302 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-partitioned-topics.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-partitioned-topics.md
@@ -4,4 +4,4 @@ title: Managing partitioned topics
 sidebar_label: "Partitioned topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-persistent-topics.md b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-persistent-topics.md
index 8a7abaea373..206304005da 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-persistent-topics.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-persistent-topics.md
@@ -4,4 +4,4 @@ title: Managing persistent topics
 sidebar_label: "Persistent topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-tenants.md b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-tenants.md
index 8071b3261c6..fd2ccd0fe00 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-tenants.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/admin-api-tenants.md
@@ -20,7 +20,7 @@ import TabItem from '@theme/TabItem';
 > 
 > - For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](https://pulsar.apache.org/api/admin/).
 
-Tenants, like namespaces, can be managed using the [admin API](admin-api-overview). There are currently two configurable aspects of tenants:
+Tenants, like namespaces, can be managed using the [admin API](admin-api-overview.md). There are currently two configurable aspects of tenants:
 
 * Admin roles
 * Allowed clusters
@@ -121,7 +121,7 @@ admin.tenants().createTenant(tenantName, tenantInfo);
 
 ### Get configuration
 
-You can fetch the [configuration](reference-configuration) for an existing tenant at any time.
+You can fetch the [configuration](reference-configuration.md) for an existing tenant at any time.
 
 ````mdx-code-block
 <Tabs 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/administration-dashboard.md b/site2/website/versioned_docs/version-2.1.1-incubating/administration-dashboard.md
index 1eb0404dfe0..92bd7e17869 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/administration-dashboard.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/administration-dashboard.md
@@ -7,7 +7,7 @@ original_id: administration-dashboard
 
 :::note
 
-Pulsar dashboard is deprecated. We recommend you use [Pulsar Manager](administration-pulsar-manager) to manage and monitor the stats of your topics. 
+Pulsar dashboard is deprecated. We recommend you use [Pulsar Manager](administration-pulsar-manager.md) to manage and monitor the stats of your topics. 
 
 :::
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/administration-geo.md b/site2/website/versioned_docs/version-2.1.1-incubating/administration-geo.md
index 78f72e1832e..766840cf73f 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/administration-geo.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/administration-geo.md
@@ -71,7 +71,7 @@ $ bin/pulsar-admin clusters create \
    :::tip
 
    - If you want to use a secure connection for a cluster, you can use the flags `--broker-url-secure` and `--url-secure`. For more information, see [pulsar-admin clusters create](https://pulsar.apache.org/tools/pulsar-admin/).
-   - Different clusters may have different authentications. You can use the authentication flag `--auth-plugin` and `--auth-parameters` together to set cluster authentication, which overrides `brokerClientAuthenticationPlugin` and `brokerClientAuthenticationParameters` if `authenticationEnabled` sets to `true` in `broker.conf` and `standalone.conf`. For more information, see [authentication and authorization](concepts-authentication).
+   - Different clusters may have different authentications. You can use the authentication flag `--auth-plugin` and `--auth-parameters` together to set cluster authentication, which overrides `brokerClientAuthenticationPlugin` and `brokerClientAuthenticationParameters` if `authenticationEnabled` sets to `true` in `broker.conf` and `standalone.conf`. For more information, see [authentication and authorization](concepts-authentication.md).
 
    :::
 
@@ -135,7 +135,7 @@ $ bin/pulsar-admin namespaces set-clusters my-tenant/my-namespace \
 
 By default, messages are replicated to all clusters configured for the namespace. You can restrict replication selectively by specifying a replication list for a message, and then that message is replicated only to the subset in the replication list.
 
-The following is an example for the [Java API](client-libraries-java). Note the use of the `setReplicationClusters` method when you construct the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
+The following is an example for the [Java API](client-libraries-java.md). Note the use of the `setReplicationClusters` method when you construct the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
 
 ```java
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/administration-proxy.md b/site2/website/versioned_docs/version-2.1.1-incubating/administration-proxy.md
index fca588ab094..78ffb3ff6c1 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/administration-proxy.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/administration-proxy.md
@@ -9,7 +9,7 @@ The [Pulsar proxy](concepts-architecture-overview.md#pulsar-proxy) is an optiona
 
 ## Running the proxy
 
-In order to run the Pulsar proxy, you need to have both a local [ZooKeeper](https://zookeeper.apache.org) and configuration store quorum set up for use by your Pulsar cluster. For instructions, see [this document](deploy-bare-metal). Once you have ZooKeeper set up and have connection strings for both ZooKeeper quorums, you can use the [`proxy`](reference-cli-tools.md#pulsar-proxy) command of the [`pulsar`](reference-cli-tools.md#pulsar) CLI tool to start up the proxy (preferably on its o [...]
+In order to run the Pulsar proxy, you need to have both a local [ZooKeeper](https://zookeeper.apache.org) and configuration store quorum set up for use by your Pulsar cluster. For instructions, see [this document](deploy-bare-metal.md). Once you have ZooKeeper set up and have connection strings for both ZooKeeper quorums, you can use the [`proxy`](reference-cli-tools.md#pulsar-proxy) command of the [`pulsar`](reference-cli-tools.md#pulsar) CLI tool to start up the proxy (preferably on it [...]
 
 To start the proxy:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/administration-zk-bk.md b/site2/website/versioned_docs/version-2.1.1-incubating/administration-zk-bk.md
index b9cfb39ad03..505a3b5b516 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/administration-zk-bk.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/administration-zk-bk.md
@@ -166,7 +166,7 @@ To enable batching operations, set the [`metadataStoreBatchingEnabled`](referenc
 
 BookKeeper stores all durable messages in Pulsar. BookKeeper is a distributed [write-ahead log](https://en.wikipedia.org/wiki/Write-ahead_logging) WAL system that guarantees read consistency of independent message logs calls ledgers. Individual BookKeeper servers are also called *bookies*.
 
-> To manage message persistence, retention, and expiry in Pulsar, refer to [cookbook](cookbooks-retention-expiry).
+> To manage message persistence, retention, and expiry in Pulsar, refer to [cookbook](cookbooks-retention-expiry.md).
 
 ### Hardware requirements
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-go.md b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-go.md
index 33059163f4c..d3c2fa5d2fc 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-go.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-go.md
@@ -55,7 +55,7 @@ $ ./test_example
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 Pulsar protocol URLs are assigned to specific clusters, use the `pulsar` scheme and have a default port of 6650. Here's an example for `localhost`:
 
@@ -81,7 +81,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you're using [TLS](security-tls-authentication) authentication, the URL will look like something like this:
+If you're using [TLS](security-tls-authentication.md) authentication, the URL will look like something like this:
 
 ```http
 
@@ -1022,7 +1022,7 @@ Parameter | Description
 
 ## TLS encryption and authentication
 
-In order to use [TLS encryption](security-tls-transport), you'll need to configure your client to do so:
+In order to use [TLS encryption](security-tls-transport.md), you'll need to configure your client to do so:
 
  * Use `pulsar+ssl` URL type
  * Set `TLSTrustCertsFilePath` to the path to the TLS certs used by your client and the Pulsar broker
@@ -1042,7 +1042,7 @@ opts := pulsar.ClientOptions{
 
 ## OAuth2 authentication
 
-To use [OAuth2 authentication](security-oauth2), you'll need to configure your client to perform the following operations.
+To use [OAuth2 authentication](security-oauth2.md), you'll need to configure your client to perform the following operations.
 This example shows how to configure OAuth2 authentication.
 
 ```go
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-java.md b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-java.md
index 2c349dbf12f..1058b0896fa 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-java.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-java.md
@@ -10,7 +10,7 @@ import TabItem from '@theme/TabItem';
 ````
 
 
-You can use a Pulsar Java client to create the Java [producer](#producer), [consumer](#consumer), [reader](#reader) and [TableView](#tableview) of messages and to perform [administrative tasks](admin-api-overview). The current Java client version is **@pulsar:version@**.
+You can use a Pulsar Java client to create the Java [producer](#producer), [consumer](#consumer), [reader](#reader) and [TableView](#tableview) of messages and to perform [administrative tasks](admin-api-overview.md). The current Java client version is **@pulsar:version@**.
 
 All the methods in [producer](#producer), [consumer](#consumer), [reader](#reader) and [TableView](#tableview) of a Java client are thread-safe.
 
@@ -19,10 +19,10 @@ Javadoc for the Pulsar client is divided into two domains by package as follows.
 Package | Description | Maven Artifact
 :-------|:------------|:--------------
 [`org.apache.pulsar.client.api`](/api/client) | [The producer and consumer API](https://pulsar.apache.org/api/client/) | [org.apache.pulsar:pulsar-client:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client%7C@pulsar:version@%7Cjar)
-[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
+[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview.md) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
 `org.apache.pulsar.client.all` |Include both `pulsar-client` and `pulsar-client-admin`<br /> Both `pulsar-client` and `pulsar-client-admin` are shaded packages and they shade dependencies independently. Consequently, the applications using both `pulsar-client` and `pulsar-client-admin` have redundant shaded classes. It would be troublesome if you introduce new dependencies but forget to update shading rules. <br /> In this case, you can use `pulsar-client-all`, which shades dependencies  [...]
 
-This document focuses only on the client API for producing and consuming messages on Pulsar topics. For how to use the Java admin client, see [Pulsar admin interface](admin-api-overview).
+This document focuses only on the client API for producing and consuming messages on Pulsar topics. For how to use the Java admin client, see [Pulsar admin interface](admin-api-overview.md).
 
 ## Installation
 
@@ -69,7 +69,7 @@ dependencies {
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 You can assign Pulsar protocol URLs to specific clusters and use the `pulsar` scheme. The default port is `6650`. The following is an example of `localhost`.
 
@@ -95,7 +95,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you use [TLS](security-tls-authentication) authentication, the URL is as follows. 
+If you use [TLS](security-tls-authentication.md) authentication, the URL is as follows. 
 
 ```http
 
@@ -126,7 +126,7 @@ PulsarClient client = PulsarClient.builder()
 ```
 
 > ### Default broker URLs for standalone clusters
-> If you run a cluster in [standalone mode](getting-started-standalone), the broker is available at the `pulsar://localhost:6650` URL by default.
+> If you run a cluster in [standalone mode](getting-started-standalone.md), the broker is available at the `pulsar://localhost:6650` URL by default.
 
 If you create a client, you can use the `loadConf` configuration. The following parameters are available in `loadConf`.
 
@@ -279,7 +279,7 @@ Currently, cluster-level failover can perform probes to prevent data loss, but i
 
 > #### What are the relationships between cluster-level failover and geo-replication?
 
-The cluster-level failover is an extension of [geo-replication](concepts-replication) to improve stability and robustness. The cluster-level failover depends on geo-replication, and they have some **differences** as below.
+The cluster-level failover is an extension of [geo-replication](concepts-replication.md) to improve stability and robustness. The cluster-level failover depends on geo-replication, and they have some **differences** as below.
 
 Influence |Cluster-level failover|Geo-replication
 |---|---|---
@@ -576,7 +576,7 @@ Producer<byte[]> producer = client.newProducer()
 
 ### Message routing
 
-When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more information on specifying a routing mode using the Java client, see the [Partitioned Topics cookbook](cookbooks-partitioned).
+When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more information on specifying a routing mode using the Java client, see the [Partitioned Topics cookbook](cookbooks-partitioned.md).
 
 ### Async send
 
@@ -1370,7 +1370,7 @@ tv.forEach((key, value) -> /*operations on all existing messages*/)
 
 ## Schema
 
-In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](schema-get-started) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types). If you construct, say, a [producer](#producer) without specifying a schema, then the producer can only produce messages of type `byte[]`. The following is an example.
+In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](schema-get-started.md) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types.md). If you construct, say, a [producer](#producer) without specifying a schema, then the producer can only produce messages of type `byte[]`. The following is an example.
 
 ```java
 
@@ -1488,7 +1488,7 @@ For example of ProtobufNativeSchema, see [`SchemaDefinition` in `Complex type`](
 
 ## Authentication
 
-Pulsar currently supports three authentication schemes: [TLS](security-tls-authentication.md), [Athenz](security-athenz.md), and [Oauth2](security-oauth2). You can use the Pulsar Java client with all of them.
+Pulsar currently supports three authentication schemes: [TLS](security-tls-authentication.md), [Athenz](security-athenz.md), and [Oauth2](security-oauth2.md). You can use the Pulsar Java client with all of them.
 
 ### TLS Authentication
 
@@ -1515,7 +1515,7 @@ PulsarClient client = PulsarClient.builder()
 
 ### Athenz
 
-To use [Athenz](security-athenz) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
+To use [Athenz](security-athenz.md) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
 
 * `tenantDomain`
 * `tenantService`
@@ -1552,7 +1552,7 @@ PulsarClient client = PulsarClient.builder()
 
 ### Oauth2
 
-The following example shows how to use [Oauth2](security-oauth2) as an authentication provider for the Pulsar Java client.
+The following example shows how to use [Oauth2](security-oauth2.md) as an authentication provider for the Pulsar Java client.
 
 You can use the factory method to configure authentication for Pulsar Java client.
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-python.md b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-python.md
index 27584d502a7..425aa0827d0 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-python.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-python.md
@@ -5,7 +5,7 @@ sidebar_label: "Python"
 original_id: client-libraries-python
 ---
 
-The Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp) and exposes all of the [same features](/api/cpp). You can find the code in the [`python` subdirectory](https://github.com/apache/incubator-pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
+The Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp.md) and exposes all of the [same features](/api/cpp). You can find the code in the [`python` subdirectory](https://github.com/apache/incubator-pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
 
 ## Installation
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-websocket.md b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-websocket.md
index a6e60361749..0b31ffe7816 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-websocket.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries-websocket.md
@@ -4,14 +4,14 @@ title: Pulsar WebSocket API
 sidebar_label: "WebSocket"
 ---
 
-Pulsar [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API provides a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients). Through WebSocket, you can publish and consume messages and use features available on the [Client Features Matrix](https://github.com/apache/pulsar/wiki/Client-Features-Matrix) page.
+Pulsar [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API provides a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients.md). Through WebSocket, you can publish and consume messages and use features available on the [Client Features Matrix](https://github.com/apache/pulsar/wiki/Client-Features-Matrix) page.
 
 
 > You can use Pulsar WebSocket API with any WebSocket client library. See examples for Python and Node.js [below](#client-examples).
 
 ## Running the WebSocket service
 
-The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone) already has the WebSocket service enabled.
+The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone.md) already has the WebSocket service enabled.
 
 In non-standalone mode, there are two ways to deploy the WebSocket service:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries.md b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries.md
index f6b76ab065f..8ebc0da7138 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/client-libraries.md
@@ -14,29 +14,29 @@ Pulsar currently has client libraries available for following languages:
 
 ## Java client
 
-For a tutorial on using the Pulsar Java client to produce and consume messages, see [The Pulsar Java client](client-libraries-java).
+For a tutorial on using the Pulsar Java client to produce and consume messages, see [The Pulsar Java client](client-libraries-java.md).
 
 There are also two independent sets of Javadoc API docs available:
 
 Library | Purpose
 :-------|:-------
-[`org.apache.pulsar.client.api`](/api/client) | The [Pulsar Java client](client-libraries-java) for producing and consuming messages on Pulsar topics [`org.apache.pulsar.client.admin`](/api/admin) | The Java client for the [Pulsar admin interface](admin-api-overview.md)
+[`org.apache.pulsar.client.api`](/api/client) | The [Pulsar Java client](client-libraries-java.md) for producing and consuming messages on Pulsar topics [`org.apache.pulsar.client.admin`](/api/admin) | The Java client for the [Pulsar admin interface](admin-api-overview.md)
 
 
 ## Go client
 
-For a tutorial on using the Pulsar Go client, see [The Pulsar Go client](client-libraries-go).
+For a tutorial on using the Pulsar Go client, see [The Pulsar Go client](client-libraries-go.md).
 
 
 ## Python client
 
-For a tutorial on using the Pulsar Python client, see [The Pulsar Python client](client-libraries-python).
+For a tutorial on using the Pulsar Python client, see [The Pulsar Python client](client-libraries-python.md).
 
 There are also [pdoc](https://github.com/BurntSushi/pdoc)-generated API docs for the Python client [here](/api/python).
 
 ## C++ client
 
-For a tutorial on using the Pulsar C++ clent, see [The Pulsar C++ client](client-libraries-cpp).
+For a tutorial on using the Pulsar C++ clent, see [The Pulsar C++ client](client-libraries-cpp.md).
 
 There are also [Doxygen](http://www.stack.nl/~dimitri/doxygen/)-generated API docs for the C++ client [here](/api/cpp).
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-architecture-overview.md b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-architecture-overview.md
index 0d96b59f8ae..1ce346fc169 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-architecture-overview.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-architecture-overview.md
@@ -4,7 +4,7 @@ title: Architecture Overview
 sidebar_label: "Architecture"
 ---
 
-At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication) data amongst themselves.
+At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication.md) data amongst themselves.
 
 In a Pulsar cluster:
 
@@ -16,20 +16,20 @@ The diagram below provides an illustration of a Pulsar cluster:
 
 ![Pulsar architecture diagram](/assets/pulsar-system-architecture.png)
 
-At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication).
+At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication.md).
 
 ## Brokers
 
 The Pulsar message broker is a stateless component that's primarily responsible for running two other components:
 
 * An HTTP server that exposes a {@inject: rest:REST:/} API for both administrative tasks and [topic lookup](concepts-clients.md#client-setup-phase) for producers and consumers. The producers connect to the brokers to publish messages and the consumers connect to the brokers to consume the messages.
-* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol) used for all data transfers
+* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol.md) used for all data transfers
 
 Messages are typically dispatched out of a [managed ledger](#managed-ledgers) cache for the sake of performance, *unless* the backlog exceeds the cache size. If the backlog grows too large for the cache, the broker will start reading entries from BookKeeper.
 
-Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java).
+Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java.md).
 
-> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers) guide.
+> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers.md) guide.
 
 ## Clusters
 
@@ -39,9 +39,9 @@ A Pulsar instance consists of one or more Pulsar *clusters*. Clusters, in turn,
 * A ZooKeeper quorum used for cluster-level configuration and coordination
 * An ensemble of bookies used for [persistent storage](#persistent-storage) of messages
 
-Clusters can replicate amongst themselves using [geo-replication](concepts-replication).
+Clusters can replicate amongst themselves using [geo-replication](concepts-replication.md).
 
-> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters) guide.
+> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters.md) guide.
 
 ## Metadata store
 
@@ -139,17 +139,17 @@ $ bin/pulsar proxy \
 ```
 
 > #### Pulsar proxy docs
-> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy).
+> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy.md).
 
 
 Some important things to know about the Pulsar proxy:
 
 * Connecting clients don't need to provide *any* specific configuration to use the Pulsar proxy. You won't need to update the client configuration for existing applications beyond updating the IP used for the service URL (for example if you're running a load balancer over the Pulsar proxy).
-* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication) is supported by the Pulsar proxy
+* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication.md) is supported by the Pulsar proxy
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL.
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL.
 
 You can use your own service discovery system if you'd like. If you use your own system, there is just one requirement: when a client performs an HTTP request to an endpoint, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to *some* active broker in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
@@ -157,7 +157,7 @@ The diagram below illustrates Pulsar service discovery:
 
 ![alt-text](/assets/pulsar-service-discovery.png)
 
-In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python), for example, could access this Pulsar cluster like this:
+In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python.md), for example, could access this Pulsar cluster like this:
 
 ```python
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-authentication.md b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-authentication.md
index 335da8dc5a5..fbefead69f3 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-authentication.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-authentication.md
@@ -4,5 +4,5 @@ title: Authentication and Authorization
 sidebar_label: "Authentication and Authorization"
 ---
 
-Pulsar supports a pluggable [authentication](security-overview.md) mechanism which can be configured at the proxy and/or the broker. Pulsar also supports a pluggable [authorization](security-authorization) mechanism. These mechanisms work together to identify the client and its access rights on topics, namespaces and tenants.
+Pulsar supports a pluggable [authentication](security-overview.md) mechanism which can be configured at the proxy and/or the broker. Pulsar also supports a pluggable [authorization](security-authorization.md) mechanism. These mechanisms work together to identify the client and its access rights on topics, namespaces and tenants.
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-clients.md b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-clients.md
index 65201b5ce1c..c0fe61cd06e 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-clients.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-clients.md
@@ -4,12 +4,12 @@ title: Pulsar Clients
 sidebar_label: "Clients"
 ---
 
-Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md), [C++](client-libraries-cpp.md) and [C#](client-libraries-dotnet). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
+Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md), [C++](client-libraries-cpp.md) and [C#](client-libraries-dotnet.md). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
 
 Under the hood, the current official Pulsar client libraries support transparent reconnection and/or connection failover to brokers, queuing of messages until acknowledged by the broker, and heuristics such as connection retries with backoff.
 
 > **Custom client libraries**
-> If you'd like to create your own client library, we recommend consulting the documentation on Pulsar's custom [binary protocol](developing-binary-protocol).
+> If you'd like to create your own client library, we recommend consulting the documentation on Pulsar's custom [binary protocol](developing-binary-protocol.md).
 
 
 ## Client setup phase
@@ -37,7 +37,7 @@ Internally, the reader interface is implemented as a consumer using an exclusive
 
 [ **IMPORTANT** ]
 
-Unlike subscription/consumer, readers are non-durable in nature and does not prevent data in a topic from being deleted, thus it is ***strongly*** advised that [data retention](cookbooks-retention-expiry) be configured. If data retention for a topic is not configured for an adequate amount of time, messages that the reader has not yet read might be deleted .  This causes the readers to essentially skip messages. Configuring the data retention for a topic guarantees the reader with a cert [...]
+Unlike subscription/consumer, readers are non-durable in nature and does not prevent data in a topic from being deleted, thus it is ***strongly*** advised that [data retention](cookbooks-retention-expiry.md) be configured. If data retention for a topic is not configured for an adequate amount of time, messages that the reader has not yet read might be deleted .  This causes the readers to essentially skip messages. Configuring the data retention for a topic guarantees the reader with a c [...]
 
 Please also note that a reader can have a "backlog", but the metric is only used for users to know how behind the reader is. The metric is not considered for any backlog quota calculations. 
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-messaging.md b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-messaging.md
index 89b6827d73d..11b15cf814a 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-messaging.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-messaging.md
@@ -22,8 +22,8 @@ Messages are the basic "unit" of Pulsar. The following table lists the component
 
 Component | Description
 :---------|:-------
-Value / data payload | The data carried by the message. All Pulsar messages contain raw bytes, although message data can also conform to data [schemas](schema-get-started).
-Key | The key (string type) of the message. It is a short name of message key or partition key. Messages are optionally tagged with keys, which is useful for features like [topic compaction](concepts-topic-compaction).
+Value / data payload | The data carried by the message. All Pulsar messages contain raw bytes, although message data can also conform to data [schemas](schema-get-started.md).
+Key | The key (string type) of the message. It is a short name of message key or partition key. Messages are optionally tagged with keys, which is useful for features like [topic compaction](concepts-topic-compaction.md).
 Properties | An optional key/value map of user-defined properties.
 Producer name | The name of the producer who produces the message. If you do not specify a producer name, the default name is used. 
 Topic name | The name of the topic that the message is published to.
@@ -53,7 +53,7 @@ The default size of a message is 5 MB. You can configure the max size of a messa
   
   ```
 
-> For more information on Pulsar messages, see Pulsar [binary protocol](developing-binary-protocol).
+> For more information on Pulsar messages, see Pulsar [binary protocol](developing-binary-protocol.md).
 
 ## Producers
 
@@ -171,7 +171,7 @@ Messages are received from [brokers](reference-terminology.md#broker) either syn
 
 ### Listeners
 
-Client libraries provide listener implementation for consumers. For example, the [Java client](client-libraries-java) provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
+Client libraries provide listener implementation for consumers. For example, the [Java client](client-libraries-java.md) provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
 
 ### Acknowledgement
 
@@ -656,7 +656,7 @@ A [subscription](#subscriptions) can have one or more consumers. When a consumer
 
 #### When to use
 
-By default, messages of a topic without any durable subscriptions are marked as deleted. If you want to prevent the messages being marked as deleted, you can create a durable subscription for this topic. In this case, only acknowledged messages are marked as deleted. For more information, see [message retention and expiry](cookbooks-retention-expiry).
+By default, messages of a topic without any durable subscriptions are marked as deleted. If you want to prevent the messages being marked as deleted, you can create a durable subscription for this topic. In this case, only acknowledged messages are marked as deleted. For more information, see [message retention and expiry](cookbooks-retention-expiry.md).
 
 #### How to use
 
@@ -760,7 +760,7 @@ Decisions about routing and subscription modes can be made separately in most ca
 
 There is no difference between partitioned topics and normal topics in terms of how subscription types work, as partitioning only determines what happens between when a message is published by a producer and processed and acknowledged by a consumer.
 
-Partitioned topics need to be explicitly created via the [admin API](admin-api-overview). The number of partitions can be specified when creating the topic.
+Partitioned topics need to be explicitly created via the [admin API](admin-api-overview.md). The number of partitions can be specified when creating the topic.
 
 ### Routing modes
 
@@ -772,7 +772,7 @@ Mode     | Description
 :--------|:------------
 `RoundRobinPartition` | If no key is provided, the producer will publish messages across all partitions in round-robin fashion to achieve maximum throughput. Please note that round-robin is not done per individual message but rather it's set to the same boundary of batching delay, to ensure batching is effective. While if a key is specified on the message, the partitioned producer will hash the key and assign message to a particular partition. This is the default mode. 
 `SinglePartition`     | If no key is provided, the producer will randomly pick one single partition and publish all the messages into that partition. While if a key is specified on the message, the partitioned producer will hash the key and assign message to a particular partition.
-`CustomPartition`     | Use custom message router implementation that will be called to determine the partition for a particular message. User can create a custom routing mode by using the [Java client](client-libraries-java) and implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
+`CustomPartition`     | Use custom message router implementation that will be called to determine the partition for a particular message. User can create a custom routing mode by using the [Java client](client-libraries-java.md) and implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
 
 ### Ordering guarantee
 
@@ -810,7 +810,7 @@ non-persistent://tenant/namespace/topic
 
 ```
 
-> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent).
+> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent.md).
 
 In non-persistent topics, brokers immediately deliver messages to all connected subscribers *without persisting them* in [BookKeeper](concepts-architecture-overview.md#persistent-storage). If a subscriber is disconnected, the broker will not be able to deliver those in-transit messages, and subscribers will never be able to receive those messages again. Eliminating the persistent storage step makes messaging on non-persistent topics slightly faster than on persistent topics in some cases [...]
 
@@ -881,7 +881,7 @@ Pulsar has two features, however, that enable you to override this default behav
 * Message **retention** enables you to store messages that have been acknowledged by a consumer
 * Message **expiry** enables you to set a time to live (TTL) for messages that have not yet been acknowledged
 
-> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry) cookbook.
+> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry.md) cookbook.
 
 The diagram below illustrates both concepts:
 
@@ -904,12 +904,12 @@ Message deduplication is disabled in the scenario shown at the top. Here, a prod
 
 In the second scenario at the bottom, the producer publishes message 1, which is received by the broker and persisted, as in the first scenario. When the producer attempts to publish the message again, however, the broker knows that it has already seen message 1 and thus does not persist the message.
 
-> Message deduplication is handled at the namespace level or the topic level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication).
+> Message deduplication is handled at the namespace level or the topic level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication.md).
 
 
 ### Producer idempotency
 
-The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, so you do not need to modify your Pulsar client code. Instead, you only need to make administrative changes. For details, see [Managing m [...]
+The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, so you do not need to modify your Pulsar client code. Instead, you only need to make administrative changes. For details, see [Managing m [...]
 
 ### Deduplication and effectively-once semantics
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-multi-tenancy.md b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-multi-tenancy.md
index 8a17e72a4c8..26bd6a2fd18 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-multi-tenancy.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-multi-tenancy.md
@@ -4,7 +4,7 @@ title: Multi Tenancy
 sidebar_label: "Multi Tenancy"
 ---
 
-Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
+Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview.md) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
 
 The multi-tenant nature of Pulsar is reflected mostly visibly in topic URLs, which have this structure:
 
@@ -20,7 +20,7 @@ As you can see, the tenant is the most basic unit of categorization for topics (
 
 To each tenant in a Pulsar instance you can assign:
 
-* An [authorization](security-authorization) scheme
+* An [authorization](security-authorization.md) scheme
 * The set of [clusters](reference-terminology.md#cluster) to which the tenant's configuration applies
 
 ## Namespaces
@@ -28,7 +28,7 @@ To each tenant in a Pulsar instance you can assign:
 Tenants and namespaces are two key concepts of Pulsar to support multi-tenancy.
 
 * Pulsar is provisioned for specified tenants with appropriate capacity allocated to the tenant.
-* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
+* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
 
 Names for topics in the same namespace will look like this:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-overview.md b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-overview.md
index 119d46508ed..bf4993a3110 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-overview.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-overview.md
@@ -8,15 +8,15 @@ Pulsar is a multi-tenant, high-performance solution for server-to-server messagi
 
 Key features of Pulsar are listed below:
 
-* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo) of messages across clusters.
+* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo.md) of messages across clusters.
 * Very low publish and end-to-end latency.
 * Seamless scalability to over a million topics.
-* A simple [client API](concepts-clients.md) with bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp).
+* A simple [client API](concepts-clients.md) with bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp.md).
 * Multiple [subscription types](concepts-messaging.md#subscription-types) ([exclusive](concepts-messaging.md#exclusive), [shared](concepts-messaging.md#shared), and [failover](concepts-messaging.md#failover)) for topics.
 * Guaranteed message delivery with [persistent message storage](concepts-architecture-overview.md#persistent-storage) provided by [Apache BookKeeper](http://bookkeeper.apache.org/).
-* A serverless light-weight computing framework [Pulsar Functions](functions-overview) offers the capability for stream-native data processing.
-* A serverless connector framework [Pulsar IO](io-overview), which is built on Pulsar Functions, makes it easier to move data in and out of Apache Pulsar.
-* [Tiered Storage](concepts-tiered-storage) offloads data from hot/warm storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
+* A serverless light-weight computing framework [Pulsar Functions](functions-overview.md) offers the capability for stream-native data processing.
+* A serverless connector framework [Pulsar IO](io-overview.md), which is built on Pulsar Functions, makes it easier to move data in and out of Apache Pulsar.
+* [Tiered Storage](concepts-tiered-storage.md) offloads data from hot/warm storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
 
 ## Contents
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-replication.md b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-replication.md
index d4653ca7aec..9cc3a7c3415 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-replication.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-replication.md
@@ -8,7 +8,7 @@ Regardless of industries, when an unforeseen event occurs and brings day-to-day
 
 Pulsar's geo-replication mechanism is typically used for disaster recovery, enabling the replication of persistently stored message data across multiple data centers. For instance, your application is publishing data in one region and you would like to process it for consumption in other regions. With Pulsar’s geo-replication mechanism, messages can be produced and consumed in different geo-locations. 
 
-The diagram below illustrates the process of [geo-replication](administration-geo). Whenever three producers (P1, P2 and P3) respectively publish messages to the T1 topic in three clusters, those messages are instantly replicated across clusters. Once the messages are replicated, two consumers (C1 and C2) can consume those messages from their clusters.
+The diagram below illustrates the process of [geo-replication](administration-geo.md). Whenever three producers (P1, P2 and P3) respectively publish messages to the T1 topic in three clusters, those messages are instantly replicated across clusters. Once the messages are replicated, two consumers (C1 and C2) can consume those messages from their clusters.
 
 ![A typical geo-replication example with full-mesh pattern](/assets/full-mesh-replication.svg)
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-tiered-storage.md b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-tiered-storage.md
index f0bbde61718..ec031253ccd 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-tiered-storage.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-tiered-storage.md
@@ -14,4 +14,4 @@ One way to alleviate this cost is to use Tiered Storage. With tiered storage, ol
 
 Pulsar currently supports S3, Google Cloud Storage (GCS), and filesystem for [long term store](https://pulsar.apache.org/docs/en/cookbooks-tiered-storage/). Offloading to long term storage triggered via a Rest API or command line interface. The user passes in the amount of topic data they wish to retain on BookKeeper, and the broker will copy the backlog data to long term storage. The original data will then be deleted from BookKeeper after a configured delay (4 hours by default).
 
-> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage).
+> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage.md).
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-topic-compaction.md b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-topic-compaction.md
index 790ce76b7c5..300cf68956d 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/concepts-topic-compaction.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/concepts-topic-compaction.md
@@ -6,7 +6,7 @@ sidebar_label: "Topic Compaction"
 
 Pulsar was built with highly scalable [persistent storage](concepts-architecture-overview.md#persistent-storage) of message data as a primary objective. Pulsar topics enable you to persistently store as many unacknowledged messages as you need while preserving message ordering. By default, Pulsar stores *all* unacknowledged/unprocessed messages produced on a topic. Accumulating many unacknowledged messages on a topic is necessary for many Pulsar use cases but it can also be very time int [...]
 
-> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction).
+> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction.md).
 
 For some use cases consumers don't need a complete "image" of the topic log. They may only need a few values to construct a more "shallow" image of the log, perhaps even just the most recent value. For these kinds of use cases Pulsar offers **topic compaction**. When you run compaction on a topic, Pulsar goes through a topic's backlog and removes messages that are *obscured* by later messages, i.e. it goes through the topic on a per-key basis and leaves only the most recent message assoc [...]
 
@@ -23,7 +23,7 @@ Pulsar's topic compaction feature:
 
 ## How topic compaction works
 
-When topic compaction is triggered [via the CLI](cookbooks-compaction), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
+When topic compaction is triggered [via the CLI](cookbooks-compaction.md), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
 
 After that, the broker will create a new [BookKeeper ledger](concepts-architecture-overview.md#ledgers) and make a second iteration through each message on the topic. For each message, if the key matches the latest occurrence of that key, then the key's data payload, message ID, and metadata will be written to the newly created ledger. If the key doesn't match the latest then the message will be skipped and left alone. If any given message has an empty payload, it will be skipped and con [...]
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-compaction.md b/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-compaction.md
index 0720019aaa0..214e899fa08 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-compaction.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-compaction.md
@@ -44,7 +44,7 @@ Configuring the compaction threshold on a namespace will apply to all topics wit
 
 ## Triggering compaction manually
 
-In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin) CLI tool. Here's an example:
+In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. Here's an example:
 
 ```bash
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-non-persistent.md b/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-non-persistent.md
index d40c4fbd0cf..1346d19a042 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-non-persistent.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-non-persistent.md
@@ -40,7 +40,7 @@ $ bin/pulsar-client produce non-persistent://public/default/example-np-topic \
 
 ```
 
-> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-topics) guide.
+> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-topics.md) guide.
 
 ## Enabling
 
@@ -54,7 +54,7 @@ If you'd like to enable *only* non-persistent topics in a broker, you can set th
 
 ## Managing with cli
 
-Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin) non-persistent topics under a namespace, and more.
+Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin.md) non-persistent topics under a namespace, and more.
 
 ## Using with Pulsar clients
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-partitioned.md b/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-partitioned.md
index 25896934788..c857d019edc 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-partitioned.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-partitioned.md
@@ -3,4 +3,4 @@ id: cookbooks-partitioned
 title: Partitioned topics
 sidebar_label: "Partitioned Topics"
 ---
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-retention-expiry.md b/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-retention-expiry.md
index 86160c3f7ec..cd764fad6eb 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-retention-expiry.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/cookbooks-retention-expiry.md
@@ -21,7 +21,7 @@ In Pulsar, you can modify this behavior, with namespace granularity, in two ways
 * You can persistently store messages that are not within a backlog (because they've been acknowledged by on every existing subscription, or because there are no subscriptions) by setting [retention policies](#retention-policies).
 * Messages that are not acknowledged within a specified timeframe can be automatically acknowledged, by specifying the [time to live](#time-to-live-ttl) (TTL).
 
-Pulsar's [admin interface](admin-api-overview) enables you to manage both retention policies and TTL with namespace granularity (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
+Pulsar's [admin interface](admin-api-overview.md) enables you to manage both retention policies and TTL with namespace granularity (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
 
 
 > #### Retention and TTL solve two different problems
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-aws.md b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-aws.md
index 5db846fe790..60ac4c22d76 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-aws.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-aws.md
@@ -4,7 +4,7 @@ title: Deploying a Pulsar cluster on AWS using Terraform and Ansible
 sidebar_label: "Amazon Web Services"
 ---
 
-> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster).
+> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster.md).
 
 One of the easiest ways to get a Pulsar [cluster](reference-terminology.md#cluster) running on [Amazon Web Services](https://aws.amazon.com/) (AWS) is to use the [Terraform](https://terraform.io) infrastructure provisioning tool and the [Ansible](https://www.ansible.com) server automation tool. Terraform can create the resources necessary for running the Pulsar cluster---[EC2](https://aws.amazon.com/ec2/) instances, networking and security infrastructure, etc.---While Ansible can install [...]
 
@@ -209,7 +209,7 @@ Remember to enter this command just only once. If you attempt to enter this comm
 
 Once you have created the necessary AWS resources using Terraform, you can install and run Pulsar on the Terraform-created EC2 instances using Ansible. 
 
-(Optional) If you want to use any [built-in IO connectors](io-connectors), edit the `Download Pulsar IO packages` task in the `deploy-pulsar.yaml` file and uncomment the connectors you want to use. 
+(Optional) If you want to use any [built-in IO connectors](io-connectors.md), edit the `Download Pulsar IO packages` task in the `deploy-pulsar.yaml` file and uncomment the connectors you want to use. 
 
 To run the playbook, enter this command:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-bare-metal-multi-cluster.md b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-bare-metal-multi-cluster.md
index 70dff45080b..8a765d8843f 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-bare-metal-multi-cluster.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-bare-metal-multi-cluster.md
@@ -6,13 +6,13 @@ sidebar_label: "Bare metal multi-cluster"
 
 :::tip
 
-1. You can use single-cluster Pulsar installation in most use cases, such as experimenting with Pulsar or using Pulsar in a startup or in a single team. If you need to run a multi-cluster Pulsar instance, see the [guide](deploy-bare-metal-multi-cluster).
-2. If you want to use all built-in [Pulsar IO](io-overview.md) connectors, you need to download `apache-pulsar-io-connectors`package and install `apache-pulsar-io-connectors` under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
-3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`package and install `apache-pulsar-offloaders` under `offloaders` directory in the Pulsar directory on every broker node. For more details of how to configure this feature, you can refer to the [Tiered storage cookbook](cookbooks-tiered-storage).
+1. You can use single-cluster Pulsar installation in most use cases, such as experimenting with Pulsar or using Pulsar in a startup or in a single team. If you need to run a multi-cluster Pulsar instance, see the [guide](deploy-bare-metal-multi-cluster.md).
+2. If you want to use all built-in [Pulsar IO](io-overview.md) connectors, you need to download `apache-pulsar-io-connectors`package and install `apache-pulsar-io-connectors` under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
+3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`package and install `apache-pulsar-offloaders` under `offloaders` directory in the Pulsar directory on every broker node. For more details of how to configure this feature, you can refer to the [Tiered storage cookbook](cookbooks-tiered-storage.md).
 
 :::
 
-A Pulsar instance consists of multiple Pulsar clusters working in unison. You can distribute clusters across data centers or geographical regions and replicate the clusters amongst themselves using [geo-replication](administration-geo).Deploying a  multi-cluster Pulsar instance consists of the following steps:
+A Pulsar instance consists of multiple Pulsar clusters working in unison. You can distribute clusters across data centers or geographical regions and replicate the clusters amongst themselves using [geo-replication](administration-geo.md).Deploying a  multi-cluster Pulsar instance consists of the following steps:
 
 1. Deploying two separate ZooKeeper quorums: a local quorum for each cluster in the instance and a configuration store quorum for instance-wide tasks
 2. Initializing cluster metadata for each cluster
@@ -21,7 +21,7 @@ A Pulsar instance consists of multiple Pulsar clusters working in unison. You ca
 
 
 > #### Run Pulsar locally or on Kubernetes?
-> This guide shows you how to deploy Pulsar in production in a non-Kubernetes environment. If you want to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you want to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes) guide, which includes sections on running Pulsar on Kubernetes, on Google Kubernetes Engine and on Amazon Web Services.
+> This guide shows you how to deploy Pulsar in production in a non-Kubernetes environment. If you want to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you want to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes.md) guide, which includes sections on running Pulsar on Kubernetes, on Google Kubernetes Engine and on Amazon Web Services.
 
 ## System requirement
 
@@ -65,7 +65,7 @@ The Pulsar binary package initially contains the following directories:
 
 Directory | Contains
 :---------|:--------
-`bin` | [Command-line tools](reference-cli-tools) of Pulsar, such as [`pulsar`](reference-cli-tools.md#pulsar) and [`pulsar-admin`](https://pulsar.apache.org/tools/pulsar-admin/)
+`bin` | [Command-line tools](reference-cli-tools.md) of Pulsar, such as [`pulsar`](reference-cli-tools.md#pulsar) and [`pulsar-admin`](https://pulsar.apache.org/tools/pulsar-admin/)
 `conf` | Configuration files for Pulsar, including for [broker configuration](reference-configuration.md#broker), [ZooKeeper configuration](reference-configuration.md#zookeeper), and more
 `examples` | A Java JAR file containing example [Pulsar Functions](functions-overview.md)
 `lib` | The [JAR](https://en.wikipedia.org/wiki/JAR_(file_format)) files that Pulsar uses 
@@ -244,7 +244,7 @@ As you can see from the example above, you need to specify the following:
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-If you use [TLS](security-tls-transport), you also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
+If you use [TLS](security-tls-transport.md), you also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
 
 Make sure to run `initialize-cluster-metadata` for each cluster in your instance.
 
@@ -363,16 +363,16 @@ $ bin/pulsar broker
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to communicate with an entire Pulsar instance using a single URL.
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to communicate with an entire Pulsar instance using a single URL.
 
-You can use your own service discovery system. If you use your own system, you only need to satisfy just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to some active brokers in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
+You can use your own service discovery system. If you use your own system, you only need to satisfy just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration.md) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to some active brokers in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
 > **Service discovery already provided by many scheduling systems**
-> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes), have service discovery systems built in. If you run Pulsar on such a system, you may not need to provide your own service discovery mechanism.
+> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes.md), have service discovery systems built in. If you run Pulsar on such a system, you may not need to provide your own service discovery mechanism.
 
 ## Admin client and verification
 
-At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
+At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview.md) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
 
 The most important thing is that you point the [`serviceUrl`](reference-configuration.md#client-serviceUrl) parameter to the correct service URL for the cluster:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-bare-metal.md b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-bare-metal.md
index c3dc7b9a377..7bc83e01769 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-bare-metal.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-bare-metal.md
@@ -9,10 +9,10 @@ original_id: deploy-bare-metal
 
 1. Single-cluster Pulsar installations should be sufficient for all but the most ambitious use cases. If you're interested in experimenting with
 Pulsar or using it in a startup or on a single team, we recommend opting for a single cluster. If you do need to run a multi-cluster Pulsar instance,
-however, see the guide [here](deploy-bare-metal-multi-cluster).
-2. If you want to use all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
+however, see the guide [here](deploy-bare-metal-multi-cluster.md).
+2. If you want to use all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
 package and make sure it is installed under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you
-have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
+have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
 
 :::
 
@@ -211,9 +211,9 @@ Flag | Description
 `--zookeeper` | A "local" ZooKeeper connection string for the cluster. This connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--configuration-store` | The configuration store connection string for the entire instance. As with the `--zookeeper` flag, this connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--web-service-url` | The web service URL for the cluster, plus a port. This URL should be a standard DNS name. The default port is 8080 (we don't recommend using a different port).
-`--web-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
+`--web-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
 `--broker-service-url` | A broker service URL enabling interaction with the brokers in the cluster. This URL should use the same DNS name as the web service URL but should use the `pulsar` scheme instead. The default port is 6650 (we don't recommend using a different port).
-`--broker-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
+`--broker-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
 
 ## Deploying a BookKeeper cluster
 
@@ -294,7 +294,7 @@ clusterName=pulsar-cluster-1
 
 ### Enabling Pulsar Functions (optional)
 
-If you want to enable [Pulsar Functions](functions-overview), you can follow the instructions as below:
+If you want to enable [Pulsar Functions](functions-overview.md), you can follow the instructions as below:
 
 1. Edit `conf/broker.conf` to enable function worker, by setting `functionsWorkerEnabled` to `true`.
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-kubernetes.md b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-kubernetes.md
index 4e170dcd471..7455247c901 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-kubernetes.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-kubernetes.md
@@ -5,6 +5,6 @@ sidebar_label: "Kubernetes"
 ---
 
 To get up and running with these charts as fast as possible, in a **non-production** use case, we provide
-a [quick start guide](getting-started-helm) for Proof of Concept (PoC) deployments.
+a [quick start guide](getting-started-helm.md) for Proof of Concept (PoC) deployments.
 
-To configure and install a Pulsar cluster on Kubernetes for production usage, follow the complete [Installation Guide](helm-install).
\ No newline at end of file
+To configure and install a Pulsar cluster on Kubernetes for production usage, follow the complete [Installation Guide](helm-install.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-monitoring.md b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-monitoring.md
index adf3587b7ae..d581fe2edfa 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/deploy-monitoring.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/deploy-monitoring.md
@@ -112,7 +112,7 @@ http://$FUNCTIONS_WORKER_ADDRESS:$WORKER_PORT/metrics:
 
 You can use Prometheus to collect all the metrics exposed for Pulsar components and set up [Grafana](https://grafana.com/) dashboards to display the metrics and monitor your Pulsar cluster. For details, refer to [Prometheus guide](https://prometheus.io/docs/introduction/getting_started/).
 
-When you run Pulsar on bare metal, you can provide the list of nodes to be probed. When you deploy Pulsar in a Kubernetes cluster, the monitoring is setup automatically. For details, refer to [Kubernetes instructions](helm-deploy). 
+When you run Pulsar on bare metal, you can provide the list of nodes to be probed. When you deploy Pulsar in a Kubernetes cluster, the monitoring is setup automatically. For details, refer to [Kubernetes instructions](helm-deploy.md). 
 
 ## Dashboards
 
@@ -120,7 +120,7 @@ When you collect time series statistics, the major problem is to make sure the n
 
 ### Pulsar per-topic dashboard
 
-The per-topic dashboard instructions are available at [Pulsar manager](administration-pulsar-manager).
+The per-topic dashboard instructions are available at [Pulsar manager](administration-pulsar-manager.md).
 
 ### Grafana
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/develop-schema.md b/site2/website/versioned_docs/version-2.1.1-incubating/develop-schema.md
index e71c04ef60d..2d4461a5ea2 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/develop-schema.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/develop-schema.md
@@ -5,7 +5,7 @@ sidebar_label: "Custom schema storage"
 original_id: develop-schema
 ---
 
-By default, Pulsar stores data type [schemas](concepts-schema-registry) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
+By default, Pulsar stores data type [schemas](concepts-schema-registry.md) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
 
 In order to use a non-default (i.e. non-BookKeeper) storage system for Pulsar schemas, you need to implement two Java interfaces: [`SchemaStorage`](#schemastorage-interface) and [`SchemaStorageFactory`](#schemastoragefactory-interface).
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/functions-api.md b/site2/website/versioned_docs/version-2.1.1-incubating/functions-api.md
index ff265f3fc9c..3c4ffa02736 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/functions-api.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/functions-api.md
@@ -5,9 +5,9 @@ sidebar_label: "API"
 original_id: functions-api
 ---
 
-[Pulsar Functions](functions-overview) provides an easy-to-use API that developers can use to create and manage processing logic for the Apache Pulsar messaging system. With Pulsar Functions, you can write functions of any level of complexity in [Java](#functions-for-java) or [Python](#functions-for-python) and run them in conjunction with a Pulsar cluster without needing to run a separate stream processing engine.
+[Pulsar Functions](functions-overview.md) provides an easy-to-use API that developers can use to create and manage processing logic for the Apache Pulsar messaging system. With Pulsar Functions, you can write functions of any level of complexity in [Java](#functions-for-java) or [Python](#functions-for-python) and run them in conjunction with a Pulsar cluster without needing to run a separate stream processing engine.
 
-> For a more in-depth overview of the Pulsar Functions feature, see the [Pulsar Functions overview](functions-overview).
+> For a more in-depth overview of the Pulsar Functions feature, see the [Pulsar Functions overview](functions-overview.md).
 
 ## Core programming model
 
@@ -45,7 +45,7 @@ Some things to note about this Pulsar Function:
 
 ### Example deployment
 
-Deploying Pulsar Functions is handled by the [`pulsar-admin`](reference-pulsar-admin) CLI tool, in particular the [`functions`](reference-pulsar-admin.md#functions) command. Here's an example command that would run our [sanitizer](#example-function) function from above in [local run](functions-deploying.md#local-run-mode) mode:
+Deploying Pulsar Functions is handled by the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool, in particular the [`functions`](reference-pulsar-admin.md#functions) command. Here's an example command that would run our [sanitizer](#example-function) function from above in [local run](functions-deploying.md#local-run-mode) mode:
 
 ```bash
 
@@ -61,7 +61,7 @@ $ bin/pulsar-admin functions localrun \
 
 ```
 
-For instructions on running functions in your Pulsar cluster, see the [Deploying Pulsar Functions](functions-deploying) guide.
+For instructions on running functions in your Pulsar cluster, see the [Deploying Pulsar Functions](functions-deploying.md) guide.
 
 ### Available APIs
 
@@ -542,7 +542,7 @@ public class MetricRecorderFunction implements Function<Integer, Void> {
 
 ```
 
-> For instructions on reading and using metrics, see the [Monitoring](deploy-monitoring) guide.
+> For instructions on reading and using metrics, see the [Monitoring](deploy-monitoring.md) guide.
 
 
 ## Functions for Python
@@ -554,7 +554,7 @@ Writing Pulsar Functions in Python entails implementing one of two things:
 
 ### Getting started
 
-Regardless of which [deployment mode](functions-deploying) you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:
+Regardless of which [deployment mode](functions-deploying.md) you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:
 
 That could be your local machine for [local run mode](functions-deploying.md#local-run-mode) or a machine running a Pulsar [broker](reference-terminology.md#broker) for [cluster mode](functions-deploying.md#cluster-mode). To install those libraries using pip:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/functions-deploying.md b/site2/website/versioned_docs/version-2.1.1-incubating/functions-deploying.md
index 28276e9deff..dfc6dd6795d 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/functions-deploying.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/functions-deploying.md
@@ -19,8 +19,8 @@ Cluster mode | The function runs *inside of* your Pulsar cluster, on the same ma
 
 In order to deploy and manage Pulsar Functions, you need to have a Pulsar cluster running. There are several options for this:
 
-* You can run a [standalone cluster](getting-started-standalone) locally on your own machine
-* You can deploy a Pulsar cluster on [Kubernetes](deploy-kubernetes.md), [Amazon Web Services](deploy-aws.md), [bare metal](deploy-bare-metal), [DC/OS](https://dcos.io/), and more
+* You can run a [standalone cluster](getting-started-standalone.md) locally on your own machine
+* You can deploy a Pulsar cluster on [Kubernetes](deploy-kubernetes.md), [Amazon Web Services](deploy-aws.md), [bare metal](deploy-bare-metal.md), [DC/OS](https://dcos.io/), and more
 
 If you're running a non-[standalone](reference-terminology.md#standalone) cluster, you'll need to obtain the service URL for the cluster. How you obtain the service URL will depend on how you deployed your Pulsar cluster.
 
@@ -52,7 +52,7 @@ Function name | Whichever value is specified for the class name (minus org, libr
 Tenant | Derived from the input topics' names. If the input topics are under the `marketing` tenant---i.e. the topic names have the form `persistent://marketing/{namespace}/{topicName}`---then the tenant will be `marketing`.
 Namespace | Derived from the input topics' names. If the input topics are under the `asia` namespace under the `marketing` tenant---i.e. the topic names have the form `persistent://marketing/asia/{topicName}`, then the namespace will be `asia`.
 Output topic | `{input topic}-{function name}-output`. A function with an input topic name of `incoming` and a function name of `exclamation`, for example, would have an output topic of `incoming-exclamation-output`.
-Subscription type | For at-least-once and at-most-once [processing guarantees](functions-guarantees), the [`SHARED`](concepts-messaging.md#shared) is applied by default; for effectively-once guarantees, [`FAILOVER`](concepts-messaging.md#failover) is applied
+Subscription type | For at-least-once and at-most-once [processing guarantees](functions-guarantees.md), the [`SHARED`](concepts-messaging.md#shared) is applied by default; for effectively-once guarantees, [`FAILOVER`](concepts-messaging.md#failover) is applied
 Processing guarantees | [`ATLEAST_ONCE`](functions-guarantees.md)
 Pulsar service URL | `pulsar://localhost:6650`
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/functions-overview.md b/site2/website/versioned_docs/version-2.1.1-incubating/functions-overview.md
index bb2246a764b..5dbc04204c2 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/functions-overview.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/functions-overview.md
@@ -154,7 +154,7 @@ class RoutingFunction(Function):
 
 ## Command-line interface
 
-Pulsar Functions are managed using the [`pulsar-admin`](reference-pulsar-admin) CLI tool (in particular the [`functions`](reference-pulsar-admin.md#functions) command). Here's an example command that would run a function in [local run mode](#local-run-mode):
+Pulsar Functions are managed using the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool (in particular the [`functions`](reference-pulsar-admin.md#functions) command). Here's an example command that would run a function in [local run mode](#local-run-mode):
 
 ```bash
 
@@ -492,7 +492,7 @@ $ bin/pulsar-admin functions create \
 
 ## Metrics
 
-Pulsar Functions that use the [Pulsar Functions SDK](#the-pulsar-functions-sdk) can publish metrics to Pulsar. For more information, see [Metrics for Pulsar Functions](functions-metrics).
+Pulsar Functions that use the [Pulsar Functions SDK](#the-pulsar-functions-sdk) can publish metrics to Pulsar. For more information, see [Metrics for Pulsar Functions](functions-metrics.md).
 
 ## State storage
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/getting-started-docker.md b/site2/website/versioned_docs/version-2.1.1-incubating/getting-started-docker.md
index 26908245cb2..904d6740166 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/getting-started-docker.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/getting-started-docker.md
@@ -43,8 +43,8 @@ When you start a local standalone cluster, a `public/default` namespace is creat
 
 ## Use Pulsar in Docker
 
-Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python) 
-and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can
+Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) 
+and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can
 use one of these root URLs to interact with your cluster:
 
 * `pulsar://localhost:6650`
@@ -103,7 +103,7 @@ client.close()
 ## Get the topic statistics
 
 In Pulsar, you can use REST, Java, or command-line tools to control every aspect of the system.
-For details on APIs, refer to [Admin API Overview](admin-api-overview).
+For details on APIs, refer to [Admin API Overview](admin-api-overview.md).
 
 In the simplest example, you can use curl to probe the stats for a particular topic:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/getting-started-standalone.md b/site2/website/versioned_docs/version-2.1.1-incubating/getting-started-standalone.md
index e814c76d5a3..ed437a88361 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/getting-started-standalone.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/getting-started-standalone.md
@@ -8,7 +8,7 @@ original_id: getting-started-standalone
 For the purposes of local development and testing, you can run Pulsar in standalone mode on your own machine. Standalone mode includes a Pulsar broker as well as the necessary ZooKeeper and BookKeeper components running inside of a single Java Virtual Machine (JVM) process.
 
 > #### Pulsar in production? 
-> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal) guide.
+> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal.md) guide.
 
 ## Run Pulsar Standalone Manually
 
@@ -112,7 +112,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you are running Pulsar in a bare metal cluster, you need to make sure `connectors` tarball is unzipped in every broker's pulsar directory
 > (or in every function-worker's pulsar directory if you are running a separate worker cluster for Pulsar functions).
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 ### Starting the cluster
@@ -179,12 +179,12 @@ If the message has been successfully published to the topic, you should see a co
 
 ## Using Pulsar clients locally
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
+Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
 
 * `http://localhost:8080`
 * `pulsar://localhost:6650`
 
-Here's an example producer for a Pulsar topic using the [Java](client-libraries-java) client:
+Here's an example producer for a Pulsar topic using the [Java](client-libraries-java.md) client:
 
 ```java
 
@@ -195,7 +195,7 @@ Producer<byte[]> producer = client.newProducer().topic("my-topic").create();
 
 ```
 
-Here's an example [Python](client-libraries-python) producer:
+Here's an example [Python](client-libraries-python.md) producer:
 
 ```python
 
@@ -206,7 +206,7 @@ producer = client.create_producer('my-topic')
 
 ```
 
-Finally, here's an example [C++](client-libraries-cpp) producer:
+Finally, here's an example [C++](client-libraries-cpp.md) producer:
 
 ```cpp
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/io-develop.md b/site2/website/versioned_docs/version-2.1.1-incubating/io-develop.md
index 69c9a2f42c4..d361a302b25 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/io-develop.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/io-develop.md
@@ -13,15 +13,15 @@ import TabItem from '@theme/TabItem';
 This guide describes how to develop Pulsar connectors to move data
 between Pulsar and other systems. 
 
-Pulsar connectors are special [Pulsar Functions](functions-overview), so creating
+Pulsar connectors are special [Pulsar Functions](functions-overview.md), so creating
 a Pulsar connector is similar to creating a Pulsar function. 
 
 Pulsar connectors come in two types: 
 
 | Type | Description | Example
 |---|---|---
-{@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}|Import data from another system to Pulsar.|[RabbitMQ source connector](io-rabbitmq) imports the messages of a RabbitMQ queue to a Pulsar topic.
-{@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java}|Export data from Pulsar to another system.|[Kinesis sink connector](io-kinesis) exports the messages of a Pulsar topic to a Kinesis stream.
+{@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}|Import data from another system to Pulsar.|[RabbitMQ source connector](io-rabbitmq.md) imports the messages of a RabbitMQ queue to a Pulsar topic.
+{@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java}|Export data from Pulsar to another system.|[Kinesis sink connector](io-kinesis.md) exports the messages of a Pulsar topic to a Kinesis stream.
 
 ## Develop
 
@@ -274,7 +274,7 @@ For more information about **how to create integration tests for Pulsar connecto
 ## Package
 
 Once you've developed and tested your connector, you need to package it so that it can be submitted
-to a [Pulsar Functions](functions-overview) cluster. 
+to a [Pulsar Functions](functions-overview.md) cluster. 
 
 There are two methods to
 work with Pulsar Functions' runtime, that is, [NAR](#nar) and [uber JAR](#uber-jar).
@@ -305,7 +305,7 @@ For more information about **how NAR works**, see [here](https://medium.com/hash
 
 :::
 
-Pulsar uses the same mechanism for packaging **all** [built-in connectors](io-connectors). 
+Pulsar uses the same mechanism for packaging **all** [built-in connectors](io-connectors.md). 
 
 The easiest approach to package a Pulsar connector is to create a NAR package using [nifi-nar-maven-plugin](https://mvnrepository.com/artifact/org.apache.nifi/nifi-nar-maven-plugin).
 
@@ -380,7 +380,7 @@ Pulsar connectors enable you to move data in and out of Pulsar easily. It is imp
 
 - Check the metrics provided by Pulsar.
 
-  Pulsar connectors expose the metrics that can be collected and used for monitoring the health of **Java** connectors. You can check the metrics by following the [monitoring](deploy-monitoring) guide.
+  Pulsar connectors expose the metrics that can be collected and used for monitoring the health of **Java** connectors. You can check the metrics by following the [monitoring](deploy-monitoring.md) guide.
 
 - Set and check your customized metrics.
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/io-managing.md b/site2/website/versioned_docs/version-2.1.1-incubating/io-managing.md
index c5c61cc4db7..c25e15641ef 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/io-managing.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/io-managing.md
@@ -50,7 +50,7 @@ For details, consult the documentation for [individual connectors](io-overview.m
 
 ## Running Connectors
 
-Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Running sources
 
@@ -166,8 +166,8 @@ Here's an example to submit a Cassandra sink:
 
 ## Monitoring Connectors
 
-Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview), so you can use [`functions`](reference-pulsar-admin.md#source) commands
-available in the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview.md), so you can use [`functions`](reference-pulsar-admin.md#source) commands
+available in the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Retrieve Connector Metadata
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/io-overview.md b/site2/website/versioned_docs/version-2.1.1-incubating/io-overview.md
index 2a6ecaee588..ea49e4b042e 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/io-overview.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/io-overview.md
@@ -157,7 +157,7 @@ For more information about the options of `pulsar-admin sinks update`, see [here
 
 ## Work with connector
 
-You can manage Pulsar connectors (for example, create, update, start, stop, restart, reload, delete and perform other operations on connectors) via the [Connector Admin CLI](reference-connector-admin) with [sources](io-cli.md#sources) and [sinks](io-cli.md#sinks) subcommands.
+You can manage Pulsar connectors (for example, create, update, start, stop, restart, reload, delete and perform other operations on connectors) via the [Connector Admin CLI](reference-connector-admin.md) with [sources](io-cli.md#sources) and [sinks](io-cli.md#sinks) subcommands.
 
-Connectors (sources and sinks) and Functions are components of instances, and they all run on Functions workers. When managing a source, sink or function via [Connector Admin CLI](reference-connector-admin.md) or [Functions Admin CLI](functions-cli), an instance is started on a worker. For more information, see [Functions worker](functions-worker.md#run-functions-worker-separately).
+Connectors (sources and sinks) and Functions are components of instances, and they all run on Functions workers. When managing a source, sink or function via [Connector Admin CLI](reference-connector-admin.md) or [Functions Admin CLI](functions-cli.md), an instance is started on a worker. For more information, see [Functions worker](functions-worker.md#run-functions-worker-separately).
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/io-quickstart.md b/site2/website/versioned_docs/version-2.1.1-incubating/io-quickstart.md
index 66c9a3c3e5e..178d70d0a8b 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/io-quickstart.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/io-quickstart.md
@@ -6,14 +6,14 @@ original_id: io-quickstart
 ---
 
 This tutorial provides a hands-on look at how you can move data out of Pulsar without writing a single line of code.
-It is helpful to review the [concepts](io-overview) for Pulsar I/O in tandem with running the steps in this guide
+It is helpful to review the [concepts](io-overview.md) for Pulsar I/O in tandem with running the steps in this guide
 to gain a deeper understanding. At the end of this tutorial, you will be able to:
 
 - Connect your Pulsar cluster with your Cassandra cluster
 
 :::tip
 
-1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone). However all
+1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone.md). However all
 the commands used in this tutorial should be able to be used in a multi-nodes Pulsar cluster without any changes.
 2. All the instructions are assumed to run at the root directory of a Pulsar binary distribution.
 
@@ -267,11 +267,11 @@ configs:
 
 ```
 
-To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra).
+To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra.md).
 
 ### Submit a Cassandra Sink
 
-Pulsar provides the [CLI](reference-cli-tools) for running and managing Pulsar I/O connectors.
+Pulsar provides the [CLI](reference-cli-tools.md) for running and managing Pulsar I/O connectors.
 
 We can run following command to sink a sink connector with type `cassandra` and config file `examples/cassandra-sink.yml`.
 
@@ -296,7 +296,7 @@ as a Pulsar Function and write the messages produced in topic `test_cassandra` t
 
 ### Inspect the Cassandra Sink
 
-Since an IO connector is running as [Pulsar Functions](functions-overview), you can use [functions CLI](reference-pulsar-admin.md#functions)
+Since an IO connector is running as [Pulsar Functions](functions-overview.md), you can use [functions CLI](reference-pulsar-admin.md#functions)
 for inspecting and managing the IO connectors.
 
 #### Retrieve Sink Info
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/pulsar-2.0.md b/site2/website/versioned_docs/version-2.1.1-incubating/pulsar-2.0.md
index 560c8c1bd7c..07fba365e9f 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/pulsar-2.0.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/pulsar-2.0.md
@@ -4,13 +4,13 @@ title: Pulsar 2.0
 sidebar_label: "Pulsar 2.0"
 ---
 
-Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview) feature, some terminology changes, and more.
+Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview.md) feature, some terminology changes, and more.
 
 ## New features in Pulsar 2.0
 
 Feature | Description
 :-------|:-----------
-[Pulsar Functions](functions-overview) | A lightweight compute option for Pulsar
+[Pulsar Functions](functions-overview.md) | A lightweight compute option for Pulsar
 
 ## Major changes
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/reference-cli-tools.md b/site2/website/versioned_docs/version-2.1.1-incubating/reference-cli-tools.md
index 1c3d601e00c..dcac11835f4 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/reference-cli-tools.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/reference-cli-tools.md
@@ -6,7 +6,7 @@ sidebar_label: "Pulsar CLI tools"
 
 Pulsar offers several command-line tools that you can use for managing Pulsar installations, performance testing, using command-line producers and consumers, and more.
 
-All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone). The following tools are currently documented:
+All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone.md). The following tools are currently documented:
 
 * [`pulsar`](#pulsar)
 * [`pulsar-client`](#pulsar-client)
@@ -825,7 +825,7 @@ Options
 
 ### `transaction`
 
-Run a transaction. For more information, see [Pulsar transactions](txn-why).
+Run a transaction. For more information, see [Pulsar transactions](txn-why.md).
 
 **Usage**
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/security-athenz.md b/site2/website/versioned_docs/version-2.1.1-incubating/security-athenz.md
index ba27ba43eb9..6d338fc4013 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/security-athenz.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/security-athenz.md
@@ -75,7 +75,7 @@ For more information on Pulsar client authentication using Athenz, see the follo
 
 ## Configure CLI tools for Athenz
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You need to add the following authentication parameters to the `conf/client.conf` config file to use Athenz with CLI tools of Pulsar:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/security-authorization.md b/site2/website/versioned_docs/version-2.1.1-incubating/security-authorization.md
index d9d33665d06..c5e3c04b035 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/security-authorization.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/security-authorization.md
@@ -26,7 +26,7 @@ superUserRoles=my-super-user-1,my-super-user-2
 > A full list of parameters is available in the `conf/broker.conf` file.
 > You can also find the default values for those parameters in [Broker Configuration](reference-configuration.md#broker). 
 
-Typically, you use superuser roles for administrators, clients as well as broker-to-broker authorization. When you use [geo-replication](concepts-replication), every broker needs to be able to publish to all the other topics of clusters.
+Typically, you use superuser roles for administrators, clients as well as broker-to-broker authorization. When you use [geo-replication](concepts-replication.md), every broker needs to be able to publish to all the other topics of clusters.
 
 You can also enable the authorization for the proxy in the proxy configuration file (`conf/proxy.conf`). Once you enable the authorization on the proxy, the proxy does an additional authorization check before forwarding the request to a broker. 
 If you enable authorization on the broker, the broker checks the authorization of the request when the broker receives the forwarded request.
@@ -58,7 +58,7 @@ superUserRoles=my-super-user-1,my-super-user-2,my-proxy-role
 
 Pulsar [instance](reference-terminology.md#instance) administrators or some kind of self-service portal typically provisions a Pulsar [tenant](reference-terminology.md#tenant). 
 
-You can manage tenants using the [`pulsar-admin`](reference-pulsar-admin) tool. 
+You can manage tenants using the [`pulsar-admin`](reference-pulsar-admin.md) tool. 
 
 ### Create a new tenant
 
@@ -86,7 +86,7 @@ persistent://tenant/namespace/topic
 
 ### Manage permissions
 
-You can use [Pulsar Admin Tools](admin-api-permissions) for managing permission in Pulsar.
+You can use [Pulsar Admin Tools](admin-api-permissions.md) for managing permission in Pulsar.
 
 ### Pulsar admin authentication
 
@@ -116,7 +116,7 @@ PulsarAdmin admin = PulsarAdmin.builder()
 When a client is identified with multiple roles in a token (the type of role claim in the token is an array) during the authentication process, Pulsar supports to check the permissions of all the roles and further authorize the client as long as one of its roles has the required permissions.
 
 > **Note**<br />
-> This authorization method is only compatible with [JWT authentication](security-jwt).
+> This authorization method is only compatible with [JWT authentication](security-jwt.md).
 
 To enable this authorization method, configure the authorization provider as `MultiRolesTokenAuthorizationProvider` in the `conf/broker.conf` file.
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/security-overview.md b/site2/website/versioned_docs/version-2.1.1-incubating/security-overview.md
index 2f3fc035ad4..3f08cb29ad8 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/security-overview.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/security-overview.md
@@ -20,7 +20,7 @@ You had better secure the service components in your Apache Pulsar deployment.
 
 In Pulsar, a *role* is a string, like `admin` or `app1`, which can represent a single client or multiple clients. You can use roles to control permission for clients to produce or consume from certain topics, administer the configuration for tenants, and so on.
 
-Apache Pulsar uses a [Authentication Provider](#authentication-providers) to establish the identity of a client and then assign a *role token* to that client. This role token is then used for [Authorization and ACLs](security-authorization) to determine what the client is authorized to do.
+Apache Pulsar uses a [Authentication Provider](#authentication-providers) to establish the identity of a client and then assign a *role token* to that client. This role token is then used for [Authorization and ACLs](security-authorization.md) to determine what the client is authorized to do.
 
 ## Authentication providers
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/security-tls-authentication.md b/site2/website/versioned_docs/version-2.1.1-incubating/security-tls-authentication.md
index e6921bd4418..d34ecbc1fdc 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/security-tls-authentication.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/security-tls-authentication.md
@@ -6,9 +6,9 @@ sidebar_label: "Authentication using TLS"
 
 ## TLS authentication overview
 
-TLS authentication is an extension of [TLS transport encryption](security-tls-transport). Not only servers have keys and certs that the client uses to verify the identity of servers, clients also have keys and certs that the server uses to verify the identity of clients. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
+TLS authentication is an extension of [TLS transport encryption](security-tls-transport.md). Not only servers have keys and certs that the client uses to verify the identity of servers, clients also have keys and certs that the server uses to verify the identity of clients. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
 
-`Bouncy Castle Provider` provides TLS related cipher suites and algorithms in Pulsar. If you need [FIPS](https://www.bouncycastle.org/fips_faq.html) version of `Bouncy Castle Provider`, please reference [Bouncy Castle page](security-bouncy-castle).
+`Bouncy Castle Provider` provides TLS related cipher suites and algorithms in Pulsar. If you need [FIPS](https://www.bouncycastle.org/fips_faq.html) version of `Bouncy Castle Provider`, please reference [Bouncy Castle page](security-bouncy-castle.md).
 
 ### Create client certificates
 
@@ -102,7 +102,7 @@ brokerClientTrustCertsFilePath=/path/my-ca/certs/ca.cert.pem
 
 To configure proxies to authenticate clients, add the following parameters to `proxy.conf`, alongside [the configuration to enable tls transport](security-tls-transport.md#proxy-configuration):
 
-The proxy should have its own client key pair for connecting to brokers. You need to configure the role token for this key pair in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization) for more details.
+The proxy should have its own client key pair for connecting to brokers. You need to configure the role token for this key pair in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization.md) for more details.
 
 ```properties
 
@@ -122,7 +122,7 @@ When you use TLS authentication, client connects via TLS transport. You need to
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You need to add the following parameters to that file to use TLS authentication with the CLI tools of Pulsar:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/security-tls-transport.md b/site2/website/versioned_docs/version-2.1.1-incubating/security-tls-transport.md
index 87e19607085..3feaf3a4564 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/security-tls-transport.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/security-tls-transport.md
@@ -8,7 +8,7 @@ sidebar_label: "Transport Encryption using TLS"
 
 By default, Apache Pulsar clients communicate with the Apache Pulsar service in plain text. This means that all data is sent in the clear. You can use TLS to encrypt this traffic to protect the traffic from the snooping of a man-in-the-middle attacker.
 
-You can also configure TLS for both encryption and authentication. Use this guide to configure just TLS transport encryption and refer to [here](security-tls-authentication.md) for TLS authentication configuration. Alternatively, you can use [another authentication mechanism](security-athenz) on top of TLS transport encryption.
+You can also configure TLS for both encryption and authentication. Use this guide to configure just TLS transport encryption and refer to [here](security-tls-authentication.md) for TLS authentication configuration. Alternatively, you can use [another authentication mechanism](security-athenz.md) on top of TLS transport encryption.
 
 > Note that enabling TLS may impact the performance due to encryption overhead.
 
@@ -18,7 +18,7 @@ TLS is a form of [public key cryptography](https://en.wikipedia.org/wiki/Public-
 
 To use TLS transport encryption, you need two kinds of key pairs, **server key pairs** and a **certificate authority**.
 
-You can use a third kind of key pair, **client key pairs**, for [client authentication](security-tls-authentication).
+You can use a third kind of key pair, **client key pairs**, for [client authentication](security-tls-authentication.md).
 
 You should store the **certificate authority** private key in a very secure location (a fully encrypted, disconnected, air gapped computer). As for the certificate authority public key, the **trust cert**, you can freely shared it.
 
@@ -26,9 +26,9 @@ For both client and server key pairs, the administrator first generates a privat
 
 For TLS transport encryption, the clients can use the **trust cert** to verify that the server has a key pair that the certificate authority signed when the clients are talking to the server. A man-in-the-middle attacker does not have access to the certificate authority, so they couldn't create a server with such a key pair.
 
-For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that the certificate authority signed. The common name of the **client cert** is then used as the client's role token (see [Overview](security-overview)).
+For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that the certificate authority signed. The common name of the **client cert** is then used as the client's role token (see [Overview](security-overview.md)).
 
-`Bouncy Castle Provider` provides cipher suites and algorithms in Pulsar. If you need [FIPS](https://www.bouncycastle.org/fips_faq.html) version of `Bouncy Castle Provider`, please reference [Bouncy Castle page](security-bouncy-castle).
+`Bouncy Castle Provider` provides cipher suites and algorithms in Pulsar. If you need [FIPS](https://www.bouncycastle.org/fips_faq.html) version of `Bouncy Castle Provider`, please reference [Bouncy Castle page](security-bouncy-castle.md).
 
 ## Create TLS certificates
 
@@ -146,7 +146,7 @@ At this point, you have a cert, `broker.cert.pem`, and a key, `broker.key-pk8.pe
 
 ## Configure broker
 
-To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you need to make some changes to `broker.conf`, which locates in the `conf` directory of your [Pulsar installation](getting-started-standalone).
+To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you need to make some changes to `broker.conf`, which locates in the `conf` directory of your [Pulsar installation](getting-started-standalone.md).
 
 Add these values to the configuration file (substituting the appropriate certificate paths where necessary):
 
@@ -219,7 +219,7 @@ The examples below show that hostname verification is disabled for the CLI tools
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools) like [`pulsar-admin`](reference-cli-tools.md#pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-cli-tools.md#pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You need to add the following parameters to that file to use TLS transport with the CLI tools of Pulsar:
 
diff --git a/site2/website/versioned_docs/version-2.1.1-incubating/standalone.md b/site2/website/versioned_docs/version-2.1.1-incubating/standalone.md
index 6781f9e7130..46a5adebe74 100644
--- a/site2/website/versioned_docs/version-2.1.1-incubating/standalone.md
+++ b/site2/website/versioned_docs/version-2.1.1-incubating/standalone.md
@@ -8,7 +8,7 @@ original_id: standalone
 For the purposes of local development and testing, you can run Pulsar in standalone mode on your own machine. Standalone mode includes a Pulsar broker as well as the necessary ZooKeeper and BookKeeper components running inside of a single Java Virtual Machine (JVM) process.
 
 > #### Pulsar in production? 
-> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal) guide.
+> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal.md) guide.
 
 ## Run Pulsar Standalone Manually
 
@@ -112,7 +112,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you are running Pulsar in a bare metal cluster, you need to make sure `connectors` tarball is unzipped in every broker's pulsar directory
 > (or in every function-worker's pulsar directory if you are running a separate worker cluster for Pulsar functions).
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 ### Starting the cluster
@@ -179,12 +179,12 @@ If the message has been successfully published to the topic, you should see a co
 
 ## Using Pulsar clients locally
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
+Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
 
 * `http://localhost:8080`
 * `pulsar://localhost:6650`
 
-Here's an example producer for a Pulsar topic using the [Java](client-libraries-java) client:
+Here's an example producer for a Pulsar topic using the [Java](client-libraries-java.md) client:
 
 ```java
 
@@ -195,7 +195,7 @@ Producer<byte[]> producer = client.newProducer().topic("my-topic").create();
 
 ```
 
-Here's an example [Python](client-libraries-python) producer:
+Here's an example [Python](client-libraries-python.md) producer:
 
 ```python
 
@@ -206,7 +206,7 @@ producer = client.create_producer('my-topic')
 
 ```
 
-Finally, here's an example [C++](client-libraries-cpp) producer:
+Finally, here's an example [C++](client-libraries-cpp.md) producer:
 
 ```cpp
 
diff --git a/site2/website/versioned_docs/version-2.10.1-deprecated/admin-api-brokers.md b/site2/website/versioned_docs/version-2.10.1-deprecated/admin-api-brokers.md
index 7ac1f7292b8..2674c7da875 100644
--- a/site2/website/versioned_docs/version-2.10.1-deprecated/admin-api-brokers.md
+++ b/site2/website/versioned_docs/version-2.10.1-deprecated/admin-api-brokers.md
@@ -176,7 +176,7 @@ One way to configure a Pulsar [broker](reference-terminology.md#broker) is to su
 
 But since all broker configuration in Pulsar is stored in ZooKeeper, configuration values can also be dynamically updated *while the broker is running*. When you update broker configuration dynamically, ZooKeeper will notify the broker of the change and the broker will then override any existing configuration values.
 
-* The [`brokers`](reference-pulsar-admin.md#brokers) command for the [`pulsar-admin`](reference-pulsar-admin) tool has a variety of subcommands that enable you to manipulate a broker's configuration dynamically, enabling you to [update config values](#update-dynamic-configuration) and more.
+* The [`brokers`](reference-pulsar-admin.md#brokers) command for the [`pulsar-admin`](reference-pulsar-admin.md) tool has a variety of subcommands that enable you to manipulate a broker's configuration dynamically, enabling you to [update config values](#update-dynamic-configuration) and more.
 * In the Pulsar admin {@inject: rest:REST:/} API, dynamic configuration is managed through the `/admin/v2/brokers/configuration` endpoint.
 
 ### Update dynamic configuration
diff --git a/site2/website/versioned_docs/version-2.10.1-deprecated/schema-manage.md b/site2/website/versioned_docs/version-2.10.1-deprecated/schema-manage.md
index b3637473799..e62818c7e82 100644
--- a/site2/website/versioned_docs/version-2.10.1-deprecated/schema-manage.md
+++ b/site2/website/versioned_docs/version-2.10.1-deprecated/schema-manage.md
@@ -160,7 +160,7 @@ To manage schemas, you can use one of the following methods.
 
 | Method |  Description | 
 | --- | --- |
-|  **Admin CLI**<li></li> |   You can use the `pulsar-admin` tool to manage Pulsar schemas, brokers, clusters, sources, sinks, topics, tenants and so on. For more information about how to use the `pulsar-admin` tool, see [here](reference-pulsar-admin).  | 
+|  **Admin CLI**<li></li> |   You can use the `pulsar-admin` tool to manage Pulsar schemas, brokers, clusters, sources, sinks, topics, tenants and so on. For more information about how to use the `pulsar-admin` tool, see [here](reference-pulsar-admin.md).  | 
 |  **REST API**<li></li> |   Pulsar exposes schema related management API in Pulsar’s admin RESTful API. You can access the admin RESTful endpoint directly to manage schemas. For more information about how to use the Pulsar REST API, see [here](/admin-rest-api/).  | 
 |  **Java Admin API**<li></li> |  Pulsar provides Java admin library. | 
 
diff --git a/site2/website/versioned_docs/version-2.2.0/admin-api-clusters.md b/site2/website/versioned_docs/version-2.2.0/admin-api-clusters.md
index 04db2f60759..1255ad25d7a 100644
--- a/site2/website/versioned_docs/version-2.2.0/admin-api-clusters.md
+++ b/site2/website/versioned_docs/version-2.2.0/admin-api-clusters.md
@@ -88,7 +88,7 @@ When provision a new cluster, you need to initialize that cluster's [metadata](c
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers) that will belong to the cluster.
+You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers.md) that will belong to the cluster.
 
 > **No cluster metadata initialization through the REST API or the Java admin API**
 >
@@ -112,11 +112,11 @@ bin/pulsar initialize-cluster-metadata \
 
 ```
 
-You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication) in your instance.
+You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication.md) in your instance.
 
 ### Get configuration
 
-You can fetch the [configuration](reference-configuration) for an existing cluster at any time.
+You can fetch the [configuration](reference-configuration.md) for an existing cluster at any time.
 
 ````mdx-code-block
 <Tabs 
diff --git a/site2/website/versioned_docs/version-2.2.0/admin-api-namespaces.md b/site2/website/versioned_docs/version-2.2.0/admin-api-namespaces.md
index e4e099489db..989802f34be 100644
--- a/site2/website/versioned_docs/version-2.2.0/admin-api-namespaces.md
+++ b/site2/website/versioned_docs/version-2.2.0/admin-api-namespaces.md
@@ -1354,7 +1354,7 @@ admin.namespaces().removeDeduplicationSnapshotInterval(namespace)
 
 ### Namespace isolation
 
-You can use the [Pulsar isolation policy](administration-isolation) to allocate resources (broker and bookie) for a namespace. 
+You can use the [Pulsar isolation policy](administration-isolation.md) to allocate resources (broker and bookie) for a namespace. 
 
 ### Unload namespaces from a broker
 
diff --git a/site2/website/versioned_docs/version-2.2.0/admin-api-non-persistent-topics.md b/site2/website/versioned_docs/version-2.2.0/admin-api-non-persistent-topics.md
index 78dac355894..2c645e507ca 100644
--- a/site2/website/versioned_docs/version-2.2.0/admin-api-non-persistent-topics.md
+++ b/site2/website/versioned_docs/version-2.2.0/admin-api-non-persistent-topics.md
@@ -4,4 +4,4 @@ title: Managing non-persistent topics
 sidebar_label: "Non-Persistent topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.2.0/admin-api-partitioned-topics.md b/site2/website/versioned_docs/version-2.2.0/admin-api-partitioned-topics.md
index 7221b3d14e0..da99c440302 100644
--- a/site2/website/versioned_docs/version-2.2.0/admin-api-partitioned-topics.md
+++ b/site2/website/versioned_docs/version-2.2.0/admin-api-partitioned-topics.md
@@ -4,4 +4,4 @@ title: Managing partitioned topics
 sidebar_label: "Partitioned topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.2.0/admin-api-persistent-topics.md b/site2/website/versioned_docs/version-2.2.0/admin-api-persistent-topics.md
index 8a7abaea373..206304005da 100644
--- a/site2/website/versioned_docs/version-2.2.0/admin-api-persistent-topics.md
+++ b/site2/website/versioned_docs/version-2.2.0/admin-api-persistent-topics.md
@@ -4,4 +4,4 @@ title: Managing persistent topics
 sidebar_label: "Persistent topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.2.0/admin-api-tenants.md b/site2/website/versioned_docs/version-2.2.0/admin-api-tenants.md
index 8071b3261c6..fd2ccd0fe00 100644
--- a/site2/website/versioned_docs/version-2.2.0/admin-api-tenants.md
+++ b/site2/website/versioned_docs/version-2.2.0/admin-api-tenants.md
@@ -20,7 +20,7 @@ import TabItem from '@theme/TabItem';
 > 
 > - For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](https://pulsar.apache.org/api/admin/).
 
-Tenants, like namespaces, can be managed using the [admin API](admin-api-overview). There are currently two configurable aspects of tenants:
+Tenants, like namespaces, can be managed using the [admin API](admin-api-overview.md). There are currently two configurable aspects of tenants:
 
 * Admin roles
 * Allowed clusters
@@ -121,7 +121,7 @@ admin.tenants().createTenant(tenantName, tenantInfo);
 
 ### Get configuration
 
-You can fetch the [configuration](reference-configuration) for an existing tenant at any time.
+You can fetch the [configuration](reference-configuration.md) for an existing tenant at any time.
 
 ````mdx-code-block
 <Tabs 
diff --git a/site2/website/versioned_docs/version-2.2.0/administration-dashboard.md b/site2/website/versioned_docs/version-2.2.0/administration-dashboard.md
index 1eb0404dfe0..92bd7e17869 100644
--- a/site2/website/versioned_docs/version-2.2.0/administration-dashboard.md
+++ b/site2/website/versioned_docs/version-2.2.0/administration-dashboard.md
@@ -7,7 +7,7 @@ original_id: administration-dashboard
 
 :::note
 
-Pulsar dashboard is deprecated. We recommend you use [Pulsar Manager](administration-pulsar-manager) to manage and monitor the stats of your topics. 
+Pulsar dashboard is deprecated. We recommend you use [Pulsar Manager](administration-pulsar-manager.md) to manage and monitor the stats of your topics. 
 
 :::
 
diff --git a/site2/website/versioned_docs/version-2.2.0/administration-geo.md b/site2/website/versioned_docs/version-2.2.0/administration-geo.md
index 78f72e1832e..766840cf73f 100644
--- a/site2/website/versioned_docs/version-2.2.0/administration-geo.md
+++ b/site2/website/versioned_docs/version-2.2.0/administration-geo.md
@@ -71,7 +71,7 @@ $ bin/pulsar-admin clusters create \
    :::tip
 
    - If you want to use a secure connection for a cluster, you can use the flags `--broker-url-secure` and `--url-secure`. For more information, see [pulsar-admin clusters create](https://pulsar.apache.org/tools/pulsar-admin/).
-   - Different clusters may have different authentications. You can use the authentication flag `--auth-plugin` and `--auth-parameters` together to set cluster authentication, which overrides `brokerClientAuthenticationPlugin` and `brokerClientAuthenticationParameters` if `authenticationEnabled` sets to `true` in `broker.conf` and `standalone.conf`. For more information, see [authentication and authorization](concepts-authentication).
+   - Different clusters may have different authentications. You can use the authentication flag `--auth-plugin` and `--auth-parameters` together to set cluster authentication, which overrides `brokerClientAuthenticationPlugin` and `brokerClientAuthenticationParameters` if `authenticationEnabled` sets to `true` in `broker.conf` and `standalone.conf`. For more information, see [authentication and authorization](concepts-authentication.md).
 
    :::
 
@@ -135,7 +135,7 @@ $ bin/pulsar-admin namespaces set-clusters my-tenant/my-namespace \
 
 By default, messages are replicated to all clusters configured for the namespace. You can restrict replication selectively by specifying a replication list for a message, and then that message is replicated only to the subset in the replication list.
 
-The following is an example for the [Java API](client-libraries-java). Note the use of the `setReplicationClusters` method when you construct the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
+The following is an example for the [Java API](client-libraries-java.md). Note the use of the `setReplicationClusters` method when you construct the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
 
 ```java
 
diff --git a/site2/website/versioned_docs/version-2.2.0/administration-zk-bk.md b/site2/website/versioned_docs/version-2.2.0/administration-zk-bk.md
index b9cfb39ad03..505a3b5b516 100644
--- a/site2/website/versioned_docs/version-2.2.0/administration-zk-bk.md
+++ b/site2/website/versioned_docs/version-2.2.0/administration-zk-bk.md
@@ -166,7 +166,7 @@ To enable batching operations, set the [`metadataStoreBatchingEnabled`](referenc
 
 BookKeeper stores all durable messages in Pulsar. BookKeeper is a distributed [write-ahead log](https://en.wikipedia.org/wiki/Write-ahead_logging) WAL system that guarantees read consistency of independent message logs calls ledgers. Individual BookKeeper servers are also called *bookies*.
 
-> To manage message persistence, retention, and expiry in Pulsar, refer to [cookbook](cookbooks-retention-expiry).
+> To manage message persistence, retention, and expiry in Pulsar, refer to [cookbook](cookbooks-retention-expiry.md).
 
 ### Hardware requirements
 
diff --git a/site2/website/versioned_docs/version-2.2.0/client-libraries-go.md b/site2/website/versioned_docs/version-2.2.0/client-libraries-go.md
index d826f69560f..6c3b3e9afad 100644
--- a/site2/website/versioned_docs/version-2.2.0/client-libraries-go.md
+++ b/site2/website/versioned_docs/version-2.2.0/client-libraries-go.md
@@ -16,7 +16,7 @@ The Pulsar Go client can be used to create Pulsar [producers](#producers), [cons
 ### Requirements
 
 Pulsar Go client library is based on the C++ client library. Follow
-the instructions for [C++ library](client-libraries-cpp) for installing the binaries
+the instructions for [C++ library](client-libraries-cpp.md) for installing the binaries
 through [RPM](client-libraries-cpp.md#rpm), [Deb](client-libraries-cpp.md#deb) or [Homebrew packages](client-libraries-cpp.md#macos).
 
 ### Installing go package
@@ -50,7 +50,7 @@ import "github.com/apache/pulsar/pulsar-client-go/pulsar"
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 Pulsar protocol URLs are assigned to specific clusters, use the `pulsar` scheme and have a default port of 6650. Here's an example for `localhost`:
 
@@ -68,7 +68,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you're using [TLS](security-tls-authentication) authentication, the URL will look like something like this:
+If you're using [TLS](security-tls-authentication.md) authentication, the URL will look like something like this:
 
 ```http
 
@@ -223,14 +223,14 @@ Parameter | Description | Default
 :---------|:------------|:-------
 `Topic` | The Pulsar [topic](reference-terminology.md#topic) to which the producer will publish messages |
 `Name` | A name for the producer. If you don't explicitly assign a name, Pulsar will automatically generate a globally unique name that you can access later using the `Name()` method.  If you choose to explicitly assign a name, it will need to be unique across *all* Pulsar clusters, otherwise the creation operation will throw an error. |
-`SendTimeout` | When publishing a message to a topic, the producer will wait for an acknowledgment from the responsible Pulsar [broker](reference-terminology.md#broker). If a message is not acknowledged within the threshold set by this parameter, an error will be thrown. If you set `SendTimeout` to -1, the timeout will be set to infinity (and thus removed). Removing the send timeout is recommended when using Pulsar's [message de-duplication](cookbooks-deduplication) feature. | 30 seconds
+`SendTimeout` | When publishing a message to a topic, the producer will wait for an acknowledgment from the responsible Pulsar [broker](reference-terminology.md#broker). If a message is not acknowledged within the threshold set by this parameter, an error will be thrown. If you set `SendTimeout` to -1, the timeout will be set to infinity (and thus removed). Removing the send timeout is recommended when using Pulsar's [message de-duplication](cookbooks-deduplication.md) feature. | 30 seconds
 `MaxPendingMessages` | The maximum size of the queue holding pending messages (i.e. messages waiting to receive an acknowledgment from the [broker](reference-terminology.md#broker)). By default, when the queue is full all calls to the `Send` and `SendAsync` methods will fail *unless* `BlockIfQueueFull` is set to `true`. |
 `MaxPendingMessagesAcrossPartitions` | |
 `BlockIfQueueFull` | If set to `true`, the producer's `Send` and `SendAsync` methods will block when the outgoing message queue is full rather than failing and throwing an error (the size of that queue is dictated by the `MaxPendingMessages` parameter); if set to `false` (the default), `Send` and `SendAsync` operations will fail and throw a `ProducerQueueIsFullError` when the queue is full. | `false`
 `MessageRoutingMode` | The message routing logic (for producers on [partitioned topics](concepts-architecture-overview.md#partitioned-topics)). This logic is applied only when no key is set on messages. The available options are: round robin (`pulsar.RoundRobinDistribution`, the default), publishing all messages to a single partition (`pulsar.UseSinglePartition`), or a custom partitioning scheme (`pulsar.CustomPartition`). | `pulsar.RoundRobinDistribution`
 `HashingScheme` | The hashing function that determines the partition on which a particular message is published (partitioned topics only). The available options are: `pulsar.JavaStringHash` (the equivalent of `String.hashCode()` in Java), `pulsar.Murmur3_32Hash` (applies the [Murmur3](https://en.wikipedia.org/wiki/MurmurHash) hashing function), or `pulsar.BoostHash` (applies the hashing function from C++'s [Boost](https://www.boost.org/doc/libs/1_62_0/doc/html/hash.html) library) | `puls [...]
 `CompressionType` | The message data compression type used by the producer. The available options are [`LZ4`](https://github.com/lz4/lz4) and [`ZLIB`](https://zlib.net/). | No compression
-`MessageRouter` | By default, Pulsar uses a round-robin routing scheme for [partitioned topics](cookbooks-partitioned). The `MessageRouter` parameter enables you to specify custom routing logic via a function that takes the Pulsar message and topic metadata as an argument and returns an integer (where the ), i.e. a function signature of `func(Message, TopicMetadata) int`. |
+`MessageRouter` | By default, Pulsar uses a round-robin routing scheme for [partitioned topics](cookbooks-partitioned.md). The `MessageRouter` parameter enables you to specify custom routing logic via a function that takes the Pulsar message and topic metadata as an argument and returns an integer (where the ), i.e. a function signature of `func(Message, TopicMetadata) int`. |
 
 ## Consumers
 
@@ -475,7 +475,7 @@ Parameter | Description
 
 ## TLS encryption and authentication
 
-In order to use [TLS encryption](security-tls-transport), you'll need to configure your client to do so:
+In order to use [TLS encryption](security-tls-transport.md), you'll need to configure your client to do so:
 
  * Use `pulsar+ssl` URL type
  * Set `TLSTrustCertsFilePath` to the path to the TLS certs used by your client and the Pulsar broker
diff --git a/site2/website/versioned_docs/version-2.2.0/client-libraries-java.md b/site2/website/versioned_docs/version-2.2.0/client-libraries-java.md
index 2c349dbf12f..1058b0896fa 100644
--- a/site2/website/versioned_docs/version-2.2.0/client-libraries-java.md
+++ b/site2/website/versioned_docs/version-2.2.0/client-libraries-java.md
@@ -10,7 +10,7 @@ import TabItem from '@theme/TabItem';
 ````
 
 
-You can use a Pulsar Java client to create the Java [producer](#producer), [consumer](#consumer), [reader](#reader) and [TableView](#tableview) of messages and to perform [administrative tasks](admin-api-overview). The current Java client version is **@pulsar:version@**.
+You can use a Pulsar Java client to create the Java [producer](#producer), [consumer](#consumer), [reader](#reader) and [TableView](#tableview) of messages and to perform [administrative tasks](admin-api-overview.md). The current Java client version is **@pulsar:version@**.
 
 All the methods in [producer](#producer), [consumer](#consumer), [reader](#reader) and [TableView](#tableview) of a Java client are thread-safe.
 
@@ -19,10 +19,10 @@ Javadoc for the Pulsar client is divided into two domains by package as follows.
 Package | Description | Maven Artifact
 :-------|:------------|:--------------
 [`org.apache.pulsar.client.api`](/api/client) | [The producer and consumer API](https://pulsar.apache.org/api/client/) | [org.apache.pulsar:pulsar-client:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client%7C@pulsar:version@%7Cjar)
-[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
+[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview.md) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
 `org.apache.pulsar.client.all` |Include both `pulsar-client` and `pulsar-client-admin`<br /> Both `pulsar-client` and `pulsar-client-admin` are shaded packages and they shade dependencies independently. Consequently, the applications using both `pulsar-client` and `pulsar-client-admin` have redundant shaded classes. It would be troublesome if you introduce new dependencies but forget to update shading rules. <br /> In this case, you can use `pulsar-client-all`, which shades dependencies  [...]
 
-This document focuses only on the client API for producing and consuming messages on Pulsar topics. For how to use the Java admin client, see [Pulsar admin interface](admin-api-overview).
+This document focuses only on the client API for producing and consuming messages on Pulsar topics. For how to use the Java admin client, see [Pulsar admin interface](admin-api-overview.md).
 
 ## Installation
 
@@ -69,7 +69,7 @@ dependencies {
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 You can assign Pulsar protocol URLs to specific clusters and use the `pulsar` scheme. The default port is `6650`. The following is an example of `localhost`.
 
@@ -95,7 +95,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you use [TLS](security-tls-authentication) authentication, the URL is as follows. 
+If you use [TLS](security-tls-authentication.md) authentication, the URL is as follows. 
 
 ```http
 
@@ -126,7 +126,7 @@ PulsarClient client = PulsarClient.builder()
 ```
 
 > ### Default broker URLs for standalone clusters
-> If you run a cluster in [standalone mode](getting-started-standalone), the broker is available at the `pulsar://localhost:6650` URL by default.
+> If you run a cluster in [standalone mode](getting-started-standalone.md), the broker is available at the `pulsar://localhost:6650` URL by default.
 
 If you create a client, you can use the `loadConf` configuration. The following parameters are available in `loadConf`.
 
@@ -279,7 +279,7 @@ Currently, cluster-level failover can perform probes to prevent data loss, but i
 
 > #### What are the relationships between cluster-level failover and geo-replication?
 
-The cluster-level failover is an extension of [geo-replication](concepts-replication) to improve stability and robustness. The cluster-level failover depends on geo-replication, and they have some **differences** as below.
+The cluster-level failover is an extension of [geo-replication](concepts-replication.md) to improve stability and robustness. The cluster-level failover depends on geo-replication, and they have some **differences** as below.
 
 Influence |Cluster-level failover|Geo-replication
 |---|---|---
@@ -576,7 +576,7 @@ Producer<byte[]> producer = client.newProducer()
 
 ### Message routing
 
-When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more information on specifying a routing mode using the Java client, see the [Partitioned Topics cookbook](cookbooks-partitioned).
+When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more information on specifying a routing mode using the Java client, see the [Partitioned Topics cookbook](cookbooks-partitioned.md).
 
 ### Async send
 
@@ -1370,7 +1370,7 @@ tv.forEach((key, value) -> /*operations on all existing messages*/)
 
 ## Schema
 
-In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](schema-get-started) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types). If you construct, say, a [producer](#producer) without specifying a schema, then the producer can only produce messages of type `byte[]`. The following is an example.
+In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](schema-get-started.md) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types.md). If you construct, say, a [producer](#producer) without specifying a schema, then the producer can only produce messages of type `byte[]`. The following is an example.
 
 ```java
 
@@ -1488,7 +1488,7 @@ For example of ProtobufNativeSchema, see [`SchemaDefinition` in `Complex type`](
 
 ## Authentication
 
-Pulsar currently supports three authentication schemes: [TLS](security-tls-authentication.md), [Athenz](security-athenz.md), and [Oauth2](security-oauth2). You can use the Pulsar Java client with all of them.
+Pulsar currently supports three authentication schemes: [TLS](security-tls-authentication.md), [Athenz](security-athenz.md), and [Oauth2](security-oauth2.md). You can use the Pulsar Java client with all of them.
 
 ### TLS Authentication
 
@@ -1515,7 +1515,7 @@ PulsarClient client = PulsarClient.builder()
 
 ### Athenz
 
-To use [Athenz](security-athenz) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
+To use [Athenz](security-athenz.md) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
 
 * `tenantDomain`
 * `tenantService`
@@ -1552,7 +1552,7 @@ PulsarClient client = PulsarClient.builder()
 
 ### Oauth2
 
-The following example shows how to use [Oauth2](security-oauth2) as an authentication provider for the Pulsar Java client.
+The following example shows how to use [Oauth2](security-oauth2.md) as an authentication provider for the Pulsar Java client.
 
 You can use the factory method to configure authentication for Pulsar Java client.
 
diff --git a/site2/website/versioned_docs/version-2.2.0/client-libraries-python.md b/site2/website/versioned_docs/version-2.2.0/client-libraries-python.md
index 1d3306c28f6..9de991d4d23 100644
--- a/site2/website/versioned_docs/version-2.2.0/client-libraries-python.md
+++ b/site2/website/versioned_docs/version-2.2.0/client-libraries-python.md
@@ -5,7 +5,7 @@ sidebar_label: "Python"
 original_id: client-libraries-python
 ---
 
-The Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp) and exposes all of the [same features](/api/cpp). You can find the code in the [`python` subdirectory](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
+The Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp.md) and exposes all of the [same features](/api/cpp). You can find the code in the [`python` subdirectory](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
 
 ## Installation
 
diff --git a/site2/website/versioned_docs/version-2.2.0/client-libraries-websocket.md b/site2/website/versioned_docs/version-2.2.0/client-libraries-websocket.md
index 839a5308742..d5d4457b2a7 100644
--- a/site2/website/versioned_docs/version-2.2.0/client-libraries-websocket.md
+++ b/site2/website/versioned_docs/version-2.2.0/client-libraries-websocket.md
@@ -5,14 +5,14 @@ sidebar_label: "WebSocket"
 original_id: client-libraries-websocket
 ---
 
-Pulsar's [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API is meant to provide a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients.md). Through WebSockets you can publish and consume messages and use all the features available in the [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp) client libraries.
+Pulsar's [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API is meant to provide a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients.md). Through WebSockets you can publish and consume messages and use all the features available in the [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp.md) client libraries.
 
 
 > You can use Pulsar's WebSocket API with any WebSocket client library. See examples for Python and Node.js [below](#client-examples).
 
 ## Running the WebSocket service
 
-The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone) already has the WebSocket service enabled.
+The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone.md) already has the WebSocket service enabled.
 
 In non-standalone mode, there are two ways to deploy the WebSocket service:
 
diff --git a/site2/website/versioned_docs/version-2.2.0/client-libraries.md b/site2/website/versioned_docs/version-2.2.0/client-libraries.md
index fbfbfcd1137..a86194d2aab 100644
--- a/site2/website/versioned_docs/version-2.2.0/client-libraries.md
+++ b/site2/website/versioned_docs/version-2.2.0/client-libraries.md
@@ -14,29 +14,29 @@ Pulsar currently has client libraries available for following languages:
 
 ## Java client
 
-For a tutorial on using the Pulsar Java client to produce and consume messages, see [The Pulsar Java client](client-libraries-java).
+For a tutorial on using the Pulsar Java client to produce and consume messages, see [The Pulsar Java client](client-libraries-java.md).
 
 There are also two independent sets of Javadoc API docs available:
 
 Library | Purpose
 :-------|:-------
-[`org.apache.pulsar.client.api`](/api/client) | The [Pulsar Java client](client-libraries-java) for producing and consuming messages on Pulsar topics [`org.apache.pulsar.client.admin`](/api/admin) | The Java client for the [Pulsar admin interface](admin-api-overview.md)
+[`org.apache.pulsar.client.api`](/api/client) | The [Pulsar Java client](client-libraries-java.md) for producing and consuming messages on Pulsar topics [`org.apache.pulsar.client.admin`](/api/admin) | The Java client for the [Pulsar admin interface](admin-api-overview.md)
 
 
 ## Go client
 
-For a tutorial on using the Pulsar Go client, see [The Pulsar Go client](client-libraries-go).
+For a tutorial on using the Pulsar Go client, see [The Pulsar Go client](client-libraries-go.md).
 
 
 ## Python client
 
-For a tutorial on using the Pulsar Python client, see [The Pulsar Python client](client-libraries-python).
+For a tutorial on using the Pulsar Python client, see [The Pulsar Python client](client-libraries-python.md).
 
 There are also [pdoc](https://github.com/BurntSushi/pdoc)-generated API docs for the Python client [here](/api/python).
 
 ## C++ client
 
-For a tutorial on using the Pulsar C++ clent, see [The Pulsar C++ client](client-libraries-cpp).
+For a tutorial on using the Pulsar C++ clent, see [The Pulsar C++ client](client-libraries-cpp.md).
 
 There are also [Doxygen](http://www.stack.nl/~dimitri/doxygen/)-generated API docs for the C++ client [here](/api/cpp).
 
diff --git a/site2/website/versioned_docs/version-2.2.0/concepts-architecture-overview.md b/site2/website/versioned_docs/version-2.2.0/concepts-architecture-overview.md
index 0d96b59f8ae..1ce346fc169 100644
--- a/site2/website/versioned_docs/version-2.2.0/concepts-architecture-overview.md
+++ b/site2/website/versioned_docs/version-2.2.0/concepts-architecture-overview.md
@@ -4,7 +4,7 @@ title: Architecture Overview
 sidebar_label: "Architecture"
 ---
 
-At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication) data amongst themselves.
+At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication.md) data amongst themselves.
 
 In a Pulsar cluster:
 
@@ -16,20 +16,20 @@ The diagram below provides an illustration of a Pulsar cluster:
 
 ![Pulsar architecture diagram](/assets/pulsar-system-architecture.png)
 
-At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication).
+At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication.md).
 
 ## Brokers
 
 The Pulsar message broker is a stateless component that's primarily responsible for running two other components:
 
 * An HTTP server that exposes a {@inject: rest:REST:/} API for both administrative tasks and [topic lookup](concepts-clients.md#client-setup-phase) for producers and consumers. The producers connect to the brokers to publish messages and the consumers connect to the brokers to consume the messages.
-* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol) used for all data transfers
+* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol.md) used for all data transfers
 
 Messages are typically dispatched out of a [managed ledger](#managed-ledgers) cache for the sake of performance, *unless* the backlog exceeds the cache size. If the backlog grows too large for the cache, the broker will start reading entries from BookKeeper.
 
-Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java).
+Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java.md).
 
-> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers) guide.
+> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers.md) guide.
 
 ## Clusters
 
@@ -39,9 +39,9 @@ A Pulsar instance consists of one or more Pulsar *clusters*. Clusters, in turn,
 * A ZooKeeper quorum used for cluster-level configuration and coordination
 * An ensemble of bookies used for [persistent storage](#persistent-storage) of messages
 
-Clusters can replicate amongst themselves using [geo-replication](concepts-replication).
+Clusters can replicate amongst themselves using [geo-replication](concepts-replication.md).
 
-> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters) guide.
+> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters.md) guide.
 
 ## Metadata store
 
@@ -139,17 +139,17 @@ $ bin/pulsar proxy \
 ```
 
 > #### Pulsar proxy docs
-> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy).
+> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy.md).
 
 
 Some important things to know about the Pulsar proxy:
 
 * Connecting clients don't need to provide *any* specific configuration to use the Pulsar proxy. You won't need to update the client configuration for existing applications beyond updating the IP used for the service URL (for example if you're running a load balancer over the Pulsar proxy).
-* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication) is supported by the Pulsar proxy
+* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication.md) is supported by the Pulsar proxy
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL.
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL.
 
 You can use your own service discovery system if you'd like. If you use your own system, there is just one requirement: when a client performs an HTTP request to an endpoint, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to *some* active broker in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
@@ -157,7 +157,7 @@ The diagram below illustrates Pulsar service discovery:
 
 ![alt-text](/assets/pulsar-service-discovery.png)
 
-In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python), for example, could access this Pulsar cluster like this:
+In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python.md), for example, could access this Pulsar cluster like this:
 
 ```python
 
diff --git a/site2/website/versioned_docs/version-2.2.0/concepts-authentication.md b/site2/website/versioned_docs/version-2.2.0/concepts-authentication.md
index 335da8dc5a5..fbefead69f3 100644
--- a/site2/website/versioned_docs/version-2.2.0/concepts-authentication.md
+++ b/site2/website/versioned_docs/version-2.2.0/concepts-authentication.md
@@ -4,5 +4,5 @@ title: Authentication and Authorization
 sidebar_label: "Authentication and Authorization"
 ---
 
-Pulsar supports a pluggable [authentication](security-overview.md) mechanism which can be configured at the proxy and/or the broker. Pulsar also supports a pluggable [authorization](security-authorization) mechanism. These mechanisms work together to identify the client and its access rights on topics, namespaces and tenants.
+Pulsar supports a pluggable [authentication](security-overview.md) mechanism which can be configured at the proxy and/or the broker. Pulsar also supports a pluggable [authorization](security-authorization.md) mechanism. These mechanisms work together to identify the client and its access rights on topics, namespaces and tenants.
 
diff --git a/site2/website/versioned_docs/version-2.2.0/concepts-clients.md b/site2/website/versioned_docs/version-2.2.0/concepts-clients.md
index 65201b5ce1c..c0fe61cd06e 100644
--- a/site2/website/versioned_docs/version-2.2.0/concepts-clients.md
+++ b/site2/website/versioned_docs/version-2.2.0/concepts-clients.md
@@ -4,12 +4,12 @@ title: Pulsar Clients
 sidebar_label: "Clients"
 ---
 
-Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md), [C++](client-libraries-cpp.md) and [C#](client-libraries-dotnet). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
+Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md), [C++](client-libraries-cpp.md) and [C#](client-libraries-dotnet.md). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
 
 Under the hood, the current official Pulsar client libraries support transparent reconnection and/or connection failover to brokers, queuing of messages until acknowledged by the broker, and heuristics such as connection retries with backoff.
 
 > **Custom client libraries**
-> If you'd like to create your own client library, we recommend consulting the documentation on Pulsar's custom [binary protocol](developing-binary-protocol).
+> If you'd like to create your own client library, we recommend consulting the documentation on Pulsar's custom [binary protocol](developing-binary-protocol.md).
 
 
 ## Client setup phase
@@ -37,7 +37,7 @@ Internally, the reader interface is implemented as a consumer using an exclusive
 
 [ **IMPORTANT** ]
 
-Unlike subscription/consumer, readers are non-durable in nature and does not prevent data in a topic from being deleted, thus it is ***strongly*** advised that [data retention](cookbooks-retention-expiry) be configured. If data retention for a topic is not configured for an adequate amount of time, messages that the reader has not yet read might be deleted .  This causes the readers to essentially skip messages. Configuring the data retention for a topic guarantees the reader with a cert [...]
+Unlike subscription/consumer, readers are non-durable in nature and does not prevent data in a topic from being deleted, thus it is ***strongly*** advised that [data retention](cookbooks-retention-expiry.md) be configured. If data retention for a topic is not configured for an adequate amount of time, messages that the reader has not yet read might be deleted .  This causes the readers to essentially skip messages. Configuring the data retention for a topic guarantees the reader with a c [...]
 
 Please also note that a reader can have a "backlog", but the metric is only used for users to know how behind the reader is. The metric is not considered for any backlog quota calculations. 
 
diff --git a/site2/website/versioned_docs/version-2.2.0/concepts-messaging.md b/site2/website/versioned_docs/version-2.2.0/concepts-messaging.md
index 89b6827d73d..11b15cf814a 100644
--- a/site2/website/versioned_docs/version-2.2.0/concepts-messaging.md
+++ b/site2/website/versioned_docs/version-2.2.0/concepts-messaging.md
@@ -22,8 +22,8 @@ Messages are the basic "unit" of Pulsar. The following table lists the component
 
 Component | Description
 :---------|:-------
-Value / data payload | The data carried by the message. All Pulsar messages contain raw bytes, although message data can also conform to data [schemas](schema-get-started).
-Key | The key (string type) of the message. It is a short name of message key or partition key. Messages are optionally tagged with keys, which is useful for features like [topic compaction](concepts-topic-compaction).
+Value / data payload | The data carried by the message. All Pulsar messages contain raw bytes, although message data can also conform to data [schemas](schema-get-started.md).
+Key | The key (string type) of the message. It is a short name of message key or partition key. Messages are optionally tagged with keys, which is useful for features like [topic compaction](concepts-topic-compaction.md).
 Properties | An optional key/value map of user-defined properties.
 Producer name | The name of the producer who produces the message. If you do not specify a producer name, the default name is used. 
 Topic name | The name of the topic that the message is published to.
@@ -53,7 +53,7 @@ The default size of a message is 5 MB. You can configure the max size of a messa
   
   ```
 
-> For more information on Pulsar messages, see Pulsar [binary protocol](developing-binary-protocol).
+> For more information on Pulsar messages, see Pulsar [binary protocol](developing-binary-protocol.md).
 
 ## Producers
 
@@ -171,7 +171,7 @@ Messages are received from [brokers](reference-terminology.md#broker) either syn
 
 ### Listeners
 
-Client libraries provide listener implementation for consumers. For example, the [Java client](client-libraries-java) provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
+Client libraries provide listener implementation for consumers. For example, the [Java client](client-libraries-java.md) provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
 
 ### Acknowledgement
 
@@ -656,7 +656,7 @@ A [subscription](#subscriptions) can have one or more consumers. When a consumer
 
 #### When to use
 
-By default, messages of a topic without any durable subscriptions are marked as deleted. If you want to prevent the messages being marked as deleted, you can create a durable subscription for this topic. In this case, only acknowledged messages are marked as deleted. For more information, see [message retention and expiry](cookbooks-retention-expiry).
+By default, messages of a topic without any durable subscriptions are marked as deleted. If you want to prevent the messages being marked as deleted, you can create a durable subscription for this topic. In this case, only acknowledged messages are marked as deleted. For more information, see [message retention and expiry](cookbooks-retention-expiry.md).
 
 #### How to use
 
@@ -760,7 +760,7 @@ Decisions about routing and subscription modes can be made separately in most ca
 
 There is no difference between partitioned topics and normal topics in terms of how subscription types work, as partitioning only determines what happens between when a message is published by a producer and processed and acknowledged by a consumer.
 
-Partitioned topics need to be explicitly created via the [admin API](admin-api-overview). The number of partitions can be specified when creating the topic.
+Partitioned topics need to be explicitly created via the [admin API](admin-api-overview.md). The number of partitions can be specified when creating the topic.
 
 ### Routing modes
 
@@ -772,7 +772,7 @@ Mode     | Description
 :--------|:------------
 `RoundRobinPartition` | If no key is provided, the producer will publish messages across all partitions in round-robin fashion to achieve maximum throughput. Please note that round-robin is not done per individual message but rather it's set to the same boundary of batching delay, to ensure batching is effective. While if a key is specified on the message, the partitioned producer will hash the key and assign message to a particular partition. This is the default mode. 
 `SinglePartition`     | If no key is provided, the producer will randomly pick one single partition and publish all the messages into that partition. While if a key is specified on the message, the partitioned producer will hash the key and assign message to a particular partition.
-`CustomPartition`     | Use custom message router implementation that will be called to determine the partition for a particular message. User can create a custom routing mode by using the [Java client](client-libraries-java) and implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
+`CustomPartition`     | Use custom message router implementation that will be called to determine the partition for a particular message. User can create a custom routing mode by using the [Java client](client-libraries-java.md) and implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
 
 ### Ordering guarantee
 
@@ -810,7 +810,7 @@ non-persistent://tenant/namespace/topic
 
 ```
 
-> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent).
+> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent.md).
 
 In non-persistent topics, brokers immediately deliver messages to all connected subscribers *without persisting them* in [BookKeeper](concepts-architecture-overview.md#persistent-storage). If a subscriber is disconnected, the broker will not be able to deliver those in-transit messages, and subscribers will never be able to receive those messages again. Eliminating the persistent storage step makes messaging on non-persistent topics slightly faster than on persistent topics in some cases [...]
 
@@ -881,7 +881,7 @@ Pulsar has two features, however, that enable you to override this default behav
 * Message **retention** enables you to store messages that have been acknowledged by a consumer
 * Message **expiry** enables you to set a time to live (TTL) for messages that have not yet been acknowledged
 
-> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry) cookbook.
+> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry.md) cookbook.
 
 The diagram below illustrates both concepts:
 
@@ -904,12 +904,12 @@ Message deduplication is disabled in the scenario shown at the top. Here, a prod
 
 In the second scenario at the bottom, the producer publishes message 1, which is received by the broker and persisted, as in the first scenario. When the producer attempts to publish the message again, however, the broker knows that it has already seen message 1 and thus does not persist the message.
 
-> Message deduplication is handled at the namespace level or the topic level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication).
+> Message deduplication is handled at the namespace level or the topic level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication.md).
 
 
 ### Producer idempotency
 
-The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, so you do not need to modify your Pulsar client code. Instead, you only need to make administrative changes. For details, see [Managing m [...]
+The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, so you do not need to modify your Pulsar client code. Instead, you only need to make administrative changes. For details, see [Managing m [...]
 
 ### Deduplication and effectively-once semantics
 
diff --git a/site2/website/versioned_docs/version-2.2.0/concepts-multi-tenancy.md b/site2/website/versioned_docs/version-2.2.0/concepts-multi-tenancy.md
index 8a17e72a4c8..26bd6a2fd18 100644
--- a/site2/website/versioned_docs/version-2.2.0/concepts-multi-tenancy.md
+++ b/site2/website/versioned_docs/version-2.2.0/concepts-multi-tenancy.md
@@ -4,7 +4,7 @@ title: Multi Tenancy
 sidebar_label: "Multi Tenancy"
 ---
 
-Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
+Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview.md) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
 
 The multi-tenant nature of Pulsar is reflected mostly visibly in topic URLs, which have this structure:
 
@@ -20,7 +20,7 @@ As you can see, the tenant is the most basic unit of categorization for topics (
 
 To each tenant in a Pulsar instance you can assign:
 
-* An [authorization](security-authorization) scheme
+* An [authorization](security-authorization.md) scheme
 * The set of [clusters](reference-terminology.md#cluster) to which the tenant's configuration applies
 
 ## Namespaces
@@ -28,7 +28,7 @@ To each tenant in a Pulsar instance you can assign:
 Tenants and namespaces are two key concepts of Pulsar to support multi-tenancy.
 
 * Pulsar is provisioned for specified tenants with appropriate capacity allocated to the tenant.
-* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
+* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
 
 Names for topics in the same namespace will look like this:
 
diff --git a/site2/website/versioned_docs/version-2.2.0/concepts-overview.md b/site2/website/versioned_docs/version-2.2.0/concepts-overview.md
index 119d46508ed..bf4993a3110 100644
--- a/site2/website/versioned_docs/version-2.2.0/concepts-overview.md
+++ b/site2/website/versioned_docs/version-2.2.0/concepts-overview.md
@@ -8,15 +8,15 @@ Pulsar is a multi-tenant, high-performance solution for server-to-server messagi
 
 Key features of Pulsar are listed below:
 
-* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo) of messages across clusters.
+* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo.md) of messages across clusters.
 * Very low publish and end-to-end latency.
 * Seamless scalability to over a million topics.
-* A simple [client API](concepts-clients.md) with bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp).
+* A simple [client API](concepts-clients.md) with bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp.md).
 * Multiple [subscription types](concepts-messaging.md#subscription-types) ([exclusive](concepts-messaging.md#exclusive), [shared](concepts-messaging.md#shared), and [failover](concepts-messaging.md#failover)) for topics.
 * Guaranteed message delivery with [persistent message storage](concepts-architecture-overview.md#persistent-storage) provided by [Apache BookKeeper](http://bookkeeper.apache.org/).
-* A serverless light-weight computing framework [Pulsar Functions](functions-overview) offers the capability for stream-native data processing.
-* A serverless connector framework [Pulsar IO](io-overview), which is built on Pulsar Functions, makes it easier to move data in and out of Apache Pulsar.
-* [Tiered Storage](concepts-tiered-storage) offloads data from hot/warm storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
+* A serverless light-weight computing framework [Pulsar Functions](functions-overview.md) offers the capability for stream-native data processing.
+* A serverless connector framework [Pulsar IO](io-overview.md), which is built on Pulsar Functions, makes it easier to move data in and out of Apache Pulsar.
+* [Tiered Storage](concepts-tiered-storage.md) offloads data from hot/warm storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
 
 ## Contents
 
diff --git a/site2/website/versioned_docs/version-2.2.0/concepts-replication.md b/site2/website/versioned_docs/version-2.2.0/concepts-replication.md
index d4653ca7aec..9cc3a7c3415 100644
--- a/site2/website/versioned_docs/version-2.2.0/concepts-replication.md
+++ b/site2/website/versioned_docs/version-2.2.0/concepts-replication.md
@@ -8,7 +8,7 @@ Regardless of industries, when an unforeseen event occurs and brings day-to-day
 
 Pulsar's geo-replication mechanism is typically used for disaster recovery, enabling the replication of persistently stored message data across multiple data centers. For instance, your application is publishing data in one region and you would like to process it for consumption in other regions. With Pulsar’s geo-replication mechanism, messages can be produced and consumed in different geo-locations. 
 
-The diagram below illustrates the process of [geo-replication](administration-geo). Whenever three producers (P1, P2 and P3) respectively publish messages to the T1 topic in three clusters, those messages are instantly replicated across clusters. Once the messages are replicated, two consumers (C1 and C2) can consume those messages from their clusters.
+The diagram below illustrates the process of [geo-replication](administration-geo.md). Whenever three producers (P1, P2 and P3) respectively publish messages to the T1 topic in three clusters, those messages are instantly replicated across clusters. Once the messages are replicated, two consumers (C1 and C2) can consume those messages from their clusters.
 
 ![A typical geo-replication example with full-mesh pattern](/assets/full-mesh-replication.svg)
 
diff --git a/site2/website/versioned_docs/version-2.2.0/concepts-tiered-storage.md b/site2/website/versioned_docs/version-2.2.0/concepts-tiered-storage.md
index f0bbde61718..ec031253ccd 100644
--- a/site2/website/versioned_docs/version-2.2.0/concepts-tiered-storage.md
+++ b/site2/website/versioned_docs/version-2.2.0/concepts-tiered-storage.md
@@ -14,4 +14,4 @@ One way to alleviate this cost is to use Tiered Storage. With tiered storage, ol
 
 Pulsar currently supports S3, Google Cloud Storage (GCS), and filesystem for [long term store](https://pulsar.apache.org/docs/en/cookbooks-tiered-storage/). Offloading to long term storage triggered via a Rest API or command line interface. The user passes in the amount of topic data they wish to retain on BookKeeper, and the broker will copy the backlog data to long term storage. The original data will then be deleted from BookKeeper after a configured delay (4 hours by default).
 
-> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage).
+> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage.md).
diff --git a/site2/website/versioned_docs/version-2.2.0/concepts-topic-compaction.md b/site2/website/versioned_docs/version-2.2.0/concepts-topic-compaction.md
index 790ce76b7c5..300cf68956d 100644
--- a/site2/website/versioned_docs/version-2.2.0/concepts-topic-compaction.md
+++ b/site2/website/versioned_docs/version-2.2.0/concepts-topic-compaction.md
@@ -6,7 +6,7 @@ sidebar_label: "Topic Compaction"
 
 Pulsar was built with highly scalable [persistent storage](concepts-architecture-overview.md#persistent-storage) of message data as a primary objective. Pulsar topics enable you to persistently store as many unacknowledged messages as you need while preserving message ordering. By default, Pulsar stores *all* unacknowledged/unprocessed messages produced on a topic. Accumulating many unacknowledged messages on a topic is necessary for many Pulsar use cases but it can also be very time int [...]
 
-> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction).
+> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction.md).
 
 For some use cases consumers don't need a complete "image" of the topic log. They may only need a few values to construct a more "shallow" image of the log, perhaps even just the most recent value. For these kinds of use cases Pulsar offers **topic compaction**. When you run compaction on a topic, Pulsar goes through a topic's backlog and removes messages that are *obscured* by later messages, i.e. it goes through the topic on a per-key basis and leaves only the most recent message assoc [...]
 
@@ -23,7 +23,7 @@ Pulsar's topic compaction feature:
 
 ## How topic compaction works
 
-When topic compaction is triggered [via the CLI](cookbooks-compaction), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
+When topic compaction is triggered [via the CLI](cookbooks-compaction.md), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
 
 After that, the broker will create a new [BookKeeper ledger](concepts-architecture-overview.md#ledgers) and make a second iteration through each message on the topic. For each message, if the key matches the latest occurrence of that key, then the key's data payload, message ID, and metadata will be written to the newly created ledger. If the key doesn't match the latest then the message will be skipped and left alone. If any given message has an empty payload, it will be skipped and con [...]
 
diff --git a/site2/website/versioned_docs/version-2.2.0/cookbooks-compaction.md b/site2/website/versioned_docs/version-2.2.0/cookbooks-compaction.md
index 0720019aaa0..214e899fa08 100644
--- a/site2/website/versioned_docs/version-2.2.0/cookbooks-compaction.md
+++ b/site2/website/versioned_docs/version-2.2.0/cookbooks-compaction.md
@@ -44,7 +44,7 @@ Configuring the compaction threshold on a namespace will apply to all topics wit
 
 ## Triggering compaction manually
 
-In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin) CLI tool. Here's an example:
+In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. Here's an example:
 
 ```bash
 
diff --git a/site2/website/versioned_docs/version-2.2.0/cookbooks-non-persistent.md b/site2/website/versioned_docs/version-2.2.0/cookbooks-non-persistent.md
index d40c4fbd0cf..1346d19a042 100644
--- a/site2/website/versioned_docs/version-2.2.0/cookbooks-non-persistent.md
+++ b/site2/website/versioned_docs/version-2.2.0/cookbooks-non-persistent.md
@@ -40,7 +40,7 @@ $ bin/pulsar-client produce non-persistent://public/default/example-np-topic \
 
 ```
 
-> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-topics) guide.
+> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-topics.md) guide.
 
 ## Enabling
 
@@ -54,7 +54,7 @@ If you'd like to enable *only* non-persistent topics in a broker, you can set th
 
 ## Managing with cli
 
-Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin) non-persistent topics under a namespace, and more.
+Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin.md) non-persistent topics under a namespace, and more.
 
 ## Using with Pulsar clients
 
diff --git a/site2/website/versioned_docs/version-2.2.0/cookbooks-partitioned.md b/site2/website/versioned_docs/version-2.2.0/cookbooks-partitioned.md
index 25896934788..c857d019edc 100644
--- a/site2/website/versioned_docs/version-2.2.0/cookbooks-partitioned.md
+++ b/site2/website/versioned_docs/version-2.2.0/cookbooks-partitioned.md
@@ -3,4 +3,4 @@ id: cookbooks-partitioned
 title: Partitioned topics
 sidebar_label: "Partitioned Topics"
 ---
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.2.0/cookbooks-retention-expiry.md b/site2/website/versioned_docs/version-2.2.0/cookbooks-retention-expiry.md
index 86160c3f7ec..cd764fad6eb 100644
--- a/site2/website/versioned_docs/version-2.2.0/cookbooks-retention-expiry.md
+++ b/site2/website/versioned_docs/version-2.2.0/cookbooks-retention-expiry.md
@@ -21,7 +21,7 @@ In Pulsar, you can modify this behavior, with namespace granularity, in two ways
 * You can persistently store messages that are not within a backlog (because they've been acknowledged by on every existing subscription, or because there are no subscriptions) by setting [retention policies](#retention-policies).
 * Messages that are not acknowledged within a specified timeframe can be automatically acknowledged, by specifying the [time to live](#time-to-live-ttl) (TTL).
 
-Pulsar's [admin interface](admin-api-overview) enables you to manage both retention policies and TTL with namespace granularity (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
+Pulsar's [admin interface](admin-api-overview.md) enables you to manage both retention policies and TTL with namespace granularity (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
 
 
 > #### Retention and TTL solve two different problems
diff --git a/site2/website/versioned_docs/version-2.2.0/deploy-aws.md b/site2/website/versioned_docs/version-2.2.0/deploy-aws.md
index 5c25f945df1..4ab2ea841af 100644
--- a/site2/website/versioned_docs/version-2.2.0/deploy-aws.md
+++ b/site2/website/versioned_docs/version-2.2.0/deploy-aws.md
@@ -5,7 +5,7 @@ sidebar_label: "Amazon Web Services"
 original_id: deploy-aws
 ---
 
-> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster).
+> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster.md).
 
 One of the easiest ways to get a Pulsar [cluster](reference-terminology.md#cluster) running on [Amazon Web Services](https://aws.amazon.com/) (AWS) is to use the the [Terraform](https://terraform.io) infrastructure provisioning tool and the [Ansible](https://www.ansible.com) server automation tool. Terraform can create the resources necessary to run the Pulsar cluster---[EC2](https://aws.amazon.com/ec2/) instances, networking and security infrastructure, etc.---while Ansible can install  [...]
 
diff --git a/site2/website/versioned_docs/version-2.2.0/deploy-bare-metal-multi-cluster.md b/site2/website/versioned_docs/version-2.2.0/deploy-bare-metal-multi-cluster.md
index 072c592037c..42eb52cd467 100644
--- a/site2/website/versioned_docs/version-2.2.0/deploy-bare-metal-multi-cluster.md
+++ b/site2/website/versioned_docs/version-2.2.0/deploy-bare-metal-multi-cluster.md
@@ -9,17 +9,17 @@ original_id: deploy-bare-metal-multi-cluster
 
 1. Single-cluster Pulsar installations should be sufficient for all but the most ambitious use cases. If you're interested in experimenting with
 Pulsar or using it in a startup or on a single team, we recommend opting for a single cluster. For instructions on deploying a single cluster,
-see the guide [here](deploy-bare-metal).
-2. If you want to use all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
+see the guide [here](deploy-bare-metal.md).
+2. If you want to use all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
 package and make sure it is installed under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you
-have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
-3. If you want to use [Tiered Storage](concepts-tiered-storage) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`
+have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
+3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`
 package and make sure it is installed under `offloaders` directory in the pulsar directory on every broker node. For more details of how to configure
-this feature, you could reference this [Tiered storage cookbook](cookbooks-tiered-storage).
+this feature, you could reference this [Tiered storage cookbook](cookbooks-tiered-storage.md).
 
 :::
 
-A Pulsar *instance* consists of multiple Pulsar clusters working in unison. Clusters can be distributed across data centers or geographical regions and can replicate amongst themselves using [geo-replication](administration-geo). Deploying a multi-cluster Pulsar instance involves the following basic steps:
+A Pulsar *instance* consists of multiple Pulsar clusters working in unison. Clusters can be distributed across data centers or geographical regions and can replicate amongst themselves using [geo-replication](administration-geo.md). Deploying a multi-cluster Pulsar instance involves the following basic steps:
 
 * Deploying two separate [ZooKeeper](#deploying-zookeeper) quorums: a [local](#deploying-local-zookeeper) quorum for each cluster in the instance and a [configuration store](#configuration-store) quorum for instance-wide tasks
 * Initializing [cluster metadata](#cluster-metadata-initialization) for each cluster
@@ -29,7 +29,7 @@ A Pulsar *instance* consists of multiple Pulsar clusters working in unison. Clus
 If you're deploying a single Pulsar cluster, see the [Clusters and Brokers](getting-started-standalone.md#starting-the-cluster) guide.
 
 > #### Running Pulsar locally or on Kubernetes?
-> This guide shows you how to deploy Pulsar in production in a non-Kubernetes. If you'd like to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you're looking to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes) guide, which includes sections on running Pulsar on Kubernetes on [Google Kubernetes Engine](deploy-kubernetes#pulsar-on- [...]
+> This guide shows you how to deploy Pulsar in production in a non-Kubernetes. If you'd like to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you're looking to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes.md) guide, which includes sections on running Pulsar on Kubernetes on [Google Kubernetes Engine](deploy-kubernetes#pulsar- [...]
 
 ## System requirement
 Currently, Pulsar is available for 64-bit **macOS**, **Linux**, and **Windows**. To use Pulsar, you need to install 64-bit JRE/JDK 8 or later versions.
@@ -246,7 +246,7 @@ As you can see from the example above, the following needs to be specified:
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
+If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
 
 Make sure to run `initialize-cluster-metadata` for each cluster in your instance.
 
@@ -347,17 +347,17 @@ $ bin/pulsar broker
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL. Pulsar provides a built-in service discovery mechanism that you can set up using the instructions [immediately below](#service-discovery-setup).
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL. Pulsar provides a built-in service discovery mechanism that you can set up using the instructions [immediately below](#service-discovery-setup).
 
-You can also use your own service discovery system if you'd like. If you use your own system, there is just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to *some* active broker in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
+You can also use your own service discovery system if you'd like. If you use your own system, there is just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration.md) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to *some* active broker in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
 > #### Service discovery already provided by many scheduling systems
-> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes), have service discovery systems built in. If you're running Pulsar on such a system, you may not need to provide your own service discovery mechanism.
+> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes.md), have service discovery systems built in. If you're running Pulsar on such a system, you may not need to provide your own service discovery mechanism.
 
 
 ### Service discovery setup
 
-The service discovery mechanism included with Pulsar maintains a list of active brokers, stored in ZooKeeper, and supports lookup using HTTP and also Pulsar's [binary protocol](developing-binary-protocol).
+The service discovery mechanism included with Pulsar maintains a list of active brokers, stored in ZooKeeper, and supports lookup using HTTP and also Pulsar's [binary protocol](developing-binary-protocol.md).
 
 To get started setting up Pulsar's built-in service discovery, you need to change a few parameters in the [`conf/discovery.conf`](reference-configuration.md#service-discovery) configuration file. Set the [`zookeeperServers`](reference-configuration.md#service-discovery-zookeeperServers) parameter to the cluster's ZooKeeper quorum connection string and the [`configurationStoreServers`](reference-configuration.md#service-discovery-configurationStoreServers) setting to the [configuration
 store](reference-terminology.md#configuration-store) quorum connection string.
@@ -382,7 +382,7 @@ $ bin/pulsar-daemon start discovery
 
 ## Admin client and verification
 
-At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
+At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview.md) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
 
 The most important thing is that you point the [`serviceUrl`](reference-configuration.md#client-serviceUrl) parameter to the correct service URL for the cluster:
 
diff --git a/site2/website/versioned_docs/version-2.2.0/deploy-bare-metal.md b/site2/website/versioned_docs/version-2.2.0/deploy-bare-metal.md
index f6ed8591358..c17d34c1a74 100644
--- a/site2/website/versioned_docs/version-2.2.0/deploy-bare-metal.md
+++ b/site2/website/versioned_docs/version-2.2.0/deploy-bare-metal.md
@@ -9,13 +9,13 @@ original_id: deploy-bare-metal
 
 1. Single-cluster Pulsar installations should be sufficient for all but the most ambitious use cases. If you're interested in experimenting with
 Pulsar or using it in a startup or on a single team, we recommend opting for a single cluster. If you do need to run a multi-cluster Pulsar instance,
-however, see the guide [here](deploy-bare-metal-multi-cluster).
-2. If you want to use all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
+however, see the guide [here](deploy-bare-metal-multi-cluster.md).
+2. If you want to use all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
 package and make sure it is installed under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you
-have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
-3. If you want to use [Tiered Storage](concepts-tiered-storage) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`
+have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
+3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`
 package and make sure it is installed under `offloaders` directory in the pulsar directory on every broker node. For more details of how to configure
-this feature, you could reference this [Tiered storage cookbook](cookbooks-tiered-storage).
+this feature, you could reference this [Tiered storage cookbook](cookbooks-tiered-storage.md).
 
 :::
 
@@ -257,9 +257,9 @@ Flag | Description
 `--zookeeper` | A "local" ZooKeeper connection string for the cluster. This connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--configuration-store` | The configuration store connection string for the entire instance. As with the `--zookeeper` flag, this connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--web-service-url` | The web service URL for the cluster, plus a port. This URL should be a standard DNS name. The default port is 8080 (we don't recommend using a different port).
-`--web-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
+`--web-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
 `--broker-service-url` | A broker service URL enabling interaction with the brokers in the cluster. This URL should use the same DNS name as the web service URL but should use the `pulsar` scheme instead. The default port is 6650 (we don't recommend using a different port).
-`--broker-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
+`--broker-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
 
 ## Deploying a BookKeeper cluster
 
@@ -340,7 +340,7 @@ clusterName=pulsar-cluster-1
 
 ### Enabling Pulsar Functions (optional)
 
-If you want to enable [Pulsar Functions](functions-overview), you can follow the instructions as below:
+If you want to enable [Pulsar Functions](functions-overview.md), you can follow the instructions as below:
 
 1. Edit `conf/broker.conf` to enable function worker, by setting `functionsWorkerEnabled` to `true`.
 
diff --git a/site2/website/versioned_docs/version-2.2.0/deploy-dcos.md b/site2/website/versioned_docs/version-2.2.0/deploy-dcos.md
index 4fa966ddc88..e0fbeae72e4 100644
--- a/site2/website/versioned_docs/version-2.2.0/deploy-dcos.md
+++ b/site2/website/versioned_docs/version-2.2.0/deploy-dcos.md
@@ -7,7 +7,7 @@ original_id: deploy-dcos
 
 :::tip
 
-If you want to enable all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you can choose to use `apachepulsar/pulsar-all` image instead of
+If you want to enable all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you can choose to use `apachepulsar/pulsar-all` image instead of
 `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 :::
diff --git a/site2/website/versioned_docs/version-2.2.0/deploy-kubernetes.md b/site2/website/versioned_docs/version-2.2.0/deploy-kubernetes.md
index 4e170dcd471..7455247c901 100644
--- a/site2/website/versioned_docs/version-2.2.0/deploy-kubernetes.md
+++ b/site2/website/versioned_docs/version-2.2.0/deploy-kubernetes.md
@@ -5,6 +5,6 @@ sidebar_label: "Kubernetes"
 ---
 
 To get up and running with these charts as fast as possible, in a **non-production** use case, we provide
-a [quick start guide](getting-started-helm) for Proof of Concept (PoC) deployments.
+a [quick start guide](getting-started-helm.md) for Proof of Concept (PoC) deployments.
 
-To configure and install a Pulsar cluster on Kubernetes for production usage, follow the complete [Installation Guide](helm-install).
\ No newline at end of file
+To configure and install a Pulsar cluster on Kubernetes for production usage, follow the complete [Installation Guide](helm-install.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.2.0/deploy-monitoring.md b/site2/website/versioned_docs/version-2.2.0/deploy-monitoring.md
index adf3587b7ae..d581fe2edfa 100644
--- a/site2/website/versioned_docs/version-2.2.0/deploy-monitoring.md
+++ b/site2/website/versioned_docs/version-2.2.0/deploy-monitoring.md
@@ -112,7 +112,7 @@ http://$FUNCTIONS_WORKER_ADDRESS:$WORKER_PORT/metrics:
 
 You can use Prometheus to collect all the metrics exposed for Pulsar components and set up [Grafana](https://grafana.com/) dashboards to display the metrics and monitor your Pulsar cluster. For details, refer to [Prometheus guide](https://prometheus.io/docs/introduction/getting_started/).
 
-When you run Pulsar on bare metal, you can provide the list of nodes to be probed. When you deploy Pulsar in a Kubernetes cluster, the monitoring is setup automatically. For details, refer to [Kubernetes instructions](helm-deploy). 
+When you run Pulsar on bare metal, you can provide the list of nodes to be probed. When you deploy Pulsar in a Kubernetes cluster, the monitoring is setup automatically. For details, refer to [Kubernetes instructions](helm-deploy.md). 
 
 ## Dashboards
 
@@ -120,7 +120,7 @@ When you collect time series statistics, the major problem is to make sure the n
 
 ### Pulsar per-topic dashboard
 
-The per-topic dashboard instructions are available at [Pulsar manager](administration-pulsar-manager).
+The per-topic dashboard instructions are available at [Pulsar manager](administration-pulsar-manager.md).
 
 ### Grafana
 
diff --git a/site2/website/versioned_docs/version-2.2.0/develop-schema.md b/site2/website/versioned_docs/version-2.2.0/develop-schema.md
index e71c04ef60d..2d4461a5ea2 100644
--- a/site2/website/versioned_docs/version-2.2.0/develop-schema.md
+++ b/site2/website/versioned_docs/version-2.2.0/develop-schema.md
@@ -5,7 +5,7 @@ sidebar_label: "Custom schema storage"
 original_id: develop-schema
 ---
 
-By default, Pulsar stores data type [schemas](concepts-schema-registry) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
+By default, Pulsar stores data type [schemas](concepts-schema-registry.md) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
 
 In order to use a non-default (i.e. non-BookKeeper) storage system for Pulsar schemas, you need to implement two Java interfaces: [`SchemaStorage`](#schemastorage-interface) and [`SchemaStorageFactory`](#schemastoragefactory-interface).
 
diff --git a/site2/website/versioned_docs/version-2.2.0/functions-api.md b/site2/website/versioned_docs/version-2.2.0/functions-api.md
index e9f1ffd4407..c0c25f9e8a8 100644
--- a/site2/website/versioned_docs/version-2.2.0/functions-api.md
+++ b/site2/website/versioned_docs/version-2.2.0/functions-api.md
@@ -5,9 +5,9 @@ sidebar_label: "API"
 original_id: functions-api
 ---
 
-[Pulsar Functions](functions-overview) provides an easy-to-use API that developers can use to create and manage processing logic for the Apache Pulsar messaging system. With Pulsar Functions, you can write functions of any level of complexity in [Java](#functions-for-java) or [Python](#functions-for-python) and run them in conjunction with a Pulsar cluster without needing to run a separate stream processing engine.
+[Pulsar Functions](functions-overview.md) provides an easy-to-use API that developers can use to create and manage processing logic for the Apache Pulsar messaging system. With Pulsar Functions, you can write functions of any level of complexity in [Java](#functions-for-java) or [Python](#functions-for-python) and run them in conjunction with a Pulsar cluster without needing to run a separate stream processing engine.
 
-> For a more in-depth overview of the Pulsar Functions feature, see the [Pulsar Functions overview](functions-overview).
+> For a more in-depth overview of the Pulsar Functions feature, see the [Pulsar Functions overview](functions-overview.md).
 
 ## Core programming model
 
@@ -45,7 +45,7 @@ Some things to note about this Pulsar Function:
 
 ### Example deployment
 
-Deploying Pulsar Functions is handled by the [`pulsar-admin`](reference-pulsar-admin) CLI tool, in particular the [`functions`](reference-pulsar-admin.md#functions) command. Here's an example command that would run our [sanitizer](#example-function) function from above in [local run](functions-deploying.md#local-run-mode) mode:
+Deploying Pulsar Functions is handled by the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool, in particular the [`functions`](reference-pulsar-admin.md#functions) command. Here's an example command that would run our [sanitizer](#example-function) function from above in [local run](functions-deploying.md#local-run-mode) mode:
 
 ```bash
 
@@ -61,7 +61,7 @@ $ bin/pulsar-admin functions localrun \
 
 ```
 
-For instructions on running functions in your Pulsar cluster, see the [Deploying Pulsar Functions](functions-deploying) guide.
+For instructions on running functions in your Pulsar cluster, see the [Deploying Pulsar Functions](functions-deploying.md) guide.
 
 ### Available APIs
 
@@ -101,7 +101,7 @@ Pulsar Functions can take byte arrays as inputs and spit out byte arrays as outp
 * [SerDe](#SerDe)
 
 ### Schema Registry
-Pulsar has a built in [Schema Registry](concepts-schema-registry) and comes bundled with a variety of popular schema types(avro, json and protobuf). Pulsar Functions can leverage existing schema information from input topics to derive the input type. The same applies for output topic as well.
+Pulsar has a built in [Schema Registry](concepts-schema-registry.md) and comes bundled with a variety of popular schema types(avro, json and protobuf.md). Pulsar Functions can leverage existing schema information from input topics to derive the input type. The same applies for output topic as well.
 
 ### SerDe
 
@@ -553,7 +553,7 @@ public class MetricRecorderFunction implements Function<Integer, Void> {
 
 ```
 
-> For instructions on reading and using metrics, see the [Monitoring](deploy-monitoring) guide.
+> For instructions on reading and using metrics, see the [Monitoring](deploy-monitoring.md) guide.
 
 
 ## Functions for Python
@@ -565,7 +565,7 @@ Writing Pulsar Functions in Python entails implementing one of two things:
 
 ### Getting started
 
-Regardless of which [deployment mode](functions-deploying) you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.
+Regardless of which [deployment mode](functions-deploying.md) you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.
 
 That could be your local machine for [local run mode](functions-deploying.md#local-run-mode) or a machine running a Pulsar [broker](reference-terminology.md#broker) for [cluster mode](functions-deploying.md#cluster-mode). To install those libraries using pip:
 
diff --git a/site2/website/versioned_docs/version-2.2.0/functions-deploying.md b/site2/website/versioned_docs/version-2.2.0/functions-deploying.md
index 19565c1c438..d5395324ef8 100644
--- a/site2/website/versioned_docs/version-2.2.0/functions-deploying.md
+++ b/site2/website/versioned_docs/version-2.2.0/functions-deploying.md
@@ -19,8 +19,8 @@ Cluster mode | The function runs *inside of* your Pulsar cluster, on the same ma
 
 In order to deploy and manage Pulsar Functions, you need to have a Pulsar cluster running. There are several options for this:
 
-* You can run a [standalone cluster](getting-started-standalone) locally on your own machine
-* You can deploy a Pulsar cluster on [Kubernetes](deploy-kubernetes.md), [Amazon Web Services](deploy-aws.md), [bare metal](deploy-bare-metal), [DC/OS](https://dcos.io/), and more
+* You can run a [standalone cluster](getting-started-standalone.md) locally on your own machine
+* You can deploy a Pulsar cluster on [Kubernetes](deploy-kubernetes.md), [Amazon Web Services](deploy-aws.md), [bare metal](deploy-bare-metal.md), [DC/OS](https://dcos.io/), and more
 
 If you're running a non-[standalone](reference-terminology.md#standalone) cluster, you'll need to obtain the service URL for the cluster. How you obtain the service URL will depend on how you deployed your Pulsar cluster.
 
@@ -52,7 +52,7 @@ Function name | Whichever value is specified for the class name (minus org, libr
 Tenant | Derived from the input topics' names. If the input topics are under the `marketing` tenant---i.e. the topic names have the form `persistent://marketing/{namespace}/{topicName}`---then the tenant will be `marketing`.
 Namespace | Derived from the input topics' names. If the input topics are under the `asia` namespace under the `marketing` tenant---i.e. the topic names have the form `persistent://marketing/asia/{topicName}`, then the namespace will be `asia`.
 Output topic | `{input topic}-{function name}-output`. A function with an input topic name of `incoming` and a function name of `exclamation`, for example, would have an output topic of `incoming-exclamation-output`.
-Subscription type | For at-least-once and at-most-once [processing guarantees](functions-guarantees), the [`SHARED`](concepts-messaging.md#shared) is applied by default; for effectively-once guarantees, [`FAILOVER`](concepts-messaging.md#failover) is applied
+Subscription type | For at-least-once and at-most-once [processing guarantees](functions-guarantees.md), the [`SHARED`](concepts-messaging.md#shared) is applied by default; for effectively-once guarantees, [`FAILOVER`](concepts-messaging.md#failover) is applied
 Processing guarantees | [`ATLEAST_ONCE`](functions-guarantees.md)
 Pulsar service URL | `pulsar://localhost:6650`
 
diff --git a/site2/website/versioned_docs/version-2.2.0/functions-overview.md b/site2/website/versioned_docs/version-2.2.0/functions-overview.md
index 3bdfbaf97b8..4c6251e088f 100644
--- a/site2/website/versioned_docs/version-2.2.0/functions-overview.md
+++ b/site2/website/versioned_docs/version-2.2.0/functions-overview.md
@@ -154,7 +154,7 @@ class RoutingFunction(Function):
 
 ## Command-line interface
 
-Pulsar Functions are managed using the [`pulsar-admin`](reference-pulsar-admin) CLI tool (in particular the [`functions`](reference-pulsar-admin.md#functions) command). Here's an example command that would run a function in [local run mode](#local-run-mode):
+Pulsar Functions are managed using the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool (in particular the [`functions`](reference-pulsar-admin.md#functions) command). Here's an example command that would run a function in [local run mode](#local-run-mode):
 
 ```bash
 
@@ -492,7 +492,7 @@ $ bin/pulsar-admin functions create \
 
 ## Metrics
 
-Pulsar Functions that use the [Pulsar Functions SDK](#the-pulsar-functions-sdk) can publish metrics to Pulsar. For more information, see [Metrics for Pulsar Functions](functions-metrics).
+Pulsar Functions that use the [Pulsar Functions SDK](#the-pulsar-functions-sdk) can publish metrics to Pulsar. For more information, see [Metrics for Pulsar Functions](functions-metrics.md).
 
 ## State storage
 
diff --git a/site2/website/versioned_docs/version-2.2.0/getting-started-docker.md b/site2/website/versioned_docs/version-2.2.0/getting-started-docker.md
index 26908245cb2..904d6740166 100644
--- a/site2/website/versioned_docs/version-2.2.0/getting-started-docker.md
+++ b/site2/website/versioned_docs/version-2.2.0/getting-started-docker.md
@@ -43,8 +43,8 @@ When you start a local standalone cluster, a `public/default` namespace is creat
 
 ## Use Pulsar in Docker
 
-Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python) 
-and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can
+Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) 
+and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can
 use one of these root URLs to interact with your cluster:
 
 * `pulsar://localhost:6650`
@@ -103,7 +103,7 @@ client.close()
 ## Get the topic statistics
 
 In Pulsar, you can use REST, Java, or command-line tools to control every aspect of the system.
-For details on APIs, refer to [Admin API Overview](admin-api-overview).
+For details on APIs, refer to [Admin API Overview](admin-api-overview.md).
 
 In the simplest example, you can use curl to probe the stats for a particular topic:
 
diff --git a/site2/website/versioned_docs/version-2.2.0/getting-started-standalone.md b/site2/website/versioned_docs/version-2.2.0/getting-started-standalone.md
index 59a19174b2e..8984d7a9b9c 100644
--- a/site2/website/versioned_docs/version-2.2.0/getting-started-standalone.md
+++ b/site2/website/versioned_docs/version-2.2.0/getting-started-standalone.md
@@ -8,7 +8,7 @@ original_id: getting-started-standalone
 For the purposes of local development and testing, you can run Pulsar in standalone mode on your own machine. Standalone mode includes a Pulsar broker as well as the necessary ZooKeeper and BookKeeper components running inside of a single Java Virtual Machine (JVM) process.
 
 > #### Pulsar in production? 
-> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal) guide.
+> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal.md) guide.
 
 ## Run Pulsar Standalone Manually
 
@@ -112,7 +112,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you are running Pulsar in a bare metal cluster, you need to make sure `connectors` tarball is unzipped in every broker's pulsar directory
 > (or in every function-worker's pulsar directory if you are running a separate worker cluster for Pulsar functions).
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 ## Installing Tiered Storage Offloaders (optional)
@@ -121,7 +121,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you would like to enable tiered storage feature, you can follow the instructions as below; otherwise you can
 > skip this section for now.
 
-To get started using [tiered storage offloaders](concepts-tiered-storage), you'll need to download the offloaders tarball release on every broker node in
+To get started using [tiered storage offloaders](concepts-tiered-storage.md), you'll need to download the offloaders tarball release on every broker node in
 one of the following ways:
 
 * by clicking the link below and downloading the release from an Apache mirror:
@@ -161,7 +161,7 @@ For more details of how to configure tiered storage feature, you could reference
 >
 > If you are running Pulsar in a bare metal cluster, you need to make sure `offloaders` tarball is unzipped in every broker's pulsar directory
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled tiered storage offloaders.
 
 
@@ -229,12 +229,12 @@ If the message has been successfully published to the topic, you should see a co
 
 ## Using Pulsar clients locally
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
+Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
 
 * `http://localhost:8080`
 * `pulsar://localhost:6650`
 
-Here's an example producer for a Pulsar topic using the [Java](client-libraries-java) client:
+Here's an example producer for a Pulsar topic using the [Java](client-libraries-java.md) client:
 
 ```java
 
@@ -245,7 +245,7 @@ Producer<byte[]> producer = client.newProducer().topic("my-topic").create();
 
 ```
 
-Here's an example [Python](client-libraries-python) producer:
+Here's an example [Python](client-libraries-python.md) producer:
 
 ```python
 
@@ -256,7 +256,7 @@ producer = client.create_producer('my-topic')
 
 ```
 
-Finally, here's an example [C++](client-libraries-cpp) producer:
+Finally, here's an example [C++](client-libraries-cpp.md) producer:
 
 ```cpp
 
diff --git a/site2/website/versioned_docs/version-2.2.0/io-develop.md b/site2/website/versioned_docs/version-2.2.0/io-develop.md
index 69c9a2f42c4..d361a302b25 100644
--- a/site2/website/versioned_docs/version-2.2.0/io-develop.md
+++ b/site2/website/versioned_docs/version-2.2.0/io-develop.md
@@ -13,15 +13,15 @@ import TabItem from '@theme/TabItem';
 This guide describes how to develop Pulsar connectors to move data
 between Pulsar and other systems. 
 
-Pulsar connectors are special [Pulsar Functions](functions-overview), so creating
+Pulsar connectors are special [Pulsar Functions](functions-overview.md), so creating
 a Pulsar connector is similar to creating a Pulsar function. 
 
 Pulsar connectors come in two types: 
 
 | Type | Description | Example
 |---|---|---
-{@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}|Import data from another system to Pulsar.|[RabbitMQ source connector](io-rabbitmq) imports the messages of a RabbitMQ queue to a Pulsar topic.
-{@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java}|Export data from Pulsar to another system.|[Kinesis sink connector](io-kinesis) exports the messages of a Pulsar topic to a Kinesis stream.
+{@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}|Import data from another system to Pulsar.|[RabbitMQ source connector](io-rabbitmq.md) imports the messages of a RabbitMQ queue to a Pulsar topic.
+{@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java}|Export data from Pulsar to another system.|[Kinesis sink connector](io-kinesis.md) exports the messages of a Pulsar topic to a Kinesis stream.
 
 ## Develop
 
@@ -274,7 +274,7 @@ For more information about **how to create integration tests for Pulsar connecto
 ## Package
 
 Once you've developed and tested your connector, you need to package it so that it can be submitted
-to a [Pulsar Functions](functions-overview) cluster. 
+to a [Pulsar Functions](functions-overview.md) cluster. 
 
 There are two methods to
 work with Pulsar Functions' runtime, that is, [NAR](#nar) and [uber JAR](#uber-jar).
@@ -305,7 +305,7 @@ For more information about **how NAR works**, see [here](https://medium.com/hash
 
 :::
 
-Pulsar uses the same mechanism for packaging **all** [built-in connectors](io-connectors). 
+Pulsar uses the same mechanism for packaging **all** [built-in connectors](io-connectors.md). 
 
 The easiest approach to package a Pulsar connector is to create a NAR package using [nifi-nar-maven-plugin](https://mvnrepository.com/artifact/org.apache.nifi/nifi-nar-maven-plugin).
 
@@ -380,7 +380,7 @@ Pulsar connectors enable you to move data in and out of Pulsar easily. It is imp
 
 - Check the metrics provided by Pulsar.
 
-  Pulsar connectors expose the metrics that can be collected and used for monitoring the health of **Java** connectors. You can check the metrics by following the [monitoring](deploy-monitoring) guide.
+  Pulsar connectors expose the metrics that can be collected and used for monitoring the health of **Java** connectors. You can check the metrics by following the [monitoring](deploy-monitoring.md) guide.
 
 - Set and check your customized metrics.
 
diff --git a/site2/website/versioned_docs/version-2.2.0/io-managing.md b/site2/website/versioned_docs/version-2.2.0/io-managing.md
index 47a4922b38d..c2e49d8f05f 100644
--- a/site2/website/versioned_docs/version-2.2.0/io-managing.md
+++ b/site2/website/versioned_docs/version-2.2.0/io-managing.md
@@ -50,7 +50,7 @@ For details, consult the documentation for [individual connectors](io-overview.m
 
 ## Running Connectors
 
-Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Running sources
 
@@ -166,8 +166,8 @@ Here's an example to submit a Cassandra sink:
 
 ## Monitoring Connectors
 
-Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview), so you can use [`functions`](reference-pulsar-admin.md#source) commands
-available in the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview.md), so you can use [`functions`](reference-pulsar-admin.md#source) commands
+available in the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Retrieve Connector Metadata
 
diff --git a/site2/website/versioned_docs/version-2.2.0/io-overview.md b/site2/website/versioned_docs/version-2.2.0/io-overview.md
index 4b238dac32f..e1c093dc3a9 100644
--- a/site2/website/versioned_docs/version-2.2.0/io-overview.md
+++ b/site2/website/versioned_docs/version-2.2.0/io-overview.md
@@ -8,7 +8,7 @@ original_id: io-overview
 Messaging systems are most powerful when you can easily use them in conjunction with external systems like databases and other messaging systems. **Pulsar IO** is a feature of Pulsar that enables you to easily create, deploy, and manage Pulsar **connectors** that interact with external systems, such as [Apache Cassandra](https://cassandra.apache.org), [Aerospike](https://www.aerospike.com), and many others.
 
 > #### Pulsar IO and Pulsar Functions
-> Under the hood, Pulsar IO connectors are specialized [Pulsar Functions](functions-overview.md) purpose-built to interface with external systems. The [administrative interface](io-quickstart) for Pulsar IO is, in fact, quite similar to that of Pulsar Functions.
+> Under the hood, Pulsar IO connectors are specialized [Pulsar Functions](functions-overview.md) purpose-built to interface with external systems. The [administrative interface](io-quickstart.md) for Pulsar IO is, in fact, quite similar to that of Pulsar Functions.
 
 ## Sources and sinks
 
@@ -23,7 +23,7 @@ This diagram illustrates the relationship between sources, sinks, and Pulsar:
 
 ## Working with connectors
 
-Pulsar IO connectors can be managed via the [`pulsar-admin`](reference-pulsar-admin) CLI tool, in particular the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands.
+Pulsar IO connectors can be managed via the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool, in particular the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands.
 
 > For a guide to managing connectors in your Pulsar installation, see the [Getting started with Pulsar IO](io-quickstart.md)
 
@@ -31,8 +31,8 @@ The following connectors are currently available for Pulsar:
 
 |Name|Java Class|Documentation|
 |---|---|---|
-|[Aerospike sink](https://www.aerospike.com/)|[`org.apache.pulsar.io.aerospike.AerospikeSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/aerospike/src/main/java/org/apache/pulsar/io/aerospike/AerospikeStringSink.java)|[Documentation](io-aerospike)|
-|[Cassandra sink](https://cassandra.apache.org)|[`org.apache.pulsar.io.cassandra.CassandraSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/cassandra/src/main/java/org/apache/pulsar/io/cassandra/CassandraStringSink.java)|[Documentation](io-cassandra)|
+|[Aerospike sink](https://www.aerospike.com/)|[`org.apache.pulsar.io.aerospike.AerospikeSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/aerospike/src/main/java/org/apache/pulsar/io/aerospike/AerospikeStringSink.java)|[Documentation](io-aerospike.md)|
+|[Cassandra sink](https://cassandra.apache.org)|[`org.apache.pulsar.io.cassandra.CassandraSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/cassandra/src/main/java/org/apache/pulsar/io/cassandra/CassandraStringSink.java)|[Documentation](io-cassandra.md)|
 |[Kafka source](https://kafka.apache.org)|[`org.apache.pulsar.io.kafka.KafkaSource`](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaStringSource.java)|[Documentation](io-kafka.md#source)|
 |[Kafka sink](https://kafka.apache.org)|[`org.apache.pulsar.io.kafka.KafkaSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaStringSink.java)|[Documentation](io-kafka.md#sink)|
 |[Kinesis sink](https://aws.amazon.com/kinesis/)|[`org.apache.pulsar.io.kinesis.KinesisSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/kinesis/src/main/java/org/apache/pulsar/io/kinesis/KinesisSink.java)|[Documentation](io-kinesis.md#sink)|
diff --git a/site2/website/versioned_docs/version-2.2.0/io-quickstart.md b/site2/website/versioned_docs/version-2.2.0/io-quickstart.md
index a6541d8e928..404c94979de 100644
--- a/site2/website/versioned_docs/version-2.2.0/io-quickstart.md
+++ b/site2/website/versioned_docs/version-2.2.0/io-quickstart.md
@@ -6,14 +6,14 @@ original_id: io-quickstart
 ---
 
 This tutorial provides a hands-on look at how you can move data out of Pulsar without writing a single line of code.
-It is helpful to review the [concepts](io-overview) for Pulsar I/O in tandem with running the steps in this guide
+It is helpful to review the [concepts](io-overview.md) for Pulsar I/O in tandem with running the steps in this guide
 to gain a deeper understanding. At the end of this tutorial, you will be able to:
 
 - Connect your Pulsar cluster with your Cassandra cluster
 
 :::tip
 
-1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone). However all
+1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone.md). However all
 the commands used in this tutorial should be able to be used in a multi-nodes Pulsar cluster without any changes.
 2. All the instructions are assumed to run at the root directory of a Pulsar binary distribution.
 
@@ -267,11 +267,11 @@ configs:
 
 ```
 
-To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra).
+To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra.md).
 
 ### Submit a Cassandra Sink
 
-Pulsar provides the [CLI](reference-cli-tools) for running and managing Pulsar I/O connectors.
+Pulsar provides the [CLI](reference-cli-tools.md) for running and managing Pulsar I/O connectors.
 
 We can run following command to sink a sink connector with type `cassandra` and config file `examples/cassandra-sink.yml`.
 
@@ -296,7 +296,7 @@ as a Pulsar Function and write the messages produced in topic `test_cassandra` t
 
 ### Inspect the Cassandra Sink
 
-Since an IO connector is running as [Pulsar Functions](functions-overview), you can use [functions CLI](reference-pulsar-admin.md#functions)
+Since an IO connector is running as [Pulsar Functions](functions-overview.md), you can use [functions CLI](reference-pulsar-admin.md#functions)
 for inspecting and managing the IO connectors.
 
 #### Retrieve Sink Info
diff --git a/site2/website/versioned_docs/version-2.2.0/pulsar-2.0.md b/site2/website/versioned_docs/version-2.2.0/pulsar-2.0.md
index 560c8c1bd7c..07fba365e9f 100644
--- a/site2/website/versioned_docs/version-2.2.0/pulsar-2.0.md
+++ b/site2/website/versioned_docs/version-2.2.0/pulsar-2.0.md
@@ -4,13 +4,13 @@ title: Pulsar 2.0
 sidebar_label: "Pulsar 2.0"
 ---
 
-Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview) feature, some terminology changes, and more.
+Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview.md) feature, some terminology changes, and more.
 
 ## New features in Pulsar 2.0
 
 Feature | Description
 :-------|:-----------
-[Pulsar Functions](functions-overview) | A lightweight compute option for Pulsar
+[Pulsar Functions](functions-overview.md) | A lightweight compute option for Pulsar
 
 ## Major changes
 
diff --git a/site2/website/versioned_docs/version-2.2.0/reference-cli-tools.md b/site2/website/versioned_docs/version-2.2.0/reference-cli-tools.md
index 1c3d601e00c..dcac11835f4 100644
--- a/site2/website/versioned_docs/version-2.2.0/reference-cli-tools.md
+++ b/site2/website/versioned_docs/version-2.2.0/reference-cli-tools.md
@@ -6,7 +6,7 @@ sidebar_label: "Pulsar CLI tools"
 
 Pulsar offers several command-line tools that you can use for managing Pulsar installations, performance testing, using command-line producers and consumers, and more.
 
-All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone). The following tools are currently documented:
+All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone.md). The following tools are currently documented:
 
 * [`pulsar`](#pulsar)
 * [`pulsar-client`](#pulsar-client)
@@ -825,7 +825,7 @@ Options
 
 ### `transaction`
 
-Run a transaction. For more information, see [Pulsar transactions](txn-why).
+Run a transaction. For more information, see [Pulsar transactions](txn-why.md).
 
 **Usage**
 
diff --git a/site2/website/versioned_docs/version-2.2.0/security-athenz.md b/site2/website/versioned_docs/version-2.2.0/security-athenz.md
index ba27ba43eb9..6d338fc4013 100644
--- a/site2/website/versioned_docs/version-2.2.0/security-athenz.md
+++ b/site2/website/versioned_docs/version-2.2.0/security-athenz.md
@@ -75,7 +75,7 @@ For more information on Pulsar client authentication using Athenz, see the follo
 
 ## Configure CLI tools for Athenz
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You need to add the following authentication parameters to the `conf/client.conf` config file to use Athenz with CLI tools of Pulsar:
 
diff --git a/site2/website/versioned_docs/version-2.2.0/security-authorization.md b/site2/website/versioned_docs/version-2.2.0/security-authorization.md
index d9d33665d06..c5e3c04b035 100644
--- a/site2/website/versioned_docs/version-2.2.0/security-authorization.md
+++ b/site2/website/versioned_docs/version-2.2.0/security-authorization.md
@@ -26,7 +26,7 @@ superUserRoles=my-super-user-1,my-super-user-2
 > A full list of parameters is available in the `conf/broker.conf` file.
 > You can also find the default values for those parameters in [Broker Configuration](reference-configuration.md#broker). 
 
-Typically, you use superuser roles for administrators, clients as well as broker-to-broker authorization. When you use [geo-replication](concepts-replication), every broker needs to be able to publish to all the other topics of clusters.
+Typically, you use superuser roles for administrators, clients as well as broker-to-broker authorization. When you use [geo-replication](concepts-replication.md), every broker needs to be able to publish to all the other topics of clusters.
 
 You can also enable the authorization for the proxy in the proxy configuration file (`conf/proxy.conf`). Once you enable the authorization on the proxy, the proxy does an additional authorization check before forwarding the request to a broker. 
 If you enable authorization on the broker, the broker checks the authorization of the request when the broker receives the forwarded request.
@@ -58,7 +58,7 @@ superUserRoles=my-super-user-1,my-super-user-2,my-proxy-role
 
 Pulsar [instance](reference-terminology.md#instance) administrators or some kind of self-service portal typically provisions a Pulsar [tenant](reference-terminology.md#tenant). 
 
-You can manage tenants using the [`pulsar-admin`](reference-pulsar-admin) tool. 
+You can manage tenants using the [`pulsar-admin`](reference-pulsar-admin.md) tool. 
 
 ### Create a new tenant
 
@@ -86,7 +86,7 @@ persistent://tenant/namespace/topic
 
 ### Manage permissions
 
-You can use [Pulsar Admin Tools](admin-api-permissions) for managing permission in Pulsar.
+You can use [Pulsar Admin Tools](admin-api-permissions.md) for managing permission in Pulsar.
 
 ### Pulsar admin authentication
 
@@ -116,7 +116,7 @@ PulsarAdmin admin = PulsarAdmin.builder()
 When a client is identified with multiple roles in a token (the type of role claim in the token is an array) during the authentication process, Pulsar supports to check the permissions of all the roles and further authorize the client as long as one of its roles has the required permissions.
 
 > **Note**<br />
-> This authorization method is only compatible with [JWT authentication](security-jwt).
+> This authorization method is only compatible with [JWT authentication](security-jwt.md).
 
 To enable this authorization method, configure the authorization provider as `MultiRolesTokenAuthorizationProvider` in the `conf/broker.conf` file.
 
diff --git a/site2/website/versioned_docs/version-2.2.0/security-extending.md b/site2/website/versioned_docs/version-2.2.0/security-extending.md
index 97edb6898db..deba98da936 100644
--- a/site2/website/versioned_docs/version-2.2.0/security-extending.md
+++ b/site2/website/versioned_docs/version-2.2.0/security-extending.md
@@ -10,7 +10,7 @@ Pulsar provides a way to use custom authentication and authorization mechanisms
 ## Authentication
 
 Pulsar support mutual TLS and Athenz authentication plugins, and these can be used as described
-in [Security](security-overview).
+in [Security](security-overview.md).
 
 It is possible to use a custom authentication mechanism by providing the implementation in the
 form of two plugins one for the Client library and the other for the Pulsar Broker to validate
diff --git a/site2/website/versioned_docs/version-2.2.0/security-overview.md b/site2/website/versioned_docs/version-2.2.0/security-overview.md
index 2f3fc035ad4..3f08cb29ad8 100644
--- a/site2/website/versioned_docs/version-2.2.0/security-overview.md
+++ b/site2/website/versioned_docs/version-2.2.0/security-overview.md
@@ -20,7 +20,7 @@ You had better secure the service components in your Apache Pulsar deployment.
 
 In Pulsar, a *role* is a string, like `admin` or `app1`, which can represent a single client or multiple clients. You can use roles to control permission for clients to produce or consume from certain topics, administer the configuration for tenants, and so on.
 
-Apache Pulsar uses a [Authentication Provider](#authentication-providers) to establish the identity of a client and then assign a *role token* to that client. This role token is then used for [Authorization and ACLs](security-authorization) to determine what the client is authorized to do.
+Apache Pulsar uses a [Authentication Provider](#authentication-providers) to establish the identity of a client and then assign a *role token* to that client. This role token is then used for [Authorization and ACLs](security-authorization.md) to determine what the client is authorized to do.
 
 ## Authentication providers
 
diff --git a/site2/website/versioned_docs/version-2.2.0/security-tls-authentication.md b/site2/website/versioned_docs/version-2.2.0/security-tls-authentication.md
index e6921bd4418..d34ecbc1fdc 100644
--- a/site2/website/versioned_docs/version-2.2.0/security-tls-authentication.md
+++ b/site2/website/versioned_docs/version-2.2.0/security-tls-authentication.md
@@ -6,9 +6,9 @@ sidebar_label: "Authentication using TLS"
 
 ## TLS authentication overview
 
-TLS authentication is an extension of [TLS transport encryption](security-tls-transport). Not only servers have keys and certs that the client uses to verify the identity of servers, clients also have keys and certs that the server uses to verify the identity of clients. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
+TLS authentication is an extension of [TLS transport encryption](security-tls-transport.md). Not only servers have keys and certs that the client uses to verify the identity of servers, clients also have keys and certs that the server uses to verify the identity of clients. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
 
-`Bouncy Castle Provider` provides TLS related cipher suites and algorithms in Pulsar. If you need [FIPS](https://www.bouncycastle.org/fips_faq.html) version of `Bouncy Castle Provider`, please reference [Bouncy Castle page](security-bouncy-castle).
+`Bouncy Castle Provider` provides TLS related cipher suites and algorithms in Pulsar. If you need [FIPS](https://www.bouncycastle.org/fips_faq.html) version of `Bouncy Castle Provider`, please reference [Bouncy Castle page](security-bouncy-castle.md).
 
 ### Create client certificates
 
@@ -102,7 +102,7 @@ brokerClientTrustCertsFilePath=/path/my-ca/certs/ca.cert.pem
 
 To configure proxies to authenticate clients, add the following parameters to `proxy.conf`, alongside [the configuration to enable tls transport](security-tls-transport.md#proxy-configuration):
 
-The proxy should have its own client key pair for connecting to brokers. You need to configure the role token for this key pair in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization) for more details.
+The proxy should have its own client key pair for connecting to brokers. You need to configure the role token for this key pair in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization.md) for more details.
 
 ```properties
 
@@ -122,7 +122,7 @@ When you use TLS authentication, client connects via TLS transport. You need to
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You need to add the following parameters to that file to use TLS authentication with the CLI tools of Pulsar:
 
diff --git a/site2/website/versioned_docs/version-2.2.0/security-tls-transport.md b/site2/website/versioned_docs/version-2.2.0/security-tls-transport.md
index 7f7d1d4749c..6cfe4df2e0e 100644
--- a/site2/website/versioned_docs/version-2.2.0/security-tls-transport.md
+++ b/site2/website/versioned_docs/version-2.2.0/security-tls-transport.md
@@ -9,7 +9,7 @@ original_id: security-tls-transport
 
 By default, Apache Pulsar clients communicate with the Apache Pulsar service in plain text, which means that all data is sent in the clear. TLS can be used to encrypt this traffic so that it cannot be snooped by a man-in-the-middle attacker.
 
-TLS can be configured for both encryption and authentication. You may configure just TLS transport encryption, which is covered in this guide. TLS authentication is covered [elsewhere](security-tls-authentication.md). Alternatively, you can use [another authentication mechanism](security-athenz) on top of TLS transport encryption.
+TLS can be configured for both encryption and authentication. You may configure just TLS transport encryption, which is covered in this guide. TLS authentication is covered [elsewhere](security-tls-authentication.md). Alternatively, you can use [another authentication mechanism](security-athenz.md) on top of TLS transport encryption.
 
 > Note that enabling TLS may have a performance impact due to encryption overhead.
 
@@ -19,7 +19,7 @@ TLS is a form of [public key cryptography](https://en.wikipedia.org/wiki/Public-
 
 To use TLS transport encryption, you need two kinds of key pairs, **server key pairs** and a **certificate authority**.
 
-A third kind of key pair, **client key pairs**, are used for [client authentication](security-tls-authentication).
+A third kind of key pair, **client key pairs**, are used for [client authentication](security-tls-authentication.md).
 
 The **certificate authority** private key should be stored in a very secure location (a fully encrypted, disconnected, air gapped computer). The certificate authority public key, the **trust cert**, can be freely shared.
 
@@ -27,7 +27,7 @@ For both client and server key pairs, the administrator first generates a privat
 
 For TLS transport encryption, the clients can use the **trust cert** to verify that the server they are talking to has a key pair that was signed by the certificate authority. A man-in-the-middle attacker would not have access to the certificate authority, so they couldn't create a server with such a key pair.
 
-For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that was signed by the certificate authority. The Common Name of the **client cert** is then used as the client's role token (see [Overview](security-overview)).
+For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that was signed by the certificate authority. The Common Name of the **client cert** is then used as the client's role token (see [Overview](security-overview.md)).
 
 ## Creating TLS Certificates
 
@@ -128,7 +128,7 @@ At this point, you have a cert, `broker.cert.pem`, and a key, `broker.key-pk8.pe
 
 ## Broker Configuration
 
-To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you'll need to make some changes to `broker.conf`, which is located in the `conf` directory of your [Pulsar installation](getting-started-standalone).
+To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you'll need to make some changes to `broker.conf`, which is located in the `conf` directory of your [Pulsar installation](getting-started-standalone.md).
 
 Add these values to the configuration file (substituting the appropriate certificate paths where necessary):
 
@@ -180,7 +180,7 @@ The examples below show hostname verification being disabled for the Java client
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools) like [`pulsar-admin`](reference-cli-tools.md#pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-cli-tools.md#pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You'll need to add the following parameters to that file to use TLS transport with Pulsar's CLI tools:
 
diff --git a/site2/website/versioned_docs/version-2.2.0/sql-deployment-configurations.md b/site2/website/versioned_docs/version-2.2.0/sql-deployment-configurations.md
index 2fa91159ae6..9a9e91e29ef 100644
--- a/site2/website/versioned_docs/version-2.2.0/sql-deployment-configurations.md
+++ b/site2/website/versioned_docs/version-2.2.0/sql-deployment-configurations.md
@@ -42,7 +42,7 @@ $ wget pulsar:binary_release_url
 
 ## Deploying a new cluster
 
-Please note that the [Getting Started](sql-getting-started) guide shows you how to easily setup a standalone single node environment to experiment with.
+Please note that the [Getting Started](sql-getting-started.md) guide shows you how to easily setup a standalone single node environment to experiment with.
 
 Pulsar SQL is powered by [Presto](https://prestosql.io) thus many of the configurations for deployment is the same for the Pulsar SQL worker.
 
diff --git a/site2/website/versioned_docs/version-2.2.0/sql-overview.md b/site2/website/versioned_docs/version-2.2.0/sql-overview.md
index 025fcd9a808..f5748a1b864 100644
--- a/site2/website/versioned_docs/version-2.2.0/sql-overview.md
+++ b/site2/website/versioned_docs/version-2.2.0/sql-overview.md
@@ -5,7 +5,7 @@ sidebar_label: "Overview"
 original_id: sql-overview
 ---
 
-One of the common use cases of Pulsar is storing streams of event data. Often the event data is structured which predefined fields.  There is tremendous value for users to be able to query the existing data that is already stored in Pulsar topics.  With the implementation of the [Schema Registry](concepts-schema-registry), structured data can be stored in Pulsar and allows for the potential to query that data via SQL language.
+One of the common use cases of Pulsar is storing streams of event data. Often the event data is structured which predefined fields.  There is tremendous value for users to be able to query the existing data that is already stored in Pulsar topics.  With the implementation of the [Schema Registry](concepts-schema-registry.md), structured data can be stored in Pulsar and allows for the potential to query that data via SQL language.
 
 By leveraging [Presto](https://prestosql.io/), we have created a method for users to be able to query structured data stored within Pulsar in a very efficient and scalable manner. We will discuss why this very efficient and scalable in the [Performance](#performance) section below. 
 
diff --git a/site2/website/versioned_docs/version-2.2.0/standalone-docker.md b/site2/website/versioned_docs/version-2.2.0/standalone-docker.md
index 6ff3696bd3a..1710ec819d7 100644
--- a/site2/website/versioned_docs/version-2.2.0/standalone-docker.md
+++ b/site2/website/versioned_docs/version-2.2.0/standalone-docker.md
@@ -46,8 +46,8 @@ For more information, see [Topics](concepts-messaging.md#topics).
 
 ## Use Pulsar in Docker
 
-Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python) 
-and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can
+Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) 
+and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can
 use one of these root URLs to interact with your cluster:
 
 * `pulsar://localhost:6650`
@@ -106,7 +106,7 @@ client.close()
 ## Get the topic statistics
 
 In Pulsar, you can use REST, Java, or command-line tools to control every aspect of the system.
-For details on APIs, refer to [Admin API Overview](admin-api-overview).
+For details on APIs, refer to [Admin API Overview](admin-api-overview.md).
 
 In the simplest example, you can use curl to probe the stats for a particular topic:
 
diff --git a/site2/website/versioned_docs/version-2.2.0/standalone.md b/site2/website/versioned_docs/version-2.2.0/standalone.md
index 7297d792353..0d595d44aed 100644
--- a/site2/website/versioned_docs/version-2.2.0/standalone.md
+++ b/site2/website/versioned_docs/version-2.2.0/standalone.md
@@ -8,7 +8,7 @@ original_id: standalone
 For the purposes of local development and testing, you can run Pulsar in standalone mode on your own machine. Standalone mode includes a Pulsar broker as well as the necessary ZooKeeper and BookKeeper components running inside of a single Java Virtual Machine (JVM) process.
 
 > #### Pulsar in production? 
-> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal) guide.
+> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal.md) guide.
 
 ## Run Pulsar Standalone Manually
 
@@ -112,7 +112,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you are running Pulsar in a bare metal cluster, you need to make sure `connectors` tarball is unzipped in every broker's pulsar directory
 > (or in every function-worker's pulsar directory if you are running a separate worker cluster for Pulsar functions).
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 ## Installing Tiered Storage Offloaders (optional)
@@ -121,7 +121,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you would like to enable tiered storage feature, you can follow the instructions as below; otherwise you can
 > skip this section for now.
 
-To get started using [tiered storage offloaders](concepts-tiered-storage), you'll need to download the offloaders tarball release on every broker node in
+To get started using [tiered storage offloaders](concepts-tiered-storage.md), you'll need to download the offloaders tarball release on every broker node in
 one of the following ways:
 
 * by clicking the link below and downloading the release from an Apache mirror:
@@ -161,7 +161,7 @@ For more details of how to configure tiered storage feature, you could reference
 >
 > If you are running Pulsar in a bare metal cluster, you need to make sure `offloaders` tarball is unzipped in every broker's pulsar directory
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled tiered storage offloaders.
 
 
@@ -229,12 +229,12 @@ If the message has been successfully published to the topic, you should see a co
 
 ## Using Pulsar clients locally
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
+Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Python](client-libraries-python.md), and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
 
 * `http://localhost:8080`
 * `pulsar://localhost:6650`
 
-Here's an example producer for a Pulsar topic using the [Java](client-libraries-java) client:
+Here's an example producer for a Pulsar topic using the [Java](client-libraries-java.md) client:
 
 ```java
 
@@ -245,7 +245,7 @@ Producer<byte[]> producer = client.newProducer().topic("my-topic").create();
 
 ```
 
-Here's an example [Python](client-libraries-python) producer:
+Here's an example [Python](client-libraries-python.md) producer:
 
 ```python
 
@@ -256,7 +256,7 @@ producer = client.create_producer('my-topic')
 
 ```
 
-Finally, here's an example [C++](client-libraries-cpp) producer:
+Finally, here's an example [C++](client-libraries-cpp.md) producer:
 
 ```cpp
 
diff --git a/site2/website/versioned_docs/version-2.2.1/admin-api-clusters.md b/site2/website/versioned_docs/version-2.2.1/admin-api-clusters.md
index 04db2f60759..1255ad25d7a 100644
--- a/site2/website/versioned_docs/version-2.2.1/admin-api-clusters.md
+++ b/site2/website/versioned_docs/version-2.2.1/admin-api-clusters.md
@@ -88,7 +88,7 @@ When provision a new cluster, you need to initialize that cluster's [metadata](c
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers) that will belong to the cluster.
+You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers.md) that will belong to the cluster.
 
 > **No cluster metadata initialization through the REST API or the Java admin API**
 >
@@ -112,11 +112,11 @@ bin/pulsar initialize-cluster-metadata \
 
 ```
 
-You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication) in your instance.
+You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication.md) in your instance.
 
 ### Get configuration
 
-You can fetch the [configuration](reference-configuration) for an existing cluster at any time.
+You can fetch the [configuration](reference-configuration.md) for an existing cluster at any time.
 
 ````mdx-code-block
 <Tabs 
diff --git a/site2/website/versioned_docs/version-2.2.1/admin-api-namespaces.md b/site2/website/versioned_docs/version-2.2.1/admin-api-namespaces.md
index e4e099489db..989802f34be 100644
--- a/site2/website/versioned_docs/version-2.2.1/admin-api-namespaces.md
+++ b/site2/website/versioned_docs/version-2.2.1/admin-api-namespaces.md
@@ -1354,7 +1354,7 @@ admin.namespaces().removeDeduplicationSnapshotInterval(namespace)
 
 ### Namespace isolation
 
-You can use the [Pulsar isolation policy](administration-isolation) to allocate resources (broker and bookie) for a namespace. 
+You can use the [Pulsar isolation policy](administration-isolation.md) to allocate resources (broker and bookie) for a namespace. 
 
 ### Unload namespaces from a broker
 
diff --git a/site2/website/versioned_docs/version-2.2.1/admin-api-non-persistent-topics.md b/site2/website/versioned_docs/version-2.2.1/admin-api-non-persistent-topics.md
index 78dac355894..2c645e507ca 100644
--- a/site2/website/versioned_docs/version-2.2.1/admin-api-non-persistent-topics.md
+++ b/site2/website/versioned_docs/version-2.2.1/admin-api-non-persistent-topics.md
@@ -4,4 +4,4 @@ title: Managing non-persistent topics
 sidebar_label: "Non-Persistent topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.2.1/admin-api-partitioned-topics.md b/site2/website/versioned_docs/version-2.2.1/admin-api-partitioned-topics.md
index 7221b3d14e0..da99c440302 100644
--- a/site2/website/versioned_docs/version-2.2.1/admin-api-partitioned-topics.md
+++ b/site2/website/versioned_docs/version-2.2.1/admin-api-partitioned-topics.md
@@ -4,4 +4,4 @@ title: Managing partitioned topics
 sidebar_label: "Partitioned topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.2.1/admin-api-tenants.md b/site2/website/versioned_docs/version-2.2.1/admin-api-tenants.md
index 8071b3261c6..fd2ccd0fe00 100644
--- a/site2/website/versioned_docs/version-2.2.1/admin-api-tenants.md
+++ b/site2/website/versioned_docs/version-2.2.1/admin-api-tenants.md
@@ -20,7 +20,7 @@ import TabItem from '@theme/TabItem';
 > 
 > - For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](https://pulsar.apache.org/api/admin/).
 
-Tenants, like namespaces, can be managed using the [admin API](admin-api-overview). There are currently two configurable aspects of tenants:
+Tenants, like namespaces, can be managed using the [admin API](admin-api-overview.md). There are currently two configurable aspects of tenants:
 
 * Admin roles
 * Allowed clusters
@@ -121,7 +121,7 @@ admin.tenants().createTenant(tenantName, tenantInfo);
 
 ### Get configuration
 
-You can fetch the [configuration](reference-configuration) for an existing tenant at any time.
+You can fetch the [configuration](reference-configuration.md) for an existing tenant at any time.
 
 ````mdx-code-block
 <Tabs 
diff --git a/site2/website/versioned_docs/version-2.2.1/administration-dashboard.md b/site2/website/versioned_docs/version-2.2.1/administration-dashboard.md
index 1eb0404dfe0..92bd7e17869 100644
--- a/site2/website/versioned_docs/version-2.2.1/administration-dashboard.md
+++ b/site2/website/versioned_docs/version-2.2.1/administration-dashboard.md
@@ -7,7 +7,7 @@ original_id: administration-dashboard
 
 :::note
 
-Pulsar dashboard is deprecated. We recommend you use [Pulsar Manager](administration-pulsar-manager) to manage and monitor the stats of your topics. 
+Pulsar dashboard is deprecated. We recommend you use [Pulsar Manager](administration-pulsar-manager.md) to manage and monitor the stats of your topics. 
 
 :::
 
diff --git a/site2/website/versioned_docs/version-2.2.1/administration-geo.md b/site2/website/versioned_docs/version-2.2.1/administration-geo.md
index 78f72e1832e..766840cf73f 100644
--- a/site2/website/versioned_docs/version-2.2.1/administration-geo.md
+++ b/site2/website/versioned_docs/version-2.2.1/administration-geo.md
@@ -71,7 +71,7 @@ $ bin/pulsar-admin clusters create \
    :::tip
 
    - If you want to use a secure connection for a cluster, you can use the flags `--broker-url-secure` and `--url-secure`. For more information, see [pulsar-admin clusters create](https://pulsar.apache.org/tools/pulsar-admin/).
-   - Different clusters may have different authentications. You can use the authentication flag `--auth-plugin` and `--auth-parameters` together to set cluster authentication, which overrides `brokerClientAuthenticationPlugin` and `brokerClientAuthenticationParameters` if `authenticationEnabled` sets to `true` in `broker.conf` and `standalone.conf`. For more information, see [authentication and authorization](concepts-authentication).
+   - Different clusters may have different authentications. You can use the authentication flag `--auth-plugin` and `--auth-parameters` together to set cluster authentication, which overrides `brokerClientAuthenticationPlugin` and `brokerClientAuthenticationParameters` if `authenticationEnabled` sets to `true` in `broker.conf` and `standalone.conf`. For more information, see [authentication and authorization](concepts-authentication.md).
 
    :::
 
@@ -135,7 +135,7 @@ $ bin/pulsar-admin namespaces set-clusters my-tenant/my-namespace \
 
 By default, messages are replicated to all clusters configured for the namespace. You can restrict replication selectively by specifying a replication list for a message, and then that message is replicated only to the subset in the replication list.
 
-The following is an example for the [Java API](client-libraries-java). Note the use of the `setReplicationClusters` method when you construct the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
+The following is an example for the [Java API](client-libraries-java.md). Note the use of the `setReplicationClusters` method when you construct the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
 
 ```java
 
diff --git a/site2/website/versioned_docs/version-2.2.1/administration-zk-bk.md b/site2/website/versioned_docs/version-2.2.1/administration-zk-bk.md
index b9cfb39ad03..505a3b5b516 100644
--- a/site2/website/versioned_docs/version-2.2.1/administration-zk-bk.md
+++ b/site2/website/versioned_docs/version-2.2.1/administration-zk-bk.md
@@ -166,7 +166,7 @@ To enable batching operations, set the [`metadataStoreBatchingEnabled`](referenc
 
 BookKeeper stores all durable messages in Pulsar. BookKeeper is a distributed [write-ahead log](https://en.wikipedia.org/wiki/Write-ahead_logging) WAL system that guarantees read consistency of independent message logs calls ledgers. Individual BookKeeper servers are also called *bookies*.
 
-> To manage message persistence, retention, and expiry in Pulsar, refer to [cookbook](cookbooks-retention-expiry).
+> To manage message persistence, retention, and expiry in Pulsar, refer to [cookbook](cookbooks-retention-expiry.md).
 
 ### Hardware requirements
 
diff --git a/site2/website/versioned_docs/version-2.2.1/client-libraries-cpp.md b/site2/website/versioned_docs/version-2.2.1/client-libraries-cpp.md
index 5ba9e03d895..b709463ff03 100644
--- a/site2/website/versioned_docs/version-2.2.1/client-libraries-cpp.md
+++ b/site2/website/versioned_docs/version-2.2.1/client-libraries-cpp.md
@@ -661,7 +661,7 @@ For complete examples, refer to [C++ client examples](https://github.com/apache/
 ## Schema
 
 This section describes some examples about schema. For more information about
-schema, see [Pulsar schema](schema-get-started).
+schema, see [Pulsar schema](schema-get-started.md).
 
 ### Avro schema
 
diff --git a/site2/website/versioned_docs/version-2.2.1/client-libraries-go.md b/site2/website/versioned_docs/version-2.2.1/client-libraries-go.md
index a1ab520b661..2cc2f4c9013 100644
--- a/site2/website/versioned_docs/version-2.2.1/client-libraries-go.md
+++ b/site2/website/versioned_docs/version-2.2.1/client-libraries-go.md
@@ -16,7 +16,7 @@ The Pulsar Go client can be used to create Pulsar [producers](#producers), [cons
 ### Requirements
 
 Pulsar Go client library is based on the C++ client library. Follow
-the instructions for [C++ library](client-libraries-cpp) for installing the binaries
+the instructions for [C++ library](client-libraries-cpp.md) for installing the binaries
 through [RPM](client-libraries-cpp.md#rpm), [Deb](client-libraries-cpp.md#deb) or [Homebrew packages](client-libraries-cpp.md#macos).
 
 ### Installing go package
@@ -50,7 +50,7 @@ import "github.com/apache/pulsar/pulsar-client-go/pulsar"
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 Pulsar protocol URLs are assigned to specific clusters, use the `pulsar` scheme and have a default port of 6650. Here's an example for `localhost`:
 
@@ -68,7 +68,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you're using [TLS](security-tls-authentication) authentication, the URL will look like something like this:
+If you're using [TLS](security-tls-authentication.md) authentication, the URL will look like something like this:
 
 ```http
 
@@ -223,14 +223,14 @@ Parameter | Description | Default
 :---------|:------------|:-------
 `Topic` | The Pulsar [topic](reference-terminology.md#topic) to which the producer will publish messages |
 `Name` | A name for the producer. If you don't explicitly assign a name, Pulsar will automatically generate a globally unique name that you can access later using the `Name()` method.  If you choose to explicitly assign a name, it will need to be unique across *all* Pulsar clusters, otherwise the creation operation will throw an error. |
-`SendTimeout` | When publishing a message to a topic, the producer will wait for an acknowledgment from the responsible Pulsar [broker](reference-terminology.md#broker). If a message is not acknowledged within the threshold set by this parameter, an error will be thrown. If you set `SendTimeout` to -1, the timeout will be set to infinity (and thus removed). Removing the send timeout is recommended when using Pulsar's [message de-duplication](cookbooks-deduplication) feature. | 30 seconds
+`SendTimeout` | When publishing a message to a topic, the producer will wait for an acknowledgment from the responsible Pulsar [broker](reference-terminology.md#broker). If a message is not acknowledged within the threshold set by this parameter, an error will be thrown. If you set `SendTimeout` to -1, the timeout will be set to infinity (and thus removed). Removing the send timeout is recommended when using Pulsar's [message de-duplication](cookbooks-deduplication.md) feature. | 30 seconds
 `MaxPendingMessages` | The maximum size of the queue holding pending messages (i.e. messages waiting to receive an acknowledgment from the [broker](reference-terminology.md#broker)). By default, when the queue is full all calls to the `Send` and `SendAsync` methods will fail *unless* `BlockIfQueueFull` is set to `true`. |
 `MaxPendingMessagesAcrossPartitions` | |
 `BlockIfQueueFull` | If set to `true`, the producer's `Send` and `SendAsync` methods will block when the outgoing message queue is full rather than failing and throwing an error (the size of that queue is dictated by the `MaxPendingMessages` parameter); if set to `false` (the default), `Send` and `SendAsync` operations will fail and throw a `ProducerQueueIsFullError` when the queue is full. | `false`
 `MessageRoutingMode` | The message routing logic (for producers on [partitioned topics](concepts-architecture-overview.md#partitioned-topics)). This logic is applied only when no key is set on messages. The available options are: round robin (`pulsar.RoundRobinDistribution`, the default), publishing all messages to a single partition (`pulsar.UseSinglePartition`), or a custom partitioning scheme (`pulsar.CustomPartition`). | `pulsar.RoundRobinDistribution`
 `HashingScheme` | The hashing function that determines the partition on which a particular message is published (partitioned topics only). The available options are: `pulsar.JavaStringHash` (the equivalent of `String.hashCode()` in Java), `pulsar.Murmur3_32Hash` (applies the [Murmur3](https://en.wikipedia.org/wiki/MurmurHash) hashing function), or `pulsar.BoostHash` (applies the hashing function from C++'s [Boost](https://www.boost.org/doc/libs/1_62_0/doc/html/hash.html) library) | `puls [...]
 `CompressionType` | The message data compression type used by the producer. The available options are [`LZ4`](https://github.com/lz4/lz4) and [`ZLIB`](https://zlib.net/). | No compression
-`MessageRouter` | By default, Pulsar uses a round-robin routing scheme for [partitioned topics](cookbooks-partitioned). The `MessageRouter` parameter enables you to specify custom routing logic via a function that takes the Pulsar message and topic metadata as an argument and returns an integer (where the ), i.e. a function signature of `func(Message, TopicMetadata) int`. |
+`MessageRouter` | By default, Pulsar uses a round-robin routing scheme for [partitioned topics](cookbooks-partitioned.md). The `MessageRouter` parameter enables you to specify custom routing logic via a function that takes the Pulsar message and topic metadata as an argument and returns an integer (where the ), i.e. a function signature of `func(Message, TopicMetadata) int`. |
 
 ## Consumers
 
@@ -475,7 +475,7 @@ Parameter | Description
 
 ## TLS encryption and authentication
 
-In order to use [TLS encryption](security-tls-transport), you'll need to configure your client to do so:
+In order to use [TLS encryption](security-tls-transport.md), you'll need to configure your client to do so:
 
  * Use `pulsar+ssl` URL type
  * Set `TLSTrustCertsFilePath` to the path to the TLS certs used by your client and the Pulsar broker
diff --git a/site2/website/versioned_docs/version-2.2.1/client-libraries-java.md b/site2/website/versioned_docs/version-2.2.1/client-libraries-java.md
index c33b1a68be5..a6a930249ed 100644
--- a/site2/website/versioned_docs/version-2.2.1/client-libraries-java.md
+++ b/site2/website/versioned_docs/version-2.2.1/client-libraries-java.md
@@ -5,16 +5,16 @@ sidebar_label: "Java"
 original_id: client-libraries-java
 ---
 
-The Pulsar Java client can be used both to create Java producers, consumers, and [readers](#readers) of messages and to perform [administrative tasks](admin-api-overview). The current version of the Java client is **@pulsar:version@**.
+The Pulsar Java client can be used both to create Java producers, consumers, and [readers](#readers) of messages and to perform [administrative tasks](admin-api-overview.md). The current version of the Java client is **@pulsar:version@**.
 
 Javadoc for the Pulsar client is divided up into two domains, by package:
 
 Package | Description | Maven Artifact
 :-------|:------------|:--------------
 [`org.apache.pulsar.client.api`](/api/client) | The producer and consumer API | [org.apache.pulsar:pulsar-client:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client%7C@pulsar:version@%7Cjar)
-[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
+[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview.md) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
 
-This document will focus only on the client API for producing and consuming messages on Pulsar topics. For a guide to using the Java admin client, see [The Pulsar admin interface](admin-api-overview).
+This document will focus only on the client API for producing and consuming messages on Pulsar topics. For a guide to using the Java admin client, see [The Pulsar admin interface](admin-api-overview.md).
 
 ## Installation
 
@@ -54,7 +54,7 @@ dependencies {
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 Pulsar protocol URLs are assigned to specific clusters, use the `pulsar` scheme and have a default port of 6650. Here's an example for `localhost`:
 
@@ -72,7 +72,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you're using [TLS](security-tls-authentication) authentication, the URL will look like something like this:
+If you're using [TLS](security-tls-authentication.md) authentication, the URL will look like something like this:
 
 ```http
 
@@ -93,7 +93,7 @@ PulsarClient client = PulsarClient.builder()
 ```
 
 > #### Default broker URLs for standalone clusters
-> If you're running a cluster in [standalone mode](getting-started-standalone), the broker will be available at the `pulsar://localhost:6650` URL by default.
+> If you're running a cluster in [standalone mode](getting-started-standalone.md), the broker will be available at the `pulsar://localhost:6650` URL by default.
 
 Check out the Javadoc for the {@inject: javadoc:PulsarClient:/client/org/apache/pulsar/client/api/PulsarClient} class for a full listing of configurable parameters.
 
@@ -170,7 +170,7 @@ Producer<byte[]> producer = client.newProducer()
 
 ### Message routing
 
-When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more on specifying a routing mode using the Java client, see the [Partitioned Topics](cookbooks-partitioned) cookbook.
+When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more on specifying a routing mode using the Java client, see the [Partitioned Topics](cookbooks-partitioned.md) cookbook.
 
 ### Async send
 
@@ -375,7 +375,7 @@ The code sample above shows pointing the `Reader` object to a specific message (
 
 ## Schemas
 
-In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](concepts-schema-registry) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types). If you construct, say, a [producer](#producers) without specifying a schema, then the producer can only produce messages of type `byte[]`. Here's an example:
+In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](concepts-schema-registry.md) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types.md). If you construct, say, a [producer](#producers) without specifying a schema, then the producer can only produce messages of type `byte[]`. Here's an example:
 
 ```java
 
@@ -470,7 +470,7 @@ The following schema formats are currently available for Java:
 
 ## Authentication
 
-Pulsar currently supports two authentication schemes: [TLS](security-tls-authentication.md) and [Athenz](security-athenz). The Pulsar Java client can be used with both.
+Pulsar currently supports two authentication schemes: [TLS](security-tls-authentication.md) and [Athenz](security-athenz.md). The Pulsar Java client can be used with both.
 
 ### TLS Authentication
 
@@ -497,7 +497,7 @@ PulsarClient client = PulsarClient.builder()
 
 ### Athenz
 
-To use [Athenz](security-athenz) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
+To use [Athenz](security-athenz.md) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
 
 * `tenantDomain`
 * `tenantService`
diff --git a/site2/website/versioned_docs/version-2.2.1/client-libraries-python.md b/site2/website/versioned_docs/version-2.2.1/client-libraries-python.md
index 4b6b4f9e41d..7ed649e8609 100644
--- a/site2/website/versioned_docs/version-2.2.1/client-libraries-python.md
+++ b/site2/website/versioned_docs/version-2.2.1/client-libraries-python.md
@@ -10,7 +10,7 @@ import TabItem from '@theme/TabItem';
 ````
 
 
-Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp) and exposes all of the [same features](/api/cpp). You can find the code in the [Python directory](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
+Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp.md) and exposes all of the [same features](/api/cpp). You can find the code in the [Python directory](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
 
 All the methods in producer, consumer, and reader of a Python client are thread-safe.
 
@@ -192,7 +192,7 @@ client.close()
 ```
 
 ### Create a Python client with multiple advertised listeners
-To ensure clients in both internal and external networks can connect to a Pulsar cluster, Pulsar introduces [advertisedListeners](concepts-multiple-advertised-listeners).
+To ensure clients in both internal and external networks can connect to a Pulsar cluster, Pulsar introduces [advertisedListeners](concepts-multiple-advertised-listeners.md).
 
 The following example creates a Python client using multiple advertised listeners:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/client-libraries-websocket.md b/site2/website/versioned_docs/version-2.2.1/client-libraries-websocket.md
index a7cca18b0fe..5c8d6444d5c 100644
--- a/site2/website/versioned_docs/version-2.2.1/client-libraries-websocket.md
+++ b/site2/website/versioned_docs/version-2.2.1/client-libraries-websocket.md
@@ -5,14 +5,14 @@ sidebar_label: "WebSocket"
 original_id: client-libraries-websocket
 ---
 
-Pulsar's [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API is meant to provide a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients.md). Through WebSockets you can publish and consume messages and use all the features available in the [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp) client libraries.
+Pulsar's [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API is meant to provide a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients.md). Through WebSockets you can publish and consume messages and use all the features available in the [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp.md) client libraries.
 
 
 > You can use Pulsar's WebSocket API with any WebSocket client library. See examples for Python and Node.js [below](#client-examples).
 
 ## Running the WebSocket service
 
-The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone) already has the WebSocket service enabled.
+The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone.md) already has the WebSocket service enabled.
 
 In non-standalone mode, there are two ways to deploy the WebSocket service:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/client-libraries.md b/site2/website/versioned_docs/version-2.2.1/client-libraries.md
index 536cd0ccda8..8f91dfbbbdd 100644
--- a/site2/website/versioned_docs/version-2.2.1/client-libraries.md
+++ b/site2/website/versioned_docs/version-2.2.1/client-libraries.md
@@ -8,12 +8,12 @@ Pulsar supports the following client libraries:
 
 |Language|Documentation|Release note|Code repo
 |---|---|---|---
-Java |- [User doc](client-libraries-java) <br /><br />- [API doc](https://pulsar.apache.org/api/client/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client) 
-C++ | - [User doc](client-libraries-cpp) <br /><br />- [API doc](https://pulsar.apache.org/api/cpp/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp) 
-Python | - [User doc](client-libraries-python) <br /><br />- [API doc](https://pulsar.apache.org/api/python/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) 
-WebSocket| [User doc](client-libraries-websocket) | [Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-websocket) 
+Java |- [User doc](client-libraries-java.md) <br /><br />- [API doc](https://pulsar.apache.org/api/client/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client) 
+C++ | - [User doc](client-libraries-cpp.md) <br /><br />- [API doc](https://pulsar.apache.org/api/cpp/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp) 
+Python | - [User doc](client-libraries-python.md) <br /><br />- [API doc](https://pulsar.apache.org/api/python/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) 
+WebSocket| [User doc](client-libraries-websocket.md) | [Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-websocket) 
 Go client|[User doc](client-libraries-go.md)|[Here](https://github.com/apache/pulsar-client-go/blob/master/CHANGELOG) |[Here](https://github.com/apache/pulsar-client-go) 
-Node.js|[User doc](client-libraries-node)|[Here](https://github.com/apache/pulsar-client-node/releases) |[Here](https://github.com/apache/pulsar-client-node) 
+Node.js|[User doc](client-libraries-node.md)|[Here](https://github.com/apache/pulsar-client-node/releases) |[Here](https://github.com/apache/pulsar-client-node) 
 C# |[User doc](client-libraries-dotnet.md)| [Here](https://github.com/apache/pulsar-dotpulsar/blob/master/CHANGELOG)|[Here](https://github.com/apache/pulsar-dotpulsar) 
 
 :::note
diff --git a/site2/website/versioned_docs/version-2.2.1/concepts-architecture-overview.md b/site2/website/versioned_docs/version-2.2.1/concepts-architecture-overview.md
index 0d96b59f8ae..1ce346fc169 100644
--- a/site2/website/versioned_docs/version-2.2.1/concepts-architecture-overview.md
+++ b/site2/website/versioned_docs/version-2.2.1/concepts-architecture-overview.md
@@ -4,7 +4,7 @@ title: Architecture Overview
 sidebar_label: "Architecture"
 ---
 
-At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication) data amongst themselves.
+At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication.md) data amongst themselves.
 
 In a Pulsar cluster:
 
@@ -16,20 +16,20 @@ The diagram below provides an illustration of a Pulsar cluster:
 
 ![Pulsar architecture diagram](/assets/pulsar-system-architecture.png)
 
-At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication).
+At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication.md).
 
 ## Brokers
 
 The Pulsar message broker is a stateless component that's primarily responsible for running two other components:
 
 * An HTTP server that exposes a {@inject: rest:REST:/} API for both administrative tasks and [topic lookup](concepts-clients.md#client-setup-phase) for producers and consumers. The producers connect to the brokers to publish messages and the consumers connect to the brokers to consume the messages.
-* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol) used for all data transfers
+* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol.md) used for all data transfers
 
 Messages are typically dispatched out of a [managed ledger](#managed-ledgers) cache for the sake of performance, *unless* the backlog exceeds the cache size. If the backlog grows too large for the cache, the broker will start reading entries from BookKeeper.
 
-Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java).
+Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java.md).
 
-> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers) guide.
+> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers.md) guide.
 
 ## Clusters
 
@@ -39,9 +39,9 @@ A Pulsar instance consists of one or more Pulsar *clusters*. Clusters, in turn,
 * A ZooKeeper quorum used for cluster-level configuration and coordination
 * An ensemble of bookies used for [persistent storage](#persistent-storage) of messages
 
-Clusters can replicate amongst themselves using [geo-replication](concepts-replication).
+Clusters can replicate amongst themselves using [geo-replication](concepts-replication.md).
 
-> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters) guide.
+> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters.md) guide.
 
 ## Metadata store
 
@@ -139,17 +139,17 @@ $ bin/pulsar proxy \
 ```
 
 > #### Pulsar proxy docs
-> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy).
+> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy.md).
 
 
 Some important things to know about the Pulsar proxy:
 
 * Connecting clients don't need to provide *any* specific configuration to use the Pulsar proxy. You won't need to update the client configuration for existing applications beyond updating the IP used for the service URL (for example if you're running a load balancer over the Pulsar proxy).
-* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication) is supported by the Pulsar proxy
+* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication.md) is supported by the Pulsar proxy
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL.
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL.
 
 You can use your own service discovery system if you'd like. If you use your own system, there is just one requirement: when a client performs an HTTP request to an endpoint, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to *some* active broker in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
@@ -157,7 +157,7 @@ The diagram below illustrates Pulsar service discovery:
 
 ![alt-text](/assets/pulsar-service-discovery.png)
 
-In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python), for example, could access this Pulsar cluster like this:
+In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python.md), for example, could access this Pulsar cluster like this:
 
 ```python
 
diff --git a/site2/website/versioned_docs/version-2.2.1/concepts-authentication.md b/site2/website/versioned_docs/version-2.2.1/concepts-authentication.md
index 335da8dc5a5..fbefead69f3 100644
--- a/site2/website/versioned_docs/version-2.2.1/concepts-authentication.md
+++ b/site2/website/versioned_docs/version-2.2.1/concepts-authentication.md
@@ -4,5 +4,5 @@ title: Authentication and Authorization
 sidebar_label: "Authentication and Authorization"
 ---
 
-Pulsar supports a pluggable [authentication](security-overview.md) mechanism which can be configured at the proxy and/or the broker. Pulsar also supports a pluggable [authorization](security-authorization) mechanism. These mechanisms work together to identify the client and its access rights on topics, namespaces and tenants.
+Pulsar supports a pluggable [authentication](security-overview.md) mechanism which can be configured at the proxy and/or the broker. Pulsar also supports a pluggable [authorization](security-authorization.md) mechanism. These mechanisms work together to identify the client and its access rights on topics, namespaces and tenants.
 
diff --git a/site2/website/versioned_docs/version-2.2.1/concepts-clients.md b/site2/website/versioned_docs/version-2.2.1/concepts-clients.md
index b9a3940f2ad..a780c3ff33e 100644
--- a/site2/website/versioned_docs/version-2.2.1/concepts-clients.md
+++ b/site2/website/versioned_docs/version-2.2.1/concepts-clients.md
@@ -5,7 +5,7 @@ sidebar_label: "Clients"
 original_id: concepts-clients
 ---
 
-Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md),  [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
+Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md),  [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp.md). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
 
 Under the hood, the current official Pulsar client libraries support transparent reconnection and/or connection failover to brokers, queuing of messages until acknowledged by the broker, and heuristics such as connection retries with backoff.
 
diff --git a/site2/website/versioned_docs/version-2.2.1/concepts-messaging.md b/site2/website/versioned_docs/version-2.2.1/concepts-messaging.md
index 89b6827d73d..11b15cf814a 100644
--- a/site2/website/versioned_docs/version-2.2.1/concepts-messaging.md
+++ b/site2/website/versioned_docs/version-2.2.1/concepts-messaging.md
@@ -22,8 +22,8 @@ Messages are the basic "unit" of Pulsar. The following table lists the component
 
 Component | Description
 :---------|:-------
-Value / data payload | The data carried by the message. All Pulsar messages contain raw bytes, although message data can also conform to data [schemas](schema-get-started).
-Key | The key (string type) of the message. It is a short name of message key or partition key. Messages are optionally tagged with keys, which is useful for features like [topic compaction](concepts-topic-compaction).
+Value / data payload | The data carried by the message. All Pulsar messages contain raw bytes, although message data can also conform to data [schemas](schema-get-started.md).
+Key | The key (string type) of the message. It is a short name of message key or partition key. Messages are optionally tagged with keys, which is useful for features like [topic compaction](concepts-topic-compaction.md).
 Properties | An optional key/value map of user-defined properties.
 Producer name | The name of the producer who produces the message. If you do not specify a producer name, the default name is used. 
 Topic name | The name of the topic that the message is published to.
@@ -53,7 +53,7 @@ The default size of a message is 5 MB. You can configure the max size of a messa
   
   ```
 
-> For more information on Pulsar messages, see Pulsar [binary protocol](developing-binary-protocol).
+> For more information on Pulsar messages, see Pulsar [binary protocol](developing-binary-protocol.md).
 
 ## Producers
 
@@ -171,7 +171,7 @@ Messages are received from [brokers](reference-terminology.md#broker) either syn
 
 ### Listeners
 
-Client libraries provide listener implementation for consumers. For example, the [Java client](client-libraries-java) provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
+Client libraries provide listener implementation for consumers. For example, the [Java client](client-libraries-java.md) provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
 
 ### Acknowledgement
 
@@ -656,7 +656,7 @@ A [subscription](#subscriptions) can have one or more consumers. When a consumer
 
 #### When to use
 
-By default, messages of a topic without any durable subscriptions are marked as deleted. If you want to prevent the messages being marked as deleted, you can create a durable subscription for this topic. In this case, only acknowledged messages are marked as deleted. For more information, see [message retention and expiry](cookbooks-retention-expiry).
+By default, messages of a topic without any durable subscriptions are marked as deleted. If you want to prevent the messages being marked as deleted, you can create a durable subscription for this topic. In this case, only acknowledged messages are marked as deleted. For more information, see [message retention and expiry](cookbooks-retention-expiry.md).
 
 #### How to use
 
@@ -760,7 +760,7 @@ Decisions about routing and subscription modes can be made separately in most ca
 
 There is no difference between partitioned topics and normal topics in terms of how subscription types work, as partitioning only determines what happens between when a message is published by a producer and processed and acknowledged by a consumer.
 
-Partitioned topics need to be explicitly created via the [admin API](admin-api-overview). The number of partitions can be specified when creating the topic.
+Partitioned topics need to be explicitly created via the [admin API](admin-api-overview.md). The number of partitions can be specified when creating the topic.
 
 ### Routing modes
 
@@ -772,7 +772,7 @@ Mode     | Description
 :--------|:------------
 `RoundRobinPartition` | If no key is provided, the producer will publish messages across all partitions in round-robin fashion to achieve maximum throughput. Please note that round-robin is not done per individual message but rather it's set to the same boundary of batching delay, to ensure batching is effective. While if a key is specified on the message, the partitioned producer will hash the key and assign message to a particular partition. This is the default mode. 
 `SinglePartition`     | If no key is provided, the producer will randomly pick one single partition and publish all the messages into that partition. While if a key is specified on the message, the partitioned producer will hash the key and assign message to a particular partition.
-`CustomPartition`     | Use custom message router implementation that will be called to determine the partition for a particular message. User can create a custom routing mode by using the [Java client](client-libraries-java) and implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
+`CustomPartition`     | Use custom message router implementation that will be called to determine the partition for a particular message. User can create a custom routing mode by using the [Java client](client-libraries-java.md) and implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
 
 ### Ordering guarantee
 
@@ -810,7 +810,7 @@ non-persistent://tenant/namespace/topic
 
 ```
 
-> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent).
+> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent.md).
 
 In non-persistent topics, brokers immediately deliver messages to all connected subscribers *without persisting them* in [BookKeeper](concepts-architecture-overview.md#persistent-storage). If a subscriber is disconnected, the broker will not be able to deliver those in-transit messages, and subscribers will never be able to receive those messages again. Eliminating the persistent storage step makes messaging on non-persistent topics slightly faster than on persistent topics in some cases [...]
 
@@ -881,7 +881,7 @@ Pulsar has two features, however, that enable you to override this default behav
 * Message **retention** enables you to store messages that have been acknowledged by a consumer
 * Message **expiry** enables you to set a time to live (TTL) for messages that have not yet been acknowledged
 
-> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry) cookbook.
+> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry.md) cookbook.
 
 The diagram below illustrates both concepts:
 
@@ -904,12 +904,12 @@ Message deduplication is disabled in the scenario shown at the top. Here, a prod
 
 In the second scenario at the bottom, the producer publishes message 1, which is received by the broker and persisted, as in the first scenario. When the producer attempts to publish the message again, however, the broker knows that it has already seen message 1 and thus does not persist the message.
 
-> Message deduplication is handled at the namespace level or the topic level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication).
+> Message deduplication is handled at the namespace level or the topic level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication.md).
 
 
 ### Producer idempotency
 
-The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, so you do not need to modify your Pulsar client code. Instead, you only need to make administrative changes. For details, see [Managing m [...]
+The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, so you do not need to modify your Pulsar client code. Instead, you only need to make administrative changes. For details, see [Managing m [...]
 
 ### Deduplication and effectively-once semantics
 
diff --git a/site2/website/versioned_docs/version-2.2.1/concepts-multi-tenancy.md b/site2/website/versioned_docs/version-2.2.1/concepts-multi-tenancy.md
index 8a17e72a4c8..26bd6a2fd18 100644
--- a/site2/website/versioned_docs/version-2.2.1/concepts-multi-tenancy.md
+++ b/site2/website/versioned_docs/version-2.2.1/concepts-multi-tenancy.md
@@ -4,7 +4,7 @@ title: Multi Tenancy
 sidebar_label: "Multi Tenancy"
 ---
 
-Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
+Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview.md) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
 
 The multi-tenant nature of Pulsar is reflected mostly visibly in topic URLs, which have this structure:
 
@@ -20,7 +20,7 @@ As you can see, the tenant is the most basic unit of categorization for topics (
 
 To each tenant in a Pulsar instance you can assign:
 
-* An [authorization](security-authorization) scheme
+* An [authorization](security-authorization.md) scheme
 * The set of [clusters](reference-terminology.md#cluster) to which the tenant's configuration applies
 
 ## Namespaces
@@ -28,7 +28,7 @@ To each tenant in a Pulsar instance you can assign:
 Tenants and namespaces are two key concepts of Pulsar to support multi-tenancy.
 
 * Pulsar is provisioned for specified tenants with appropriate capacity allocated to the tenant.
-* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
+* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
 
 Names for topics in the same namespace will look like this:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/concepts-overview.md b/site2/website/versioned_docs/version-2.2.1/concepts-overview.md
index 1b17c24c526..71d5e3ff7a3 100644
--- a/site2/website/versioned_docs/version-2.2.1/concepts-overview.md
+++ b/site2/website/versioned_docs/version-2.2.1/concepts-overview.md
@@ -9,15 +9,15 @@ Pulsar is a multi-tenant, high-performance solution for server-to-server messagi
 
 Pulsar's key features include:
 
-* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo) of messages across clusters
+* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo.md) of messages across clusters
 * Very low publish and end-to-end latency
 * Seamless scalability out to over a million topics
 * A simple [client API](concepts-clients.md) with bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp.md)
 * Multiple [subscription types](concepts-messaging.md#subscription-types) for topics ([exclusive](concepts-messaging.md#exclusive), [shared](concepts-messaging.md#shared), and [failover](concepts-messaging.md#failover))
 * Guaranteed message delivery with [persistent message storage](concepts-architecture-overview.md#persistent-storage) provided by [Apache BookKeeper](http://bookkeeper.apache.org/)
-* A serverless lightweight computing framework [Pulsar Functions](functions-overview) offers stream native data processing.
-* A serverless connector framework [Pulsar IO](io-overview) built on-top-of Pulsar Functions to make moving data in and out Apache Pulsar easier.
-* [Tiered Storage](concepts-tiered-storage) offloads data from hot/warn storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
+* A serverless lightweight computing framework [Pulsar Functions](functions-overview.md) offers stream native data processing.
+* A serverless connector framework [Pulsar IO](io-overview.md) built on-top-of Pulsar Functions to make moving data in and out Apache Pulsar easier.
+* [Tiered Storage](concepts-tiered-storage.md) offloads data from hot/warn storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
 
 ## Contents
 
diff --git a/site2/website/versioned_docs/version-2.2.1/concepts-replication.md b/site2/website/versioned_docs/version-2.2.1/concepts-replication.md
index d4653ca7aec..9cc3a7c3415 100644
--- a/site2/website/versioned_docs/version-2.2.1/concepts-replication.md
+++ b/site2/website/versioned_docs/version-2.2.1/concepts-replication.md
@@ -8,7 +8,7 @@ Regardless of industries, when an unforeseen event occurs and brings day-to-day
 
 Pulsar's geo-replication mechanism is typically used for disaster recovery, enabling the replication of persistently stored message data across multiple data centers. For instance, your application is publishing data in one region and you would like to process it for consumption in other regions. With Pulsar’s geo-replication mechanism, messages can be produced and consumed in different geo-locations. 
 
-The diagram below illustrates the process of [geo-replication](administration-geo). Whenever three producers (P1, P2 and P3) respectively publish messages to the T1 topic in three clusters, those messages are instantly replicated across clusters. Once the messages are replicated, two consumers (C1 and C2) can consume those messages from their clusters.
+The diagram below illustrates the process of [geo-replication](administration-geo.md). Whenever three producers (P1, P2 and P3) respectively publish messages to the T1 topic in three clusters, those messages are instantly replicated across clusters. Once the messages are replicated, two consumers (C1 and C2) can consume those messages from their clusters.
 
 ![A typical geo-replication example with full-mesh pattern](/assets/full-mesh-replication.svg)
 
diff --git a/site2/website/versioned_docs/version-2.2.1/concepts-tiered-storage.md b/site2/website/versioned_docs/version-2.2.1/concepts-tiered-storage.md
index f0bbde61718..ec031253ccd 100644
--- a/site2/website/versioned_docs/version-2.2.1/concepts-tiered-storage.md
+++ b/site2/website/versioned_docs/version-2.2.1/concepts-tiered-storage.md
@@ -14,4 +14,4 @@ One way to alleviate this cost is to use Tiered Storage. With tiered storage, ol
 
 Pulsar currently supports S3, Google Cloud Storage (GCS), and filesystem for [long term store](https://pulsar.apache.org/docs/en/cookbooks-tiered-storage/). Offloading to long term storage triggered via a Rest API or command line interface. The user passes in the amount of topic data they wish to retain on BookKeeper, and the broker will copy the backlog data to long term storage. The original data will then be deleted from BookKeeper after a configured delay (4 hours by default).
 
-> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage).
+> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage.md).
diff --git a/site2/website/versioned_docs/version-2.2.1/concepts-topic-compaction.md b/site2/website/versioned_docs/version-2.2.1/concepts-topic-compaction.md
index 790ce76b7c5..300cf68956d 100644
--- a/site2/website/versioned_docs/version-2.2.1/concepts-topic-compaction.md
+++ b/site2/website/versioned_docs/version-2.2.1/concepts-topic-compaction.md
@@ -6,7 +6,7 @@ sidebar_label: "Topic Compaction"
 
 Pulsar was built with highly scalable [persistent storage](concepts-architecture-overview.md#persistent-storage) of message data as a primary objective. Pulsar topics enable you to persistently store as many unacknowledged messages as you need while preserving message ordering. By default, Pulsar stores *all* unacknowledged/unprocessed messages produced on a topic. Accumulating many unacknowledged messages on a topic is necessary for many Pulsar use cases but it can also be very time int [...]
 
-> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction).
+> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction.md).
 
 For some use cases consumers don't need a complete "image" of the topic log. They may only need a few values to construct a more "shallow" image of the log, perhaps even just the most recent value. For these kinds of use cases Pulsar offers **topic compaction**. When you run compaction on a topic, Pulsar goes through a topic's backlog and removes messages that are *obscured* by later messages, i.e. it goes through the topic on a per-key basis and leaves only the most recent message assoc [...]
 
@@ -23,7 +23,7 @@ Pulsar's topic compaction feature:
 
 ## How topic compaction works
 
-When topic compaction is triggered [via the CLI](cookbooks-compaction), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
+When topic compaction is triggered [via the CLI](cookbooks-compaction.md), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
 
 After that, the broker will create a new [BookKeeper ledger](concepts-architecture-overview.md#ledgers) and make a second iteration through each message on the topic. For each message, if the key matches the latest occurrence of that key, then the key's data payload, message ID, and metadata will be written to the newly created ledger. If the key doesn't match the latest then the message will be skipped and left alone. If any given message has an empty payload, it will be skipped and con [...]
 
diff --git a/site2/website/versioned_docs/version-2.2.1/cookbooks-compaction.md b/site2/website/versioned_docs/version-2.2.1/cookbooks-compaction.md
index 0720019aaa0..214e899fa08 100644
--- a/site2/website/versioned_docs/version-2.2.1/cookbooks-compaction.md
+++ b/site2/website/versioned_docs/version-2.2.1/cookbooks-compaction.md
@@ -44,7 +44,7 @@ Configuring the compaction threshold on a namespace will apply to all topics wit
 
 ## Triggering compaction manually
 
-In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin) CLI tool. Here's an example:
+In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. Here's an example:
 
 ```bash
 
diff --git a/site2/website/versioned_docs/version-2.2.1/cookbooks-non-persistent.md b/site2/website/versioned_docs/version-2.2.1/cookbooks-non-persistent.md
index d40c4fbd0cf..1346d19a042 100644
--- a/site2/website/versioned_docs/version-2.2.1/cookbooks-non-persistent.md
+++ b/site2/website/versioned_docs/version-2.2.1/cookbooks-non-persistent.md
@@ -40,7 +40,7 @@ $ bin/pulsar-client produce non-persistent://public/default/example-np-topic \
 
 ```
 
-> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-topics) guide.
+> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-topics.md) guide.
 
 ## Enabling
 
@@ -54,7 +54,7 @@ If you'd like to enable *only* non-persistent topics in a broker, you can set th
 
 ## Managing with cli
 
-Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin) non-persistent topics under a namespace, and more.
+Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin.md) non-persistent topics under a namespace, and more.
 
 ## Using with Pulsar clients
 
diff --git a/site2/website/versioned_docs/version-2.2.1/cookbooks-partitioned.md b/site2/website/versioned_docs/version-2.2.1/cookbooks-partitioned.md
index 25896934788..c857d019edc 100644
--- a/site2/website/versioned_docs/version-2.2.1/cookbooks-partitioned.md
+++ b/site2/website/versioned_docs/version-2.2.1/cookbooks-partitioned.md
@@ -3,4 +3,4 @@ id: cookbooks-partitioned
 title: Partitioned topics
 sidebar_label: "Partitioned Topics"
 ---
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.2.1/cookbooks-retention-expiry.md b/site2/website/versioned_docs/version-2.2.1/cookbooks-retention-expiry.md
index 86160c3f7ec..cd764fad6eb 100644
--- a/site2/website/versioned_docs/version-2.2.1/cookbooks-retention-expiry.md
+++ b/site2/website/versioned_docs/version-2.2.1/cookbooks-retention-expiry.md
@@ -21,7 +21,7 @@ In Pulsar, you can modify this behavior, with namespace granularity, in two ways
 * You can persistently store messages that are not within a backlog (because they've been acknowledged by on every existing subscription, or because there are no subscriptions) by setting [retention policies](#retention-policies).
 * Messages that are not acknowledged within a specified timeframe can be automatically acknowledged, by specifying the [time to live](#time-to-live-ttl) (TTL).
 
-Pulsar's [admin interface](admin-api-overview) enables you to manage both retention policies and TTL with namespace granularity (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
+Pulsar's [admin interface](admin-api-overview.md) enables you to manage both retention policies and TTL with namespace granularity (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
 
 
 > #### Retention and TTL solve two different problems
diff --git a/site2/website/versioned_docs/version-2.2.1/deploy-aws.md b/site2/website/versioned_docs/version-2.2.1/deploy-aws.md
index 5db846fe790..60ac4c22d76 100644
--- a/site2/website/versioned_docs/version-2.2.1/deploy-aws.md
+++ b/site2/website/versioned_docs/version-2.2.1/deploy-aws.md
@@ -4,7 +4,7 @@ title: Deploying a Pulsar cluster on AWS using Terraform and Ansible
 sidebar_label: "Amazon Web Services"
 ---
 
-> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster).
+> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster.md).
 
 One of the easiest ways to get a Pulsar [cluster](reference-terminology.md#cluster) running on [Amazon Web Services](https://aws.amazon.com/) (AWS) is to use the [Terraform](https://terraform.io) infrastructure provisioning tool and the [Ansible](https://www.ansible.com) server automation tool. Terraform can create the resources necessary for running the Pulsar cluster---[EC2](https://aws.amazon.com/ec2/) instances, networking and security infrastructure, etc.---While Ansible can install [...]
 
@@ -209,7 +209,7 @@ Remember to enter this command just only once. If you attempt to enter this comm
 
 Once you have created the necessary AWS resources using Terraform, you can install and run Pulsar on the Terraform-created EC2 instances using Ansible. 
 
-(Optional) If you want to use any [built-in IO connectors](io-connectors), edit the `Download Pulsar IO packages` task in the `deploy-pulsar.yaml` file and uncomment the connectors you want to use. 
+(Optional) If you want to use any [built-in IO connectors](io-connectors.md), edit the `Download Pulsar IO packages` task in the `deploy-pulsar.yaml` file and uncomment the connectors you want to use. 
 
 To run the playbook, enter this command:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/deploy-bare-metal-multi-cluster.md b/site2/website/versioned_docs/version-2.2.1/deploy-bare-metal-multi-cluster.md
index 70dff45080b..8a765d8843f 100644
--- a/site2/website/versioned_docs/version-2.2.1/deploy-bare-metal-multi-cluster.md
+++ b/site2/website/versioned_docs/version-2.2.1/deploy-bare-metal-multi-cluster.md
@@ -6,13 +6,13 @@ sidebar_label: "Bare metal multi-cluster"
 
 :::tip
 
-1. You can use single-cluster Pulsar installation in most use cases, such as experimenting with Pulsar or using Pulsar in a startup or in a single team. If you need to run a multi-cluster Pulsar instance, see the [guide](deploy-bare-metal-multi-cluster).
-2. If you want to use all built-in [Pulsar IO](io-overview.md) connectors, you need to download `apache-pulsar-io-connectors`package and install `apache-pulsar-io-connectors` under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
-3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`package and install `apache-pulsar-offloaders` under `offloaders` directory in the Pulsar directory on every broker node. For more details of how to configure this feature, you can refer to the [Tiered storage cookbook](cookbooks-tiered-storage).
+1. You can use single-cluster Pulsar installation in most use cases, such as experimenting with Pulsar or using Pulsar in a startup or in a single team. If you need to run a multi-cluster Pulsar instance, see the [guide](deploy-bare-metal-multi-cluster.md).
+2. If you want to use all built-in [Pulsar IO](io-overview.md) connectors, you need to download `apache-pulsar-io-connectors`package and install `apache-pulsar-io-connectors` under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
+3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`package and install `apache-pulsar-offloaders` under `offloaders` directory in the Pulsar directory on every broker node. For more details of how to configure this feature, you can refer to the [Tiered storage cookbook](cookbooks-tiered-storage.md).
 
 :::
 
-A Pulsar instance consists of multiple Pulsar clusters working in unison. You can distribute clusters across data centers or geographical regions and replicate the clusters amongst themselves using [geo-replication](administration-geo).Deploying a  multi-cluster Pulsar instance consists of the following steps:
+A Pulsar instance consists of multiple Pulsar clusters working in unison. You can distribute clusters across data centers or geographical regions and replicate the clusters amongst themselves using [geo-replication](administration-geo.md).Deploying a  multi-cluster Pulsar instance consists of the following steps:
 
 1. Deploying two separate ZooKeeper quorums: a local quorum for each cluster in the instance and a configuration store quorum for instance-wide tasks
 2. Initializing cluster metadata for each cluster
@@ -21,7 +21,7 @@ A Pulsar instance consists of multiple Pulsar clusters working in unison. You ca
 
 
 > #### Run Pulsar locally or on Kubernetes?
-> This guide shows you how to deploy Pulsar in production in a non-Kubernetes environment. If you want to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you want to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes) guide, which includes sections on running Pulsar on Kubernetes, on Google Kubernetes Engine and on Amazon Web Services.
+> This guide shows you how to deploy Pulsar in production in a non-Kubernetes environment. If you want to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you want to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes.md) guide, which includes sections on running Pulsar on Kubernetes, on Google Kubernetes Engine and on Amazon Web Services.
 
 ## System requirement
 
@@ -65,7 +65,7 @@ The Pulsar binary package initially contains the following directories:
 
 Directory | Contains
 :---------|:--------
-`bin` | [Command-line tools](reference-cli-tools) of Pulsar, such as [`pulsar`](reference-cli-tools.md#pulsar) and [`pulsar-admin`](https://pulsar.apache.org/tools/pulsar-admin/)
+`bin` | [Command-line tools](reference-cli-tools.md) of Pulsar, such as [`pulsar`](reference-cli-tools.md#pulsar) and [`pulsar-admin`](https://pulsar.apache.org/tools/pulsar-admin/)
 `conf` | Configuration files for Pulsar, including for [broker configuration](reference-configuration.md#broker), [ZooKeeper configuration](reference-configuration.md#zookeeper), and more
 `examples` | A Java JAR file containing example [Pulsar Functions](functions-overview.md)
 `lib` | The [JAR](https://en.wikipedia.org/wiki/JAR_(file_format)) files that Pulsar uses 
@@ -244,7 +244,7 @@ As you can see from the example above, you need to specify the following:
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-If you use [TLS](security-tls-transport), you also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
+If you use [TLS](security-tls-transport.md), you also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
 
 Make sure to run `initialize-cluster-metadata` for each cluster in your instance.
 
@@ -363,16 +363,16 @@ $ bin/pulsar broker
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to communicate with an entire Pulsar instance using a single URL.
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to communicate with an entire Pulsar instance using a single URL.
 
-You can use your own service discovery system. If you use your own system, you only need to satisfy just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to some active brokers in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
+You can use your own service discovery system. If you use your own system, you only need to satisfy just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration.md) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to some active brokers in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
 > **Service discovery already provided by many scheduling systems**
-> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes), have service discovery systems built in. If you run Pulsar on such a system, you may not need to provide your own service discovery mechanism.
+> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes.md), have service discovery systems built in. If you run Pulsar on such a system, you may not need to provide your own service discovery mechanism.
 
 ## Admin client and verification
 
-At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
+At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview.md) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
 
 The most important thing is that you point the [`serviceUrl`](reference-configuration.md#client-serviceUrl) parameter to the correct service URL for the cluster:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/deploy-bare-metal.md b/site2/website/versioned_docs/version-2.2.1/deploy-bare-metal.md
index 04b240f43a7..b3d068f211c 100644
--- a/site2/website/versioned_docs/version-2.2.1/deploy-bare-metal.md
+++ b/site2/website/versioned_docs/version-2.2.1/deploy-bare-metal.md
@@ -9,13 +9,13 @@ original_id: deploy-bare-metal
 
 1. Single-cluster Pulsar installations should be sufficient for all but the most ambitious use cases. If you're interested in experimenting with
 Pulsar or using it in a startup or on a single team, we recommend opting for a single cluster. If you do need to run a multi-cluster Pulsar instance,
-however, see the guide [here](deploy-bare-metal-multi-cluster).
-2. If you want to use all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
+however, see the guide [here](deploy-bare-metal-multi-cluster.md).
+2. If you want to use all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
 package and make sure it is installed under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you
-have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
-3. If you want to use [Tiered Storage](concepts-tiered-storage) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`
+have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
+3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`
 package and make sure it is installed under `offloaders` directory in the pulsar directory on every broker node. For more details of how to configure
-this feature, you could reference this [Tiered storage cookbook](cookbooks-tiered-storage).
+this feature, you could reference this [Tiered storage cookbook](cookbooks-tiered-storage.md).
 
 :::
 
@@ -273,9 +273,9 @@ Flag | Description
 `--zookeeper` | A "local" ZooKeeper connection string for the cluster. This connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--configuration-store` | The configuration store connection string for the entire instance. As with the `--zookeeper` flag, this connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--web-service-url` | The web service URL for the cluster, plus a port. This URL should be a standard DNS name. The default port is 8080 (we don't recommend using a different port).
-`--web-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
+`--web-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
 `--broker-service-url` | A broker service URL enabling interaction with the brokers in the cluster. This URL should use the same DNS name as the web service URL but should use the `pulsar` scheme instead. The default port is 6650 (we don't recommend using a different port).
-`--broker-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
+`--broker-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
 
 ## Deploying a BookKeeper cluster
 
@@ -374,7 +374,7 @@ clusterName=pulsar-cluster-1
 
 ### Enabling Pulsar Functions (optional)
 
-If you want to enable [Pulsar Functions](functions-overview), you can follow the instructions as below:
+If you want to enable [Pulsar Functions](functions-overview.md), you can follow the instructions as below:
 
 1. Edit `conf/broker.conf` to enable function worker, by setting `functionsWorkerEnabled` to `true`.
 
diff --git a/site2/website/versioned_docs/version-2.2.1/deploy-dcos.md b/site2/website/versioned_docs/version-2.2.1/deploy-dcos.md
index 07f446edaff..599d3a1b045 100644
--- a/site2/website/versioned_docs/version-2.2.1/deploy-dcos.md
+++ b/site2/website/versioned_docs/version-2.2.1/deploy-dcos.md
@@ -7,7 +7,7 @@ original_id: deploy-dcos
 
 :::tip
 
-To enable all built-in [Pulsar IO](io-overview) connectors in your Pulsar deploymente, we recommend you use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image; the former has already bundled [all built-in connectors](io-overview.md#working-with-connectors).
+To enable all built-in [Pulsar IO](io-overview.md) connectors in your Pulsar deploymente, we recommend you use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image; the former has already bundled [all built-in connectors](io-overview.md#working-with-connectors).
 
 :::
 
diff --git a/site2/website/versioned_docs/version-2.2.1/deploy-kubernetes.md b/site2/website/versioned_docs/version-2.2.1/deploy-kubernetes.md
index 4e170dcd471..7455247c901 100644
--- a/site2/website/versioned_docs/version-2.2.1/deploy-kubernetes.md
+++ b/site2/website/versioned_docs/version-2.2.1/deploy-kubernetes.md
@@ -5,6 +5,6 @@ sidebar_label: "Kubernetes"
 ---
 
 To get up and running with these charts as fast as possible, in a **non-production** use case, we provide
-a [quick start guide](getting-started-helm) for Proof of Concept (PoC) deployments.
+a [quick start guide](getting-started-helm.md) for Proof of Concept (PoC) deployments.
 
-To configure and install a Pulsar cluster on Kubernetes for production usage, follow the complete [Installation Guide](helm-install).
\ No newline at end of file
+To configure and install a Pulsar cluster on Kubernetes for production usage, follow the complete [Installation Guide](helm-install.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.2.1/deploy-monitoring.md b/site2/website/versioned_docs/version-2.2.1/deploy-monitoring.md
index adf3587b7ae..d581fe2edfa 100644
--- a/site2/website/versioned_docs/version-2.2.1/deploy-monitoring.md
+++ b/site2/website/versioned_docs/version-2.2.1/deploy-monitoring.md
@@ -112,7 +112,7 @@ http://$FUNCTIONS_WORKER_ADDRESS:$WORKER_PORT/metrics:
 
 You can use Prometheus to collect all the metrics exposed for Pulsar components and set up [Grafana](https://grafana.com/) dashboards to display the metrics and monitor your Pulsar cluster. For details, refer to [Prometheus guide](https://prometheus.io/docs/introduction/getting_started/).
 
-When you run Pulsar on bare metal, you can provide the list of nodes to be probed. When you deploy Pulsar in a Kubernetes cluster, the monitoring is setup automatically. For details, refer to [Kubernetes instructions](helm-deploy). 
+When you run Pulsar on bare metal, you can provide the list of nodes to be probed. When you deploy Pulsar in a Kubernetes cluster, the monitoring is setup automatically. For details, refer to [Kubernetes instructions](helm-deploy.md). 
 
 ## Dashboards
 
@@ -120,7 +120,7 @@ When you collect time series statistics, the major problem is to make sure the n
 
 ### Pulsar per-topic dashboard
 
-The per-topic dashboard instructions are available at [Pulsar manager](administration-pulsar-manager).
+The per-topic dashboard instructions are available at [Pulsar manager](administration-pulsar-manager.md).
 
 ### Grafana
 
diff --git a/site2/website/versioned_docs/version-2.2.1/develop-schema.md b/site2/website/versioned_docs/version-2.2.1/develop-schema.md
index e71c04ef60d..2d4461a5ea2 100644
--- a/site2/website/versioned_docs/version-2.2.1/develop-schema.md
+++ b/site2/website/versioned_docs/version-2.2.1/develop-schema.md
@@ -5,7 +5,7 @@ sidebar_label: "Custom schema storage"
 original_id: develop-schema
 ---
 
-By default, Pulsar stores data type [schemas](concepts-schema-registry) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
+By default, Pulsar stores data type [schemas](concepts-schema-registry.md) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
 
 In order to use a non-default (i.e. non-BookKeeper) storage system for Pulsar schemas, you need to implement two Java interfaces: [`SchemaStorage`](#schemastorage-interface) and [`SchemaStorageFactory`](#schemastoragefactory-interface).
 
diff --git a/site2/website/versioned_docs/version-2.2.1/functions-overview.md b/site2/website/versioned_docs/version-2.2.1/functions-overview.md
index acbae672df7..009bc11d0d0 100644
--- a/site2/website/versioned_docs/version-2.2.1/functions-overview.md
+++ b/site2/website/versioned_docs/version-2.2.1/functions-overview.md
@@ -154,7 +154,7 @@ class RoutingFunction(Function):
 
 ## Command-line interface
 
-Pulsar Functions are managed using the [`pulsar-admin`](reference-pulsar-admin) CLI tool (in particular the [`functions`](reference-pulsar-admin.md#functions) command). Here's an example command that would run a function in [local run mode](#local-run-mode):
+Pulsar Functions are managed using the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool (in particular the [`functions`](reference-pulsar-admin.md#functions) command). Here's an example command that would run a function in [local run mode](#local-run-mode):
 
 ```bash
 
@@ -492,7 +492,7 @@ $ bin/pulsar-admin functions create \
 
 ## Metrics
 
-Pulsar Functions that use the [Pulsar Functions SDK](#the-pulsar-functions-sdk) can publish metrics to Pulsar. For more information, see [Metrics for Pulsar Functions](functions-metrics).
+Pulsar Functions that use the [Pulsar Functions SDK](#the-pulsar-functions-sdk) can publish metrics to Pulsar. For more information, see [Metrics for Pulsar Functions](functions-metrics.md).
 
 ## State storage
 
diff --git a/site2/website/versioned_docs/version-2.2.1/getting-started-docker.md b/site2/website/versioned_docs/version-2.2.1/getting-started-docker.md
index 7e7b69f5335..77a30ccd79f 100644
--- a/site2/website/versioned_docs/version-2.2.1/getting-started-docker.md
+++ b/site2/website/versioned_docs/version-2.2.1/getting-started-docker.md
@@ -61,8 +61,8 @@ For more info, see [Topics](concepts-messaging.md#topics).
 
 ## Start publishing and consuming messages
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python) 
-and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can
+Pulsar currently offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) 
+and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can
 use one of these root URLs for interacting with your cluster:
 
 * `pulsar://localhost:6650`
@@ -117,7 +117,7 @@ client.close()
 ## Get the topic statistics
 
 In Pulsar you can use REST, Java, or command-line tools to control every aspect of the system.
-You can find detailed documentation of all the APIs in the [Admin API Overview](admin-api-overview).
+You can find detailed documentation of all the APIs in the [Admin API Overview](admin-api-overview.md).
 
 In the simplest example, you can use curl to probe the stats for a particular topic:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/getting-started-standalone.md b/site2/website/versioned_docs/version-2.2.1/getting-started-standalone.md
index d76527539cc..24752e87792 100644
--- a/site2/website/versioned_docs/version-2.2.1/getting-started-standalone.md
+++ b/site2/website/versioned_docs/version-2.2.1/getting-started-standalone.md
@@ -8,7 +8,7 @@ original_id: getting-started-standalone
 For the purposes of local development and testing, you can run Pulsar in standalone mode on your own machine. Standalone mode includes a Pulsar broker as well as the necessary ZooKeeper and BookKeeper components running inside of a single Java Virtual Machine (JVM) process.
 
 > #### Pulsar in production? 
-> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal) guide.
+> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal.md) guide.
 
 ## Run Pulsar Standalone Manually
 
@@ -112,7 +112,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you are running Pulsar in a bare metal cluster, you need to make sure `connectors` tarball is unzipped in every broker's pulsar directory
 > (or in every function-worker's pulsar directory if you are running a separate worker cluster for Pulsar functions).
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 ## Installing Tiered Storage Offloaders (optional)
@@ -121,7 +121,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you would like to enable tiered storage feature, you can follow the instructions as below; otherwise you can
 > skip this section for now.
 
-To get started using [tiered storage offloaders](concepts-tiered-storage), you'll need to download the offloaders tarball release on every broker node in
+To get started using [tiered storage offloaders](concepts-tiered-storage.md), you'll need to download the offloaders tarball release on every broker node in
 one of the following ways:
 
 * by clicking the link below and downloading the release from an Apache mirror:
@@ -161,7 +161,7 @@ For more details of how to configure tiered storage feature, you could reference
 >
 > If you are running Pulsar in a bare metal cluster, you need to make sure `offloaders` tarball is unzipped in every broker's pulsar directory
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled tiered storage offloaders.
 
 
@@ -229,12 +229,12 @@ If the message has been successfully published to the topic, you should see a co
 
 ## Using Pulsar clients locally
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md),  [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
+Pulsar currently offers client libraries for [Java](client-libraries-java.md),  [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
 
 * `http://localhost:8080`
 * `pulsar://localhost:6650`
 
-Here's an example producer for a Pulsar topic using the [Java](client-libraries-java) client:
+Here's an example producer for a Pulsar topic using the [Java](client-libraries-java.md) client:
 
 ```java
 
@@ -245,7 +245,7 @@ Producer<byte[]> producer = client.newProducer().topic("my-topic").create();
 
 ```
 
-Here's an example [Python](client-libraries-python) producer:
+Here's an example [Python](client-libraries-python.md) producer:
 
 ```python
 
@@ -256,7 +256,7 @@ producer = client.create_producer('my-topic')
 
 ```
 
-Finally, here's an example [C++](client-libraries-cpp) producer:
+Finally, here's an example [C++](client-libraries-cpp.md) producer:
 
 ```cpp
 
diff --git a/site2/website/versioned_docs/version-2.2.1/io-develop.md b/site2/website/versioned_docs/version-2.2.1/io-develop.md
index 69c9a2f42c4..d361a302b25 100644
--- a/site2/website/versioned_docs/version-2.2.1/io-develop.md
+++ b/site2/website/versioned_docs/version-2.2.1/io-develop.md
@@ -13,15 +13,15 @@ import TabItem from '@theme/TabItem';
 This guide describes how to develop Pulsar connectors to move data
 between Pulsar and other systems. 
 
-Pulsar connectors are special [Pulsar Functions](functions-overview), so creating
+Pulsar connectors are special [Pulsar Functions](functions-overview.md), so creating
 a Pulsar connector is similar to creating a Pulsar function. 
 
 Pulsar connectors come in two types: 
 
 | Type | Description | Example
 |---|---|---
-{@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}|Import data from another system to Pulsar.|[RabbitMQ source connector](io-rabbitmq) imports the messages of a RabbitMQ queue to a Pulsar topic.
-{@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java}|Export data from Pulsar to another system.|[Kinesis sink connector](io-kinesis) exports the messages of a Pulsar topic to a Kinesis stream.
+{@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}|Import data from another system to Pulsar.|[RabbitMQ source connector](io-rabbitmq.md) imports the messages of a RabbitMQ queue to a Pulsar topic.
+{@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java}|Export data from Pulsar to another system.|[Kinesis sink connector](io-kinesis.md) exports the messages of a Pulsar topic to a Kinesis stream.
 
 ## Develop
 
@@ -274,7 +274,7 @@ For more information about **how to create integration tests for Pulsar connecto
 ## Package
 
 Once you've developed and tested your connector, you need to package it so that it can be submitted
-to a [Pulsar Functions](functions-overview) cluster. 
+to a [Pulsar Functions](functions-overview.md) cluster. 
 
 There are two methods to
 work with Pulsar Functions' runtime, that is, [NAR](#nar) and [uber JAR](#uber-jar).
@@ -305,7 +305,7 @@ For more information about **how NAR works**, see [here](https://medium.com/hash
 
 :::
 
-Pulsar uses the same mechanism for packaging **all** [built-in connectors](io-connectors). 
+Pulsar uses the same mechanism for packaging **all** [built-in connectors](io-connectors.md). 
 
 The easiest approach to package a Pulsar connector is to create a NAR package using [nifi-nar-maven-plugin](https://mvnrepository.com/artifact/org.apache.nifi/nifi-nar-maven-plugin).
 
@@ -380,7 +380,7 @@ Pulsar connectors enable you to move data in and out of Pulsar easily. It is imp
 
 - Check the metrics provided by Pulsar.
 
-  Pulsar connectors expose the metrics that can be collected and used for monitoring the health of **Java** connectors. You can check the metrics by following the [monitoring](deploy-monitoring) guide.
+  Pulsar connectors expose the metrics that can be collected and used for monitoring the health of **Java** connectors. You can check the metrics by following the [monitoring](deploy-monitoring.md) guide.
 
 - Set and check your customized metrics.
 
diff --git a/site2/website/versioned_docs/version-2.2.1/io-managing.md b/site2/website/versioned_docs/version-2.2.1/io-managing.md
index 47a4922b38d..c2e49d8f05f 100644
--- a/site2/website/versioned_docs/version-2.2.1/io-managing.md
+++ b/site2/website/versioned_docs/version-2.2.1/io-managing.md
@@ -50,7 +50,7 @@ For details, consult the documentation for [individual connectors](io-overview.m
 
 ## Running Connectors
 
-Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Running sources
 
@@ -166,8 +166,8 @@ Here's an example to submit a Cassandra sink:
 
 ## Monitoring Connectors
 
-Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview), so you can use [`functions`](reference-pulsar-admin.md#source) commands
-available in the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview.md), so you can use [`functions`](reference-pulsar-admin.md#source) commands
+available in the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Retrieve Connector Metadata
 
diff --git a/site2/website/versioned_docs/version-2.2.1/io-overview.md b/site2/website/versioned_docs/version-2.2.1/io-overview.md
index f6e86827ed5..f501b014f6e 100644
--- a/site2/website/versioned_docs/version-2.2.1/io-overview.md
+++ b/site2/website/versioned_docs/version-2.2.1/io-overview.md
@@ -8,7 +8,7 @@ original_id: io-overview
 Messaging systems are most powerful when you can easily use them in conjunction with external systems like databases and other messaging systems. **Pulsar IO** is a feature of Pulsar that enables you to easily create, deploy, and manage Pulsar **connectors** that interact with external systems, such as [Apache Cassandra](https://cassandra.apache.org), [Aerospike](https://www.aerospike.com), and many others.
 
 > #### Pulsar IO and Pulsar Functions
-> Under the hood, Pulsar IO connectors are specialized [Pulsar Functions](functions-overview.md) purpose-built to interface with external systems. The [administrative interface](io-quickstart) for Pulsar IO is, in fact, quite similar to that of Pulsar Functions.
+> Under the hood, Pulsar IO connectors are specialized [Pulsar Functions](functions-overview.md) purpose-built to interface with external systems. The [administrative interface](io-quickstart.md) for Pulsar IO is, in fact, quite similar to that of Pulsar Functions.
 
 ## Sources and sinks
 
@@ -23,7 +23,7 @@ This diagram illustrates the relationship between sources, sinks, and Pulsar:
 
 ## Working with connectors
 
-Pulsar IO connectors can be managed via the [`pulsar-admin`](reference-pulsar-admin) CLI tool, in particular the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands.
+Pulsar IO connectors can be managed via the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool, in particular the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands.
 
 > For a guide to managing connectors in your Pulsar installation, see the [Getting started with Pulsar IO](io-quickstart.md)
 
@@ -31,11 +31,11 @@ The following connectors are currently available for Pulsar:
 
 |Name|Java Class|Documentation|
 |---|---|---|
-|[Aerospike sink](https://www.aerospike.com/)|[`org.apache.pulsar.io.aerospike.AerospikeSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/aerospike/src/main/java/org/apache/pulsar/io/aerospike/AerospikeStringSink.java)|[Documentation](io-aerospike)|
-|[Cassandra sink](https://cassandra.apache.org)|[`org.apache.pulsar.io.cassandra.CassandraSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/cassandra/src/main/java/org/apache/pulsar/io/cassandra/CassandraStringSink.java)|[Documentation](io-cassandra)|
+|[Aerospike sink](https://www.aerospike.com/)|[`org.apache.pulsar.io.aerospike.AerospikeSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/aerospike/src/main/java/org/apache/pulsar/io/aerospike/AerospikeStringSink.java)|[Documentation](io-aerospike.md)|
+|[Cassandra sink](https://cassandra.apache.org)|[`org.apache.pulsar.io.cassandra.CassandraSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/cassandra/src/main/java/org/apache/pulsar/io/cassandra/CassandraStringSink.java)|[Documentation](io-cassandra.md)|
 |[Kafka source](https://kafka.apache.org)|[`org.apache.pulsar.io.kafka.KafkaSource`](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaStringSource.java)|[Documentation](io-kafka.md#source)|
 |[Kafka sink](https://kafka.apache.org)|[`org.apache.pulsar.io.kafka.KafkaSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaStringSink.java)|[Documentation](io-kafka.md#sink)|
 |[Kinesis sink](https://aws.amazon.com/kinesis/)|[`org.apache.pulsar.io.kinesis.KinesisSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/kinesis/src/main/java/org/apache/pulsar/io/kinesis/KinesisSink.java)|[Documentation](io-kinesis.md#sink)|
 |[RabbitMQ source](https://www.rabbitmq.com)|[`org.apache.pulsar.io.rabbitmq.RabbitMQSource`](https://github.com/apache/pulsar/blob/master/pulsar-io/rabbitmq/src/main/java/org/apache/pulsar/io/rabbitmq/RabbitMQSource.java)|[Documentation](io-rabbitmq.md#sink)|
 |[Twitter Firehose source](https://developer.twitter.com/en/docs)|[`org.apache.pulsar.io.twitter.TwitterFireHose`](https://github.com/apache/pulsar/blob/master/pulsar-io/twitter/src/main/java/org/apache/pulsar/io/twitter/TwitterFireHose.java)|[Documentation](io-twitter.md#source)|
-|[CDC Connector](https://debezium.io/)|[`org.apache.pulsar.io.kafka.connect.KafkaConnectSource`](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java)|[Documentation](io-cdc)|
+|[CDC Connector](https://debezium.io/)|[`org.apache.pulsar.io.kafka.connect.KafkaConnectSource`](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java)|[Documentation](io-cdc.md)|
diff --git a/site2/website/versioned_docs/version-2.2.1/io-quickstart.md b/site2/website/versioned_docs/version-2.2.1/io-quickstart.md
index a6541d8e928..404c94979de 100644
--- a/site2/website/versioned_docs/version-2.2.1/io-quickstart.md
+++ b/site2/website/versioned_docs/version-2.2.1/io-quickstart.md
@@ -6,14 +6,14 @@ original_id: io-quickstart
 ---
 
 This tutorial provides a hands-on look at how you can move data out of Pulsar without writing a single line of code.
-It is helpful to review the [concepts](io-overview) for Pulsar I/O in tandem with running the steps in this guide
+It is helpful to review the [concepts](io-overview.md) for Pulsar I/O in tandem with running the steps in this guide
 to gain a deeper understanding. At the end of this tutorial, you will be able to:
 
 - Connect your Pulsar cluster with your Cassandra cluster
 
 :::tip
 
-1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone). However all
+1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone.md). However all
 the commands used in this tutorial should be able to be used in a multi-nodes Pulsar cluster without any changes.
 2. All the instructions are assumed to run at the root directory of a Pulsar binary distribution.
 
@@ -267,11 +267,11 @@ configs:
 
 ```
 
-To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra).
+To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra.md).
 
 ### Submit a Cassandra Sink
 
-Pulsar provides the [CLI](reference-cli-tools) for running and managing Pulsar I/O connectors.
+Pulsar provides the [CLI](reference-cli-tools.md) for running and managing Pulsar I/O connectors.
 
 We can run following command to sink a sink connector with type `cassandra` and config file `examples/cassandra-sink.yml`.
 
@@ -296,7 +296,7 @@ as a Pulsar Function and write the messages produced in topic `test_cassandra` t
 
 ### Inspect the Cassandra Sink
 
-Since an IO connector is running as [Pulsar Functions](functions-overview), you can use [functions CLI](reference-pulsar-admin.md#functions)
+Since an IO connector is running as [Pulsar Functions](functions-overview.md), you can use [functions CLI](reference-pulsar-admin.md#functions)
 for inspecting and managing the IO connectors.
 
 #### Retrieve Sink Info
diff --git a/site2/website/versioned_docs/version-2.2.1/pulsar-2.0.md b/site2/website/versioned_docs/version-2.2.1/pulsar-2.0.md
index 560c8c1bd7c..07fba365e9f 100644
--- a/site2/website/versioned_docs/version-2.2.1/pulsar-2.0.md
+++ b/site2/website/versioned_docs/version-2.2.1/pulsar-2.0.md
@@ -4,13 +4,13 @@ title: Pulsar 2.0
 sidebar_label: "Pulsar 2.0"
 ---
 
-Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview) feature, some terminology changes, and more.
+Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview.md) feature, some terminology changes, and more.
 
 ## New features in Pulsar 2.0
 
 Feature | Description
 :-------|:-----------
-[Pulsar Functions](functions-overview) | A lightweight compute option for Pulsar
+[Pulsar Functions](functions-overview.md) | A lightweight compute option for Pulsar
 
 ## Major changes
 
diff --git a/site2/website/versioned_docs/version-2.2.1/reference-cli-tools.md b/site2/website/versioned_docs/version-2.2.1/reference-cli-tools.md
index 1c3d601e00c..dcac11835f4 100644
--- a/site2/website/versioned_docs/version-2.2.1/reference-cli-tools.md
+++ b/site2/website/versioned_docs/version-2.2.1/reference-cli-tools.md
@@ -6,7 +6,7 @@ sidebar_label: "Pulsar CLI tools"
 
 Pulsar offers several command-line tools that you can use for managing Pulsar installations, performance testing, using command-line producers and consumers, and more.
 
-All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone). The following tools are currently documented:
+All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone.md). The following tools are currently documented:
 
 * [`pulsar`](#pulsar)
 * [`pulsar-client`](#pulsar-client)
@@ -825,7 +825,7 @@ Options
 
 ### `transaction`
 
-Run a transaction. For more information, see [Pulsar transactions](txn-why).
+Run a transaction. For more information, see [Pulsar transactions](txn-why.md).
 
 **Usage**
 
diff --git a/site2/website/versioned_docs/version-2.2.1/security-athenz.md b/site2/website/versioned_docs/version-2.2.1/security-athenz.md
index ba27ba43eb9..6d338fc4013 100644
--- a/site2/website/versioned_docs/version-2.2.1/security-athenz.md
+++ b/site2/website/versioned_docs/version-2.2.1/security-athenz.md
@@ -75,7 +75,7 @@ For more information on Pulsar client authentication using Athenz, see the follo
 
 ## Configure CLI tools for Athenz
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You need to add the following authentication parameters to the `conf/client.conf` config file to use Athenz with CLI tools of Pulsar:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/security-authorization.md b/site2/website/versioned_docs/version-2.2.1/security-authorization.md
index d9d33665d06..c5e3c04b035 100644
--- a/site2/website/versioned_docs/version-2.2.1/security-authorization.md
+++ b/site2/website/versioned_docs/version-2.2.1/security-authorization.md
@@ -26,7 +26,7 @@ superUserRoles=my-super-user-1,my-super-user-2
 > A full list of parameters is available in the `conf/broker.conf` file.
 > You can also find the default values for those parameters in [Broker Configuration](reference-configuration.md#broker). 
 
-Typically, you use superuser roles for administrators, clients as well as broker-to-broker authorization. When you use [geo-replication](concepts-replication), every broker needs to be able to publish to all the other topics of clusters.
+Typically, you use superuser roles for administrators, clients as well as broker-to-broker authorization. When you use [geo-replication](concepts-replication.md), every broker needs to be able to publish to all the other topics of clusters.
 
 You can also enable the authorization for the proxy in the proxy configuration file (`conf/proxy.conf`). Once you enable the authorization on the proxy, the proxy does an additional authorization check before forwarding the request to a broker. 
 If you enable authorization on the broker, the broker checks the authorization of the request when the broker receives the forwarded request.
@@ -58,7 +58,7 @@ superUserRoles=my-super-user-1,my-super-user-2,my-proxy-role
 
 Pulsar [instance](reference-terminology.md#instance) administrators or some kind of self-service portal typically provisions a Pulsar [tenant](reference-terminology.md#tenant). 
 
-You can manage tenants using the [`pulsar-admin`](reference-pulsar-admin) tool. 
+You can manage tenants using the [`pulsar-admin`](reference-pulsar-admin.md) tool. 
 
 ### Create a new tenant
 
@@ -86,7 +86,7 @@ persistent://tenant/namespace/topic
 
 ### Manage permissions
 
-You can use [Pulsar Admin Tools](admin-api-permissions) for managing permission in Pulsar.
+You can use [Pulsar Admin Tools](admin-api-permissions.md) for managing permission in Pulsar.
 
 ### Pulsar admin authentication
 
@@ -116,7 +116,7 @@ PulsarAdmin admin = PulsarAdmin.builder()
 When a client is identified with multiple roles in a token (the type of role claim in the token is an array) during the authentication process, Pulsar supports to check the permissions of all the roles and further authorize the client as long as one of its roles has the required permissions.
 
 > **Note**<br />
-> This authorization method is only compatible with [JWT authentication](security-jwt).
+> This authorization method is only compatible with [JWT authentication](security-jwt.md).
 
 To enable this authorization method, configure the authorization provider as `MultiRolesTokenAuthorizationProvider` in the `conf/broker.conf` file.
 
diff --git a/site2/website/versioned_docs/version-2.2.1/security-overview.md b/site2/website/versioned_docs/version-2.2.1/security-overview.md
index 2f3fc035ad4..3f08cb29ad8 100644
--- a/site2/website/versioned_docs/version-2.2.1/security-overview.md
+++ b/site2/website/versioned_docs/version-2.2.1/security-overview.md
@@ -20,7 +20,7 @@ You had better secure the service components in your Apache Pulsar deployment.
 
 In Pulsar, a *role* is a string, like `admin` or `app1`, which can represent a single client or multiple clients. You can use roles to control permission for clients to produce or consume from certain topics, administer the configuration for tenants, and so on.
 
-Apache Pulsar uses a [Authentication Provider](#authentication-providers) to establish the identity of a client and then assign a *role token* to that client. This role token is then used for [Authorization and ACLs](security-authorization) to determine what the client is authorized to do.
+Apache Pulsar uses a [Authentication Provider](#authentication-providers) to establish the identity of a client and then assign a *role token* to that client. This role token is then used for [Authorization and ACLs](security-authorization.md) to determine what the client is authorized to do.
 
 ## Authentication providers
 
diff --git a/site2/website/versioned_docs/version-2.2.1/security-tls-authentication.md b/site2/website/versioned_docs/version-2.2.1/security-tls-authentication.md
index bbc0514afa9..127140dc0c8 100644
--- a/site2/website/versioned_docs/version-2.2.1/security-tls-authentication.md
+++ b/site2/website/versioned_docs/version-2.2.1/security-tls-authentication.md
@@ -7,7 +7,7 @@ original_id: security-tls-authentication
 
 ## TLS Authentication Overview
 
-TLS authentication is an extension of [TLS transport encryption](security-tls-transport), but instead of only servers having keys and certs which the client uses to verify the server's identity, clients also have keys and certs which the server uses to verify the client's identity. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
+TLS authentication is an extension of [TLS transport encryption](security-tls-transport.md), but instead of only servers having keys and certs which the client uses to verify the server's identity, clients also have keys and certs which the server uses to verify the client's identity. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
 
 ### Creating client certificates
 
@@ -80,7 +80,7 @@ brokerClientTrustCertsFilePath=/path/my-ca/certs/ca.cert.pem
 
 To configure proxies to authenticate clients, put the following in `proxy.conf`, alongside [the configuration to enable tls transport](security-tls-transport.md#proxy-configuration):
 
-The proxy should have its own client key pair for connecting to brokers. The role token for this key pair should be configured in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization) for more details.
+The proxy should have its own client key pair for connecting to brokers. The role token for this key pair should be configured in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization.md) for more details.
 
 ```properties
 
@@ -100,7 +100,7 @@ When TLS authentication, the client needs to connect via TLS transport, so you n
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You'll need to add the following parameters to that file to use TLS authentication with Pulsar's CLI tools:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/security-tls-transport.md b/site2/website/versioned_docs/version-2.2.1/security-tls-transport.md
index d4a36de0a3d..51e90aa7660 100644
--- a/site2/website/versioned_docs/version-2.2.1/security-tls-transport.md
+++ b/site2/website/versioned_docs/version-2.2.1/security-tls-transport.md
@@ -9,7 +9,7 @@ original_id: security-tls-transport
 
 By default, Apache Pulsar clients communicate with the Apache Pulsar service in plain text, which means that all data is sent in the clear. TLS can be used to encrypt this traffic so that it cannot be snooped by a man-in-the-middle attacker.
 
-TLS can be configured for both encryption and authentication. You may configure just TLS transport encryption, which is covered in this guide. TLS authentication is covered [elsewhere](security-tls-authentication.md). Alternatively, you can use [another authentication mechanism](security-athenz) on top of TLS transport encryption.
+TLS can be configured for both encryption and authentication. You may configure just TLS transport encryption, which is covered in this guide. TLS authentication is covered [elsewhere](security-tls-authentication.md). Alternatively, you can use [another authentication mechanism](security-athenz.md) on top of TLS transport encryption.
 
 > Note that enabling TLS may have a performance impact due to encryption overhead.
 
@@ -19,7 +19,7 @@ TLS is a form of [public key cryptography](https://en.wikipedia.org/wiki/Public-
 
 To use TLS transport encryption, you need two kinds of key pairs, **server key pairs** and a **certificate authority**.
 
-A third kind of key pair, **client key pairs**, are used for [client authentication](security-tls-authentication).
+A third kind of key pair, **client key pairs**, are used for [client authentication](security-tls-authentication.md).
 
 The **certificate authority** private key should be stored in a very secure location (a fully encrypted, disconnected, air gapped computer). The certificate authority public key, the **trust cert**, can be freely shared.
 
@@ -27,7 +27,7 @@ For both client and server key pairs, the administrator first generates a privat
 
 For TLS transport encryption, the clients can use the **trust cert** to verify that the server they are talking to has a key pair that was signed by the certificate authority. A man-in-the-middle attacker would not have access to the certificate authority, so they couldn't create a server with such a key pair.
 
-For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that was signed by the certificate authority. The Common Name of the **client cert** is then used as the client's role token (see [Overview](security-overview)).
+For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that was signed by the certificate authority. The Common Name of the **client cert** is then used as the client's role token (see [Overview](security-overview.md)).
 
 ## Creating TLS Certificates
 
@@ -128,7 +128,7 @@ At this point, you have a cert, `broker.cert.pem`, and a key, `broker.key-pk8.pe
 
 ## Broker Configuration
 
-To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you'll need to make some changes to `broker.conf`, which is located in the `conf` directory of your [Pulsar installation](getting-started-standalone).
+To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you'll need to make some changes to `broker.conf`, which is located in the `conf` directory of your [Pulsar installation](getting-started-standalone.md).
 
 Add these values to the configuration file (substituting the appropriate certificate paths where necessary):
 
@@ -199,7 +199,7 @@ The examples below show hostname verification being disabled for the Java client
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools) like [`pulsar-admin`](reference-cli-tools.md#pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-cli-tools.md#pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You'll need to add the following parameters to that file to use TLS transport with Pulsar's CLI tools:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/security-token-admin.md b/site2/website/versioned_docs/version-2.2.1/security-token-admin.md
index f3cec69ec9d..60daefefede 100644
--- a/site2/website/versioned_docs/version-2.2.1/security-token-admin.md
+++ b/site2/website/versioned_docs/version-2.2.1/security-token-admin.md
@@ -171,7 +171,7 @@ brokerClientAuthenticationParameters=token:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0
 To configure proxies to authenticate clients, put the following in `proxy.conf`:
 
 The proxy will have its own token used when talking to brokers. The role token for this
-key pair should be configured in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization) for more details.
+key pair should be configured in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization.md) for more details.
 
 ```properties
 
diff --git a/site2/website/versioned_docs/version-2.2.1/security-token-client.md b/site2/website/versioned_docs/version-2.2.1/security-token-client.md
index 3af82b47607..d0ebd016856 100644
--- a/site2/website/versioned_docs/version-2.2.1/security-token-client.md
+++ b/site2/website/versioned_docs/version-2.2.1/security-token-client.md
@@ -26,12 +26,12 @@ Application will specify the token when creating the client instance. An alterna
 a "token supplier", that is to say a function that returns the token when the client library
 will need one.
 
-See [Token authentication admin](security-token-admin) for a reference on how to enable token
+See [Token authentication admin](security-token-admin.md) for a reference on how to enable token
 authentication on a Pulsar cluster.
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You'll need to add the following parameters to that file to use the token authentication with
 Pulsar's CLI tools:
diff --git a/site2/website/versioned_docs/version-2.2.1/sql-deployment-configurations.md b/site2/website/versioned_docs/version-2.2.1/sql-deployment-configurations.md
index 639ac988b34..069c6ac9c92 100644
--- a/site2/website/versioned_docs/version-2.2.1/sql-deployment-configurations.md
+++ b/site2/website/versioned_docs/version-2.2.1/sql-deployment-configurations.md
@@ -141,7 +141,7 @@ Since Pulsar SQL is powered by [Trino (formerly Presto SQL)](https://trino.io),
 
 :::note
 
-For how to set up a standalone single node environment, refer to [Query data](sql-getting-started). 
+For how to set up a standalone single node environment, refer to [Query data](sql-getting-started.md). 
 
 :::
 
diff --git a/site2/website/versioned_docs/version-2.2.1/sql-overview.md b/site2/website/versioned_docs/version-2.2.1/sql-overview.md
index 2f827f42679..5b01dfde56e 100644
--- a/site2/website/versioned_docs/version-2.2.1/sql-overview.md
+++ b/site2/website/versioned_docs/version-2.2.1/sql-overview.md
@@ -4,7 +4,7 @@ title: Pulsar SQL Overview
 sidebar_label: "Overview"
 ---
 
-Apache Pulsar is used to store streams of event data, and the event data is structured with predefined fields. With the implementation of the [Schema Registry](schema-get-started), you can store structured data in Pulsar and query the data by using [Trino (formerly Presto SQL)](https://trino.io/).
+Apache Pulsar is used to store streams of event data, and the event data is structured with predefined fields. With the implementation of the [Schema Registry](schema-get-started.md), you can store structured data in Pulsar and query the data by using [Trino (formerly Presto SQL.md)](https://trino.io/).
 
 As the core of Pulsar SQL, Presto Pulsar connector enables Presto workers within a Presto cluster to query data from Pulsar.
 
diff --git a/site2/website/versioned_docs/version-2.2.1/standalone-docker.md b/site2/website/versioned_docs/version-2.2.1/standalone-docker.md
index 6ff3696bd3a..1710ec819d7 100644
--- a/site2/website/versioned_docs/version-2.2.1/standalone-docker.md
+++ b/site2/website/versioned_docs/version-2.2.1/standalone-docker.md
@@ -46,8 +46,8 @@ For more information, see [Topics](concepts-messaging.md#topics).
 
 ## Use Pulsar in Docker
 
-Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python) 
-and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can
+Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) 
+and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can
 use one of these root URLs to interact with your cluster:
 
 * `pulsar://localhost:6650`
@@ -106,7 +106,7 @@ client.close()
 ## Get the topic statistics
 
 In Pulsar, you can use REST, Java, or command-line tools to control every aspect of the system.
-For details on APIs, refer to [Admin API Overview](admin-api-overview).
+For details on APIs, refer to [Admin API Overview](admin-api-overview.md).
 
 In the simplest example, you can use curl to probe the stats for a particular topic:
 
diff --git a/site2/website/versioned_docs/version-2.2.1/standalone.md b/site2/website/versioned_docs/version-2.2.1/standalone.md
index c17a49306cd..6cc589f5f12 100644
--- a/site2/website/versioned_docs/version-2.2.1/standalone.md
+++ b/site2/website/versioned_docs/version-2.2.1/standalone.md
@@ -8,7 +8,7 @@ original_id: standalone
 For the purposes of local development and testing, you can run Pulsar in standalone mode on your own machine. Standalone mode includes a Pulsar broker as well as the necessary ZooKeeper and BookKeeper components running inside of a single Java Virtual Machine (JVM) process.
 
 > #### Pulsar in production? 
-> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal) guide.
+> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal.md) guide.
 
 ## Run Pulsar Standalone Manually
 
@@ -112,7 +112,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you are running Pulsar in a bare metal cluster, you need to make sure `connectors` tarball is unzipped in every broker's pulsar directory
 > (or in every function-worker's pulsar directory if you are running a separate worker cluster for Pulsar functions).
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 ## Installing Tiered Storage Offloaders (optional)
@@ -121,7 +121,7 @@ pulsar-io-twitter-@pulsar:version@.nar
 > If you would like to enable tiered storage feature, you can follow the instructions as below; otherwise you can
 > skip this section for now.
 
-To get started using [tiered storage offloaders](concepts-tiered-storage), you'll need to download the offloaders tarball release on every broker node in
+To get started using [tiered storage offloaders](concepts-tiered-storage.md), you'll need to download the offloaders tarball release on every broker node in
 one of the following ways:
 
 * by clicking the link below and downloading the release from an Apache mirror:
@@ -161,7 +161,7 @@ For more details of how to configure tiered storage feature, you could reference
 >
 > If you are running Pulsar in a bare metal cluster, you need to make sure `offloaders` tarball is unzipped in every broker's pulsar directory
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled tiered storage offloaders.
 
 
@@ -229,12 +229,12 @@ If the message has been successfully published to the topic, you should see a co
 
 ## Using Pulsar clients locally
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md),  [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
+Pulsar currently offers client libraries for [Java](client-libraries-java.md),  [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
 
 * `http://localhost:8080`
 * `pulsar://localhost:6650`
 
-Here's an example producer for a Pulsar topic using the [Java](client-libraries-java) client:
+Here's an example producer for a Pulsar topic using the [Java](client-libraries-java.md) client:
 
 ```java
 
@@ -245,7 +245,7 @@ Producer<byte[]> producer = client.newProducer().topic("my-topic").create();
 
 ```
 
-Here's an example [Python](client-libraries-python) producer:
+Here's an example [Python](client-libraries-python.md) producer:
 
 ```python
 
@@ -256,7 +256,7 @@ producer = client.create_producer('my-topic')
 
 ```
 
-Finally, here's an example [C++](client-libraries-cpp) producer:
+Finally, here's an example [C++](client-libraries-cpp.md) producer:
 
 ```cpp
 
diff --git a/site2/website/versioned_docs/version-2.3.0/admin-api-clusters.md b/site2/website/versioned_docs/version-2.3.0/admin-api-clusters.md
index 04db2f60759..1255ad25d7a 100644
--- a/site2/website/versioned_docs/version-2.3.0/admin-api-clusters.md
+++ b/site2/website/versioned_docs/version-2.3.0/admin-api-clusters.md
@@ -88,7 +88,7 @@ When provision a new cluster, you need to initialize that cluster's [metadata](c
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers) that will belong to the cluster.
+You must initialize cluster metadata *before* starting up any [brokers](admin-api-brokers.md) that will belong to the cluster.
 
 > **No cluster metadata initialization through the REST API or the Java admin API**
 >
@@ -112,11 +112,11 @@ bin/pulsar initialize-cluster-metadata \
 
 ```
 
-You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication) in your instance.
+You'll need to use `--*-tls` flags only if you're using [TLS authentication](security-tls-authentication.md) in your instance.
 
 ### Get configuration
 
-You can fetch the [configuration](reference-configuration) for an existing cluster at any time.
+You can fetch the [configuration](reference-configuration.md) for an existing cluster at any time.
 
 ````mdx-code-block
 <Tabs 
diff --git a/site2/website/versioned_docs/version-2.3.0/admin-api-namespaces.md b/site2/website/versioned_docs/version-2.3.0/admin-api-namespaces.md
index 5be203344c6..f2efbc0d2dd 100644
--- a/site2/website/versioned_docs/version-2.3.0/admin-api-namespaces.md
+++ b/site2/website/versioned_docs/version-2.3.0/admin-api-namespaces.md
@@ -9,7 +9,7 @@ Pulsar [namespaces](reference-terminology.md#namespace) are logical groupings of
 
 Namespaces can be managed via:
 
-* The [`namespaces`](reference-pulsar-admin.md#clusters) command of the [`pulsar-admin`](reference-pulsar-admin) tool
+* The [`namespaces`](reference-pulsar-admin.md#clusters) command of the [`pulsar-admin`](reference-pulsar-admin.md) tool
 * The `/admin/v2/namespaces` endpoint of the admin {@inject: rest:REST:/} API
 * The `namespaces` method of the {@inject: javadoc:PulsarAdmin:/admin/org/apache/pulsar/client/admin/PulsarAdmin} object in the [Java API](client-libraries-java.md)
 
diff --git a/site2/website/versioned_docs/version-2.3.0/admin-api-non-persistent-topics.md b/site2/website/versioned_docs/version-2.3.0/admin-api-non-persistent-topics.md
index 78dac355894..2c645e507ca 100644
--- a/site2/website/versioned_docs/version-2.3.0/admin-api-non-persistent-topics.md
+++ b/site2/website/versioned_docs/version-2.3.0/admin-api-non-persistent-topics.md
@@ -4,4 +4,4 @@ title: Managing non-persistent topics
 sidebar_label: "Non-Persistent topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.3.0/admin-api-partitioned-topics.md b/site2/website/versioned_docs/version-2.3.0/admin-api-partitioned-topics.md
index 22fddaa9f84..0da13e77f69 100644
--- a/site2/website/versioned_docs/version-2.3.0/admin-api-partitioned-topics.md
+++ b/site2/website/versioned_docs/version-2.3.0/admin-api-partitioned-topics.md
@@ -6,7 +6,7 @@ original_id: admin-api-partitioned-topics
 ---
 
 
-You can use Pulsar's [admin API](admin-api-overview) to create and manage partitioned topics.
+You can use Pulsar's [admin API](admin-api-overview.md) to create and manage partitioned topics.
 
 In all of the instructions and commands below, the topic name structure is:
 
diff --git a/site2/website/versioned_docs/version-2.3.0/admin-api-persistent-topics.md b/site2/website/versioned_docs/version-2.3.0/admin-api-persistent-topics.md
index 8a7abaea373..206304005da 100644
--- a/site2/website/versioned_docs/version-2.3.0/admin-api-persistent-topics.md
+++ b/site2/website/versioned_docs/version-2.3.0/admin-api-persistent-topics.md
@@ -4,4 +4,4 @@ title: Managing persistent topics
 sidebar_label: "Persistent topics"
 ---
 
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.3.0/admin-api-tenants.md b/site2/website/versioned_docs/version-2.3.0/admin-api-tenants.md
index 8071b3261c6..fd2ccd0fe00 100644
--- a/site2/website/versioned_docs/version-2.3.0/admin-api-tenants.md
+++ b/site2/website/versioned_docs/version-2.3.0/admin-api-tenants.md
@@ -20,7 +20,7 @@ import TabItem from '@theme/TabItem';
 > 
 > - For the latest and complete information about `Java admin API`, including classes, methods, descriptions, and more, see [Java admin API doc](https://pulsar.apache.org/api/admin/).
 
-Tenants, like namespaces, can be managed using the [admin API](admin-api-overview). There are currently two configurable aspects of tenants:
+Tenants, like namespaces, can be managed using the [admin API](admin-api-overview.md). There are currently two configurable aspects of tenants:
 
 * Admin roles
 * Allowed clusters
@@ -121,7 +121,7 @@ admin.tenants().createTenant(tenantName, tenantInfo);
 
 ### Get configuration
 
-You can fetch the [configuration](reference-configuration) for an existing tenant at any time.
+You can fetch the [configuration](reference-configuration.md) for an existing tenant at any time.
 
 ````mdx-code-block
 <Tabs 
diff --git a/site2/website/versioned_docs/version-2.3.0/administration-dashboard.md b/site2/website/versioned_docs/version-2.3.0/administration-dashboard.md
index 1eb0404dfe0..92bd7e17869 100644
--- a/site2/website/versioned_docs/version-2.3.0/administration-dashboard.md
+++ b/site2/website/versioned_docs/version-2.3.0/administration-dashboard.md
@@ -7,7 +7,7 @@ original_id: administration-dashboard
 
 :::note
 
-Pulsar dashboard is deprecated. We recommend you use [Pulsar Manager](administration-pulsar-manager) to manage and monitor the stats of your topics. 
+Pulsar dashboard is deprecated. We recommend you use [Pulsar Manager](administration-pulsar-manager.md) to manage and monitor the stats of your topics. 
 
 :::
 
diff --git a/site2/website/versioned_docs/version-2.3.0/administration-geo.md b/site2/website/versioned_docs/version-2.3.0/administration-geo.md
index 78f72e1832e..766840cf73f 100644
--- a/site2/website/versioned_docs/version-2.3.0/administration-geo.md
+++ b/site2/website/versioned_docs/version-2.3.0/administration-geo.md
@@ -71,7 +71,7 @@ $ bin/pulsar-admin clusters create \
    :::tip
 
    - If you want to use a secure connection for a cluster, you can use the flags `--broker-url-secure` and `--url-secure`. For more information, see [pulsar-admin clusters create](https://pulsar.apache.org/tools/pulsar-admin/).
-   - Different clusters may have different authentications. You can use the authentication flag `--auth-plugin` and `--auth-parameters` together to set cluster authentication, which overrides `brokerClientAuthenticationPlugin` and `brokerClientAuthenticationParameters` if `authenticationEnabled` sets to `true` in `broker.conf` and `standalone.conf`. For more information, see [authentication and authorization](concepts-authentication).
+   - Different clusters may have different authentications. You can use the authentication flag `--auth-plugin` and `--auth-parameters` together to set cluster authentication, which overrides `brokerClientAuthenticationPlugin` and `brokerClientAuthenticationParameters` if `authenticationEnabled` sets to `true` in `broker.conf` and `standalone.conf`. For more information, see [authentication and authorization](concepts-authentication.md).
 
    :::
 
@@ -135,7 +135,7 @@ $ bin/pulsar-admin namespaces set-clusters my-tenant/my-namespace \
 
 By default, messages are replicated to all clusters configured for the namespace. You can restrict replication selectively by specifying a replication list for a message, and then that message is replicated only to the subset in the replication list.
 
-The following is an example for the [Java API](client-libraries-java). Note the use of the `setReplicationClusters` method when you construct the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
+The following is an example for the [Java API](client-libraries-java.md). Note the use of the `setReplicationClusters` method when you construct the {@inject: javadoc:Message:/client/org/apache/pulsar/client/api/Message} object:
 
 ```java
 
diff --git a/site2/website/versioned_docs/version-2.3.0/administration-zk-bk.md b/site2/website/versioned_docs/version-2.3.0/administration-zk-bk.md
index f125f27e039..8768f210385 100644
--- a/site2/website/versioned_docs/version-2.3.0/administration-zk-bk.md
+++ b/site2/website/versioned_docs/version-2.3.0/administration-zk-bk.md
@@ -182,7 +182,7 @@ Configuration for configuration store is handled by the [`conf/global-zookeeper.
 
 BookKeeper is responsible for all durable message storage in Pulsar. BookKeeper is a distributed [write-ahead log](https://en.wikipedia.org/wiki/Write-ahead_logging) WAL system that guarantees read consistency of independent message logs called ledgers. Individual BookKeeper servers are also called *bookies*.
 
-> For a guide to managing message persistence, retention, and expiry in Pulsar, see [this cookbook](cookbooks-retention-expiry).
+> For a guide to managing message persistence, retention, and expiry in Pulsar, see [this cookbook](cookbooks-retention-expiry.md).
 
 ### Deploying BookKeeper
 
diff --git a/site2/website/versioned_docs/version-2.3.0/client-libraries-go.md b/site2/website/versioned_docs/version-2.3.0/client-libraries-go.md
index 9e33717d556..6720cbf6877 100644
--- a/site2/website/versioned_docs/version-2.3.0/client-libraries-go.md
+++ b/site2/website/versioned_docs/version-2.3.0/client-libraries-go.md
@@ -16,7 +16,7 @@ The Pulsar Go client can be used to create Pulsar [producers](#producers), [cons
 ### Requirements
 
 Pulsar Go client library is based on the C++ client library. Follow
-the instructions for [C++ library](client-libraries-cpp) for installing the binaries
+the instructions for [C++ library](client-libraries-cpp.md) for installing the binaries
 through [RPM](client-libraries-cpp.md#rpm), [Deb](client-libraries-cpp.md#deb) or [Homebrew packages](client-libraries-cpp.md#macos).
 
 ### Installing go package
@@ -50,7 +50,7 @@ import "github.com/apache/pulsar/pulsar-client-go/pulsar"
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 Pulsar protocol URLs are assigned to specific clusters, use the `pulsar` scheme and have a default port of 6650. Here's an example for `localhost`:
 
@@ -68,7 +68,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you're using [TLS](security-tls-authentication) authentication, the URL will look like something like this:
+If you're using [TLS](security-tls-authentication.md) authentication, the URL will look like something like this:
 
 ```http
 
@@ -223,14 +223,14 @@ Parameter | Description | Default
 :---------|:------------|:-------
 `Topic` | The Pulsar [topic](reference-terminology.md#topic) to which the producer will publish messages |
 `Name` | A name for the producer. If you don't explicitly assign a name, Pulsar will automatically generate a globally unique name that you can access later using the `Name()` method.  If you choose to explicitly assign a name, it will need to be unique across *all* Pulsar clusters, otherwise the creation operation will throw an error. |
-`SendTimeout` | When publishing a message to a topic, the producer will wait for an acknowledgment from the responsible Pulsar [broker](reference-terminology.md#broker). If a message is not acknowledged within the threshold set by this parameter, an error will be thrown. If you set `SendTimeout` to -1, the timeout will be set to infinity (and thus removed). Removing the send timeout is recommended when using Pulsar's [message de-duplication](cookbooks-deduplication) feature. | 30 seconds
+`SendTimeout` | When publishing a message to a topic, the producer will wait for an acknowledgment from the responsible Pulsar [broker](reference-terminology.md#broker). If a message is not acknowledged within the threshold set by this parameter, an error will be thrown. If you set `SendTimeout` to -1, the timeout will be set to infinity (and thus removed). Removing the send timeout is recommended when using Pulsar's [message de-duplication](cookbooks-deduplication.md) feature. | 30 seconds
 `MaxPendingMessages` | The maximum size of the queue holding pending messages (i.e. messages waiting to receive an acknowledgment from the [broker](reference-terminology.md#broker)). By default, when the queue is full all calls to the `Send` and `SendAsync` methods will fail *unless* `BlockIfQueueFull` is set to `true`. |
 `MaxPendingMessagesAcrossPartitions` | |
 `BlockIfQueueFull` | If set to `true`, the producer's `Send` and `SendAsync` methods will block when the outgoing message queue is full rather than failing and throwing an error (the size of that queue is dictated by the `MaxPendingMessages` parameter); if set to `false` (the default), `Send` and `SendAsync` operations will fail and throw a `ProducerQueueIsFullError` when the queue is full. | `false`
 `MessageRoutingMode` | The message routing logic (for producers on [partitioned topics](concepts-architecture-overview.md#partitioned-topics)). This logic is applied only when no key is set on messages. The available options are: round robin (`pulsar.RoundRobinDistribution`, the default), publishing all messages to a single partition (`pulsar.UseSinglePartition`), or a custom partitioning scheme (`pulsar.CustomPartition`). | `pulsar.RoundRobinDistribution`
 `HashingScheme` | The hashing function that determines the partition on which a particular message is published (partitioned topics only). The available options are: `pulsar.JavaStringHash` (the equivalent of `String.hashCode()` in Java), `pulsar.Murmur3_32Hash` (applies the [Murmur3](https://en.wikipedia.org/wiki/MurmurHash) hashing function), or `pulsar.BoostHash` (applies the hashing function from C++'s [Boost](https://www.boost.org/doc/libs/1_62_0/doc/html/hash.html) library) | `puls [...]
 `CompressionType` | The message data compression type used by the producer. The available options are [`LZ4`](https://github.com/lz4/lz4), [`ZLIB`](https://zlib.net/) and [`ZSTD`](https://facebook.github.io/zstd/). | No compression
-`MessageRouter` | By default, Pulsar uses a round-robin routing scheme for [partitioned topics](cookbooks-partitioned). The `MessageRouter` parameter enables you to specify custom routing logic via a function that takes the Pulsar message and topic metadata as an argument and returns an integer (where the ), i.e. a function signature of `func(Message, TopicMetadata) int`. |
+`MessageRouter` | By default, Pulsar uses a round-robin routing scheme for [partitioned topics](cookbooks-partitioned.md). The `MessageRouter` parameter enables you to specify custom routing logic via a function that takes the Pulsar message and topic metadata as an argument and returns an integer (where the ), i.e. a function signature of `func(Message, TopicMetadata) int`. |
 
 ## Consumers
 
@@ -475,7 +475,7 @@ Parameter | Description
 
 ## TLS encryption and authentication
 
-In order to use [TLS encryption](security-tls-transport), you'll need to configure your client to do so:
+In order to use [TLS encryption](security-tls-transport.md), you'll need to configure your client to do so:
 
  * Use `pulsar+ssl` URL type
  * Set `TLSTrustCertsFilePath` to the path to the TLS certs used by your client and the Pulsar broker
diff --git a/site2/website/versioned_docs/version-2.3.0/client-libraries-java.md b/site2/website/versioned_docs/version-2.3.0/client-libraries-java.md
index 2c349dbf12f..1058b0896fa 100644
--- a/site2/website/versioned_docs/version-2.3.0/client-libraries-java.md
+++ b/site2/website/versioned_docs/version-2.3.0/client-libraries-java.md
@@ -10,7 +10,7 @@ import TabItem from '@theme/TabItem';
 ````
 
 
-You can use a Pulsar Java client to create the Java [producer](#producer), [consumer](#consumer), [reader](#reader) and [TableView](#tableview) of messages and to perform [administrative tasks](admin-api-overview). The current Java client version is **@pulsar:version@**.
+You can use a Pulsar Java client to create the Java [producer](#producer), [consumer](#consumer), [reader](#reader) and [TableView](#tableview) of messages and to perform [administrative tasks](admin-api-overview.md). The current Java client version is **@pulsar:version@**.
 
 All the methods in [producer](#producer), [consumer](#consumer), [reader](#reader) and [TableView](#tableview) of a Java client are thread-safe.
 
@@ -19,10 +19,10 @@ Javadoc for the Pulsar client is divided into two domains by package as follows.
 Package | Description | Maven Artifact
 :-------|:------------|:--------------
 [`org.apache.pulsar.client.api`](/api/client) | [The producer and consumer API](https://pulsar.apache.org/api/client/) | [org.apache.pulsar:pulsar-client:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client%7C@pulsar:version@%7Cjar)
-[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
+[`org.apache.pulsar.client.admin`](/api/admin) | The Java [admin API](admin-api-overview.md) | [org.apache.pulsar:pulsar-client-admin:@pulsar:version@](http://search.maven.org/#artifactdetails%7Corg.apache.pulsar%7Cpulsar-client-admin%7C@pulsar:version@%7Cjar)
 `org.apache.pulsar.client.all` |Include both `pulsar-client` and `pulsar-client-admin`<br /> Both `pulsar-client` and `pulsar-client-admin` are shaded packages and they shade dependencies independently. Consequently, the applications using both `pulsar-client` and `pulsar-client-admin` have redundant shaded classes. It would be troublesome if you introduce new dependencies but forget to update shading rules. <br /> In this case, you can use `pulsar-client-all`, which shades dependencies  [...]
 
-This document focuses only on the client API for producing and consuming messages on Pulsar topics. For how to use the Java admin client, see [Pulsar admin interface](admin-api-overview).
+This document focuses only on the client API for producing and consuming messages on Pulsar topics. For how to use the Java admin client, see [Pulsar admin interface](admin-api-overview.md).
 
 ## Installation
 
@@ -69,7 +69,7 @@ dependencies {
 
 ## Connection URLs
 
-To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol) URL.
+To connect to Pulsar using client libraries, you need to specify a [Pulsar protocol](developing-binary-protocol.md) URL.
 
 You can assign Pulsar protocol URLs to specific clusters and use the `pulsar` scheme. The default port is `6650`. The following is an example of `localhost`.
 
@@ -95,7 +95,7 @@ pulsar://pulsar.us-west.example.com:6650
 
 ```
 
-If you use [TLS](security-tls-authentication) authentication, the URL is as follows. 
+If you use [TLS](security-tls-authentication.md) authentication, the URL is as follows. 
 
 ```http
 
@@ -126,7 +126,7 @@ PulsarClient client = PulsarClient.builder()
 ```
 
 > ### Default broker URLs for standalone clusters
-> If you run a cluster in [standalone mode](getting-started-standalone), the broker is available at the `pulsar://localhost:6650` URL by default.
+> If you run a cluster in [standalone mode](getting-started-standalone.md), the broker is available at the `pulsar://localhost:6650` URL by default.
 
 If you create a client, you can use the `loadConf` configuration. The following parameters are available in `loadConf`.
 
@@ -279,7 +279,7 @@ Currently, cluster-level failover can perform probes to prevent data loss, but i
 
 > #### What are the relationships between cluster-level failover and geo-replication?
 
-The cluster-level failover is an extension of [geo-replication](concepts-replication) to improve stability and robustness. The cluster-level failover depends on geo-replication, and they have some **differences** as below.
+The cluster-level failover is an extension of [geo-replication](concepts-replication.md) to improve stability and robustness. The cluster-level failover depends on geo-replication, and they have some **differences** as below.
 
 Influence |Cluster-level failover|Geo-replication
 |---|---|---
@@ -576,7 +576,7 @@ Producer<byte[]> producer = client.newProducer()
 
 ### Message routing
 
-When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more information on specifying a routing mode using the Java client, see the [Partitioned Topics cookbook](cookbooks-partitioned).
+When using partitioned topics, you can specify the routing mode whenever you publish messages using a producer. For more information on specifying a routing mode using the Java client, see the [Partitioned Topics cookbook](cookbooks-partitioned.md).
 
 ### Async send
 
@@ -1370,7 +1370,7 @@ tv.forEach((key, value) -> /*operations on all existing messages*/)
 
 ## Schema
 
-In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](schema-get-started) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types). If you construct, say, a [producer](#producer) without specifying a schema, then the producer can only produce messages of type `byte[]`. The following is an example.
+In Pulsar, all message data consists of byte arrays "under the hood." [Message schemas](schema-get-started.md) enable you to use other types of data when constructing and handling messages (from simple types like strings to more complex, application-specific types.md). If you construct, say, a [producer](#producer) without specifying a schema, then the producer can only produce messages of type `byte[]`. The following is an example.
 
 ```java
 
@@ -1488,7 +1488,7 @@ For example of ProtobufNativeSchema, see [`SchemaDefinition` in `Complex type`](
 
 ## Authentication
 
-Pulsar currently supports three authentication schemes: [TLS](security-tls-authentication.md), [Athenz](security-athenz.md), and [Oauth2](security-oauth2). You can use the Pulsar Java client with all of them.
+Pulsar currently supports three authentication schemes: [TLS](security-tls-authentication.md), [Athenz](security-athenz.md), and [Oauth2](security-oauth2.md). You can use the Pulsar Java client with all of them.
 
 ### TLS Authentication
 
@@ -1515,7 +1515,7 @@ PulsarClient client = PulsarClient.builder()
 
 ### Athenz
 
-To use [Athenz](security-athenz) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
+To use [Athenz](security-athenz.md) as an authentication provider, you need to [use TLS](#tls-authentication) and provide values for four parameters in a hash:
 
 * `tenantDomain`
 * `tenantService`
@@ -1552,7 +1552,7 @@ PulsarClient client = PulsarClient.builder()
 
 ### Oauth2
 
-The following example shows how to use [Oauth2](security-oauth2) as an authentication provider for the Pulsar Java client.
+The following example shows how to use [Oauth2](security-oauth2.md) as an authentication provider for the Pulsar Java client.
 
 You can use the factory method to configure authentication for Pulsar Java client.
 
diff --git a/site2/website/versioned_docs/version-2.3.0/client-libraries-python.md b/site2/website/versioned_docs/version-2.3.0/client-libraries-python.md
index 02b1f498d2f..f0a8f92304f 100644
--- a/site2/website/versioned_docs/version-2.3.0/client-libraries-python.md
+++ b/site2/website/versioned_docs/version-2.3.0/client-libraries-python.md
@@ -5,7 +5,7 @@ sidebar_label: "Python"
 original_id: client-libraries-python
 ---
 
-The Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp) and exposes all of the [same features](/api/cpp). You can find the code in the [`python` subdirectory](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
+The Pulsar Python client library is a wrapper over the existing [C++ client library](client-libraries-cpp.md) and exposes all of the [same features](/api/cpp). You can find the code in the [`python` subdirectory](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) of the C++ client code.
 
 ## Installation
 
diff --git a/site2/website/versioned_docs/version-2.3.0/client-libraries-websocket.md b/site2/website/versioned_docs/version-2.3.0/client-libraries-websocket.md
index a6e60361749..0b31ffe7816 100644
--- a/site2/website/versioned_docs/version-2.3.0/client-libraries-websocket.md
+++ b/site2/website/versioned_docs/version-2.3.0/client-libraries-websocket.md
@@ -4,14 +4,14 @@ title: Pulsar WebSocket API
 sidebar_label: "WebSocket"
 ---
 
-Pulsar [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API provides a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients). Through WebSocket, you can publish and consume messages and use features available on the [Client Features Matrix](https://github.com/apache/pulsar/wiki/Client-Features-Matrix) page.
+Pulsar [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) API provides a simple way to interact with Pulsar using languages that do not have an official [client library](getting-started-clients.md). Through WebSocket, you can publish and consume messages and use features available on the [Client Features Matrix](https://github.com/apache/pulsar/wiki/Client-Features-Matrix) page.
 
 
 > You can use Pulsar WebSocket API with any WebSocket client library. See examples for Python and Node.js [below](#client-examples).
 
 ## Running the WebSocket service
 
-The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone) already has the WebSocket service enabled.
+The standalone variant of Pulsar that we recommend using for [local development](getting-started-standalone.md) already has the WebSocket service enabled.
 
 In non-standalone mode, there are two ways to deploy the WebSocket service:
 
diff --git a/site2/website/versioned_docs/version-2.3.0/client-libraries.md b/site2/website/versioned_docs/version-2.3.0/client-libraries.md
index 536cd0ccda8..8f91dfbbbdd 100644
--- a/site2/website/versioned_docs/version-2.3.0/client-libraries.md
+++ b/site2/website/versioned_docs/version-2.3.0/client-libraries.md
@@ -8,12 +8,12 @@ Pulsar supports the following client libraries:
 
 |Language|Documentation|Release note|Code repo
 |---|---|---|---
-Java |- [User doc](client-libraries-java) <br /><br />- [API doc](https://pulsar.apache.org/api/client/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client) 
-C++ | - [User doc](client-libraries-cpp) <br /><br />- [API doc](https://pulsar.apache.org/api/cpp/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp) 
-Python | - [User doc](client-libraries-python) <br /><br />- [API doc](https://pulsar.apache.org/api/python/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) 
-WebSocket| [User doc](client-libraries-websocket) | [Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-websocket) 
+Java |- [User doc](client-libraries-java.md) <br /><br />- [API doc](https://pulsar.apache.org/api/client/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client) 
+C++ | - [User doc](client-libraries-cpp.md) <br /><br />- [API doc](https://pulsar.apache.org/api/cpp/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp) 
+Python | - [User doc](client-libraries-python.md) <br /><br />- [API doc](https://pulsar.apache.org/api/python/)|[Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-client-cpp/python) 
+WebSocket| [User doc](client-libraries-websocket.md) | [Here](https://pulsar.apache.org/release-notes/)|[Here](https://github.com/apache/pulsar/tree/master/pulsar-websocket) 
 Go client|[User doc](client-libraries-go.md)|[Here](https://github.com/apache/pulsar-client-go/blob/master/CHANGELOG) |[Here](https://github.com/apache/pulsar-client-go) 
-Node.js|[User doc](client-libraries-node)|[Here](https://github.com/apache/pulsar-client-node/releases) |[Here](https://github.com/apache/pulsar-client-node) 
+Node.js|[User doc](client-libraries-node.md)|[Here](https://github.com/apache/pulsar-client-node/releases) |[Here](https://github.com/apache/pulsar-client-node) 
 C# |[User doc](client-libraries-dotnet.md)| [Here](https://github.com/apache/pulsar-dotpulsar/blob/master/CHANGELOG)|[Here](https://github.com/apache/pulsar-dotpulsar) 
 
 :::note
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-architecture-overview.md b/site2/website/versioned_docs/version-2.3.0/concepts-architecture-overview.md
index 0d96b59f8ae..1ce346fc169 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-architecture-overview.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-architecture-overview.md
@@ -4,7 +4,7 @@ title: Architecture Overview
 sidebar_label: "Architecture"
 ---
 
-At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication) data amongst themselves.
+At the highest level, a Pulsar instance is composed of one or more Pulsar clusters. Clusters within an instance can [replicate](concepts-replication.md) data amongst themselves.
 
 In a Pulsar cluster:
 
@@ -16,20 +16,20 @@ The diagram below provides an illustration of a Pulsar cluster:
 
 ![Pulsar architecture diagram](/assets/pulsar-system-architecture.png)
 
-At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication).
+At the broader instance level, an instance-wide ZooKeeper cluster called the configuration store handles coordination tasks involving multiple clusters, for example [geo-replication](concepts-replication.md).
 
 ## Brokers
 
 The Pulsar message broker is a stateless component that's primarily responsible for running two other components:
 
 * An HTTP server that exposes a {@inject: rest:REST:/} API for both administrative tasks and [topic lookup](concepts-clients.md#client-setup-phase) for producers and consumers. The producers connect to the brokers to publish messages and the consumers connect to the brokers to consume the messages.
-* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol) used for all data transfers
+* A dispatcher, which is an asynchronous TCP server over a custom [binary protocol](developing-binary-protocol.md) used for all data transfers
 
 Messages are typically dispatched out of a [managed ledger](#managed-ledgers) cache for the sake of performance, *unless* the backlog exceeds the cache size. If the backlog grows too large for the cache, the broker will start reading entries from BookKeeper.
 
-Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java).
+Finally, to support geo-replication on global topics, the broker manages replicators that tail the entries published in the local region and republish them to the remote region using the Pulsar [Java client library](client-libraries-java.md).
 
-> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers) guide.
+> For a guide to managing Pulsar brokers, see the [brokers](admin-api-brokers.md) guide.
 
 ## Clusters
 
@@ -39,9 +39,9 @@ A Pulsar instance consists of one or more Pulsar *clusters*. Clusters, in turn,
 * A ZooKeeper quorum used for cluster-level configuration and coordination
 * An ensemble of bookies used for [persistent storage](#persistent-storage) of messages
 
-Clusters can replicate amongst themselves using [geo-replication](concepts-replication).
+Clusters can replicate amongst themselves using [geo-replication](concepts-replication.md).
 
-> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters) guide.
+> For a guide to managing Pulsar clusters, see the [clusters](admin-api-clusters.md) guide.
 
 ## Metadata store
 
@@ -139,17 +139,17 @@ $ bin/pulsar proxy \
 ```
 
 > #### Pulsar proxy docs
-> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy).
+> For documentation on using the Pulsar proxy, see the [Pulsar proxy admin documentation](administration-proxy.md).
 
 
 Some important things to know about the Pulsar proxy:
 
 * Connecting clients don't need to provide *any* specific configuration to use the Pulsar proxy. You won't need to update the client configuration for existing applications beyond updating the IP used for the service URL (for example if you're running a load balancer over the Pulsar proxy).
-* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication) is supported by the Pulsar proxy
+* [TLS encryption](security-tls-transport.md) and [authentication](security-tls-authentication.md) is supported by the Pulsar proxy
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL.
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to be able to communicate with an entire Pulsar instance using a single URL.
 
 You can use your own service discovery system if you'd like. If you use your own system, there is just one requirement: when a client performs an HTTP request to an endpoint, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to *some* active broker in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
@@ -157,7 +157,7 @@ The diagram below illustrates Pulsar service discovery:
 
 ![alt-text](/assets/pulsar-service-discovery.png)
 
-In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python), for example, could access this Pulsar cluster like this:
+In this diagram, the Pulsar cluster is addressable via a single DNS name: `pulsar-cluster.acme.com`. A [Python client](client-libraries-python.md), for example, could access this Pulsar cluster like this:
 
 ```python
 
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-authentication.md b/site2/website/versioned_docs/version-2.3.0/concepts-authentication.md
index 335da8dc5a5..fbefead69f3 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-authentication.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-authentication.md
@@ -4,5 +4,5 @@ title: Authentication and Authorization
 sidebar_label: "Authentication and Authorization"
 ---
 
-Pulsar supports a pluggable [authentication](security-overview.md) mechanism which can be configured at the proxy and/or the broker. Pulsar also supports a pluggable [authorization](security-authorization) mechanism. These mechanisms work together to identify the client and its access rights on topics, namespaces and tenants.
+Pulsar supports a pluggable [authentication](security-overview.md) mechanism which can be configured at the proxy and/or the broker. Pulsar also supports a pluggable [authorization](security-authorization.md) mechanism. These mechanisms work together to identify the client and its access rights on topics, namespaces and tenants.
 
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-clients.md b/site2/website/versioned_docs/version-2.3.0/concepts-clients.md
index 65201b5ce1c..c0fe61cd06e 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-clients.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-clients.md
@@ -4,12 +4,12 @@ title: Pulsar Clients
 sidebar_label: "Clients"
 ---
 
-Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md), [C++](client-libraries-cpp.md) and [C#](client-libraries-dotnet). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
+Pulsar exposes a client API with language bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md), [C++](client-libraries-cpp.md) and [C#](client-libraries-dotnet.md). The client API optimizes and encapsulates Pulsar's client-broker communication protocol and exposes a simple and intuitive API for use by applications.
 
 Under the hood, the current official Pulsar client libraries support transparent reconnection and/or connection failover to brokers, queuing of messages until acknowledged by the broker, and heuristics such as connection retries with backoff.
 
 > **Custom client libraries**
-> If you'd like to create your own client library, we recommend consulting the documentation on Pulsar's custom [binary protocol](developing-binary-protocol).
+> If you'd like to create your own client library, we recommend consulting the documentation on Pulsar's custom [binary protocol](developing-binary-protocol.md).
 
 
 ## Client setup phase
@@ -37,7 +37,7 @@ Internally, the reader interface is implemented as a consumer using an exclusive
 
 [ **IMPORTANT** ]
 
-Unlike subscription/consumer, readers are non-durable in nature and does not prevent data in a topic from being deleted, thus it is ***strongly*** advised that [data retention](cookbooks-retention-expiry) be configured. If data retention for a topic is not configured for an adequate amount of time, messages that the reader has not yet read might be deleted .  This causes the readers to essentially skip messages. Configuring the data retention for a topic guarantees the reader with a cert [...]
+Unlike subscription/consumer, readers are non-durable in nature and does not prevent data in a topic from being deleted, thus it is ***strongly*** advised that [data retention](cookbooks-retention-expiry.md) be configured. If data retention for a topic is not configured for an adequate amount of time, messages that the reader has not yet read might be deleted .  This causes the readers to essentially skip messages. Configuring the data retention for a topic guarantees the reader with a c [...]
 
 Please also note that a reader can have a "backlog", but the metric is only used for users to know how behind the reader is. The metric is not considered for any backlog quota calculations. 
 
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-messaging.md b/site2/website/versioned_docs/version-2.3.0/concepts-messaging.md
index a49105fa769..b43e325b0e2 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-messaging.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-messaging.md
@@ -24,7 +24,7 @@ Publish time | The timestamp of when the message was published (automatically ap
 Event time | An optional timestamp that applications can attach to the message representing when something happened, e.g. when the message was processed. The event time of a message is 0 if none is explicitly set.
 
 
-> For a more in-depth breakdown of Pulsar message contents, see the documentation on Pulsar's [binary protocol](developing-binary-protocol).
+> For a more in-depth breakdown of Pulsar message contents, see the documentation on Pulsar's [binary protocol](developing-binary-protocol.md).
 
 ## Producers
 
@@ -75,7 +75,7 @@ Messages can be acknowledged either one by one or cumulatively. With cumulative
 
 ### Listeners
 
-Client libraries can provide their own listener implementations for consumers. The [Java client](client-libraries-java), for example, provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
+Client libraries can provide their own listener implementations for consumers. The [Java client](client-libraries-java.md), for example, provides a {@inject: javadoc:MesssageListener:/client/org/apache/pulsar/client/api/MessageListener} interface. In this interface, the `received` method is called whenever a new message is received.
 
 ## Topics
 
@@ -200,7 +200,7 @@ Decisions about routing and subscription types can be made separately in most ca
 
 There is no difference between partitioned topics and normal topics in terms of how subscription types work, as partitioning only determines what happens between when a message is published by a producer and processed and acknowledged by a consumer.
 
-Partitioned topics need to be explicitly created via the [admin API](admin-api-overview). The number of partitions can be specified when creating the topic.
+Partitioned topics need to be explicitly created via the [admin API](admin-api-overview.md). The number of partitions can be specified when creating the topic.
 
 ### Routing modes
 
@@ -212,7 +212,7 @@ Mode     | Description
 :--------|:------------
 `RoundRobinPartition` | If no key is provided, the producer will publish messages across all partitions in round-robin fashion to achieve maximum throughput. Please note that round-robin is not done per individual message but rather it's set to the same boundary of batching delay, to ensure batching is effective. While if a key is specified on the message, the partitioned producer will hash the key and assign message to a particular partition. This is the default mode. 
 `SinglePartition`     | If no key is provided, the producer will randomly pick one single partition and publish all the messages into that partition. While if a key is specified on the message, the partitioned producer will hash the key and assign message to a particular partition.
-`CustomPartition`     | Use custom message router implementation that will be called to determine the partition for a particular message. User can create a custom routing mode by using the [Java client](client-libraries-java) and implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
+`CustomPartition`     | Use custom message router implementation that will be called to determine the partition for a particular message. User can create a custom routing mode by using the [Java client](client-libraries-java.md) and implementing the {@inject: javadoc:MessageRouter:/client/org/apache/pulsar/client/api/MessageRouter} interface.
 
 ### Ordering guarantee
 
@@ -250,7 +250,7 @@ non-persistent://tenant/namespace/topic
 
 ```
 
-> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent).
+> For more info on using non-persistent topics, see the [Non-persistent messaging cookbook](cookbooks-non-persistent.md).
 
 In non-persistent topics, brokers immediately deliver messages to all connected subscribers *without persisting them* in [BookKeeper](concepts-architecture-overview.md#persistent-storage). If a subscriber is disconnected, the broker will not be able to deliver those in-transit messages, and subscribers will never be able to receive those messages again. Eliminating the persistent storage step makes messaging on non-persistent topics slightly faster than on persistent topics in some cases [...]
 
@@ -298,7 +298,7 @@ Pulsar has two features, however, that enable you to override this default behav
 * Message **retention** enables you to store messages that have been acknowledged by a consumer
 * Message **expiry** enables you to set a time to live (TTL) for messages that have not yet been acknowledged
 
-> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry) cookbook.
+> All message retention and expiry is managed at the [namespace](#namespaces) level. For a how-to, see the [Message retention and expiry](cookbooks-retention-expiry.md) cookbook.
 
 The diagram below illustrates both concepts:
 
@@ -321,12 +321,12 @@ Message deduplication is disabled in the scenario shown at the top. Here, a prod
 
 In the second scenario at the bottom, the producer publishes message 1, which is received by the broker and persisted, as in the first scenario. When the producer attempts to publish the message again, however, the broker knows that it has already seen message 1 and thus does not persist the message.
 
-> Message deduplication is handled at the namespace level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication).
+> Message deduplication is handled at the namespace level. For more instructions, see the [message deduplication cookbook](cookbooks-deduplication.md).
 
 
 ### Producer idempotency
 
-The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, which means that you don't need to modify your Pulsar client code. Instead, you only need to make administrative changes (see the [Managi [...]
+The other available approach to message deduplication is to ensure that each message is *only produced once*. This approach is typically called **producer idempotency**. The drawback of this approach is that it defers the work of message deduplication to the application. In Pulsar, this is handled at the [broker](reference-terminology.md#broker) level, which means that you don't need to modify your Pulsar client code. Instead, you only need to make administrative changes (see the [Managi [...]
 
 ### Deduplication and effectively-once semantics
 
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-multi-tenancy.md b/site2/website/versioned_docs/version-2.3.0/concepts-multi-tenancy.md
index 8a17e72a4c8..26bd6a2fd18 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-multi-tenancy.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-multi-tenancy.md
@@ -4,7 +4,7 @@ title: Multi Tenancy
 sidebar_label: "Multi Tenancy"
 ---
 
-Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
+Pulsar was created from the ground up as a multi-tenant system. To support multi-tenancy, Pulsar has a concept of tenants. Tenants can be spread across clusters and can each have their own [authentication and authorization](security-overview.md) scheme applied to them. They are also the administrative unit at which storage quotas, [message TTL](cookbooks-retention-expiry.md#time-to-live-ttl), and isolation policies can be managed.
 
 The multi-tenant nature of Pulsar is reflected mostly visibly in topic URLs, which have this structure:
 
@@ -20,7 +20,7 @@ As you can see, the tenant is the most basic unit of categorization for topics (
 
 To each tenant in a Pulsar instance you can assign:
 
-* An [authorization](security-authorization) scheme
+* An [authorization](security-authorization.md) scheme
 * The set of [clusters](reference-terminology.md#cluster) to which the tenant's configuration applies
 
 ## Namespaces
@@ -28,7 +28,7 @@ To each tenant in a Pulsar instance you can assign:
 Tenants and namespaces are two key concepts of Pulsar to support multi-tenancy.
 
 * Pulsar is provisioned for specified tenants with appropriate capacity allocated to the tenant.
-* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
+* A namespace is the administrative unit nomenclature within a tenant. The configuration policies set on a namespace apply to all the topics created in that namespace. A tenant may create multiple namespaces via self-administration using the REST API and the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. For instance, a tenant with different applications can create a separate namespace for each application.
 
 Names for topics in the same namespace will look like this:
 
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-overview.md b/site2/website/versioned_docs/version-2.3.0/concepts-overview.md
index c9e9db298d0..f238e14b05d 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-overview.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-overview.md
@@ -9,15 +9,15 @@ Pulsar is a multi-tenant, high-performance solution for server-to-server messagi
 
 Pulsar's key features include:
 
-* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo) of messages across clusters
+* Native support for multiple clusters in a Pulsar instance, with seamless [geo-replication](administration-geo.md) of messages across clusters
 * Very low publish and end-to-end latency
 * Seamless scalability out to over a million topics
 * A simple [client API](concepts-clients.md) with bindings for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp.md)
 * Multiple [subscription types](concepts-messaging.md#subscription-types) for topics ([exclusive](concepts-messaging.md#exclusive), [shared](concepts-messaging.md#shared), and [failover](concepts-messaging.md#failover))
 * Guaranteed message delivery with [persistent message storage](concepts-architecture-overview.md#persistent-storage) provided by [Apache BookKeeper](http://bookkeeper.apache.org/)
-* A serverless lightweight computing framework [Pulsar Functions](functions-overview) offers stream native data processing.
-* A serverless connector framework [Pulsar IO](io-overview) built on-top-of Pulsar Functions to make moving data in and out Apache Pulsar easier.
-* [Tiered Storage](concepts-tiered-storage) offloads data from hot/warm storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
+* A serverless lightweight computing framework [Pulsar Functions](functions-overview.md) offers stream native data processing.
+* A serverless connector framework [Pulsar IO](io-overview.md) built on-top-of Pulsar Functions to make moving data in and out Apache Pulsar easier.
+* [Tiered Storage](concepts-tiered-storage.md) offloads data from hot/warm storage to cold/long-term storage (such as S3 and GCS) when the data is aging out.
 
 ## Contents
 
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-replication.md b/site2/website/versioned_docs/version-2.3.0/concepts-replication.md
index d4653ca7aec..9cc3a7c3415 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-replication.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-replication.md
@@ -8,7 +8,7 @@ Regardless of industries, when an unforeseen event occurs and brings day-to-day
 
 Pulsar's geo-replication mechanism is typically used for disaster recovery, enabling the replication of persistently stored message data across multiple data centers. For instance, your application is publishing data in one region and you would like to process it for consumption in other regions. With Pulsar’s geo-replication mechanism, messages can be produced and consumed in different geo-locations. 
 
-The diagram below illustrates the process of [geo-replication](administration-geo). Whenever three producers (P1, P2 and P3) respectively publish messages to the T1 topic in three clusters, those messages are instantly replicated across clusters. Once the messages are replicated, two consumers (C1 and C2) can consume those messages from their clusters.
+The diagram below illustrates the process of [geo-replication](administration-geo.md). Whenever three producers (P1, P2 and P3) respectively publish messages to the T1 topic in three clusters, those messages are instantly replicated across clusters. Once the messages are replicated, two consumers (C1 and C2) can consume those messages from their clusters.
 
 ![A typical geo-replication example with full-mesh pattern](/assets/full-mesh-replication.svg)
 
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-schema-registry.md b/site2/website/versioned_docs/version-2.3.0/concepts-schema-registry.md
index 1c2ff47d348..a4c8ae8eb81 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-schema-registry.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-schema-registry.md
@@ -17,7 +17,7 @@ Both approaches are available in Pulsar, and you're free to adopt one or the oth
 
 #### Note
 >
-> Currently, the Pulsar schema registry is only available for the [Java client](client-libraries-java.md), [Python client](client-libraries-python.md), and [C++ client](client-libraries-cpp).
+> Currently, the Pulsar schema registry is only available for the [Java client](client-libraries-java.md), [Python client](client-libraries-python.md), and [C++ client](client-libraries-cpp.md).
 
 ## Basic architecture
 
@@ -39,7 +39,7 @@ Pulsar schemas are fairly simple data structures that consist of:
 
 ## Schema versions
 
-In order to illustrate how schema versioning works, let's walk through an example. Imagine that the Pulsar [Java client](client-libraries-java) created using the code below attempts to connect to Pulsar and begin sending messages:
+In order to illustrate how schema versioning works, let's walk through an example. Imagine that the Pulsar [Java client](client-libraries-java.md) created using the code below attempts to connect to Pulsar and begin sending messages:
 
 ```java
 
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-tiered-storage.md b/site2/website/versioned_docs/version-2.3.0/concepts-tiered-storage.md
index f0bbde61718..ec031253ccd 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-tiered-storage.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-tiered-storage.md
@@ -14,4 +14,4 @@ One way to alleviate this cost is to use Tiered Storage. With tiered storage, ol
 
 Pulsar currently supports S3, Google Cloud Storage (GCS), and filesystem for [long term store](https://pulsar.apache.org/docs/en/cookbooks-tiered-storage/). Offloading to long term storage triggered via a Rest API or command line interface. The user passes in the amount of topic data they wish to retain on BookKeeper, and the broker will copy the backlog data to long term storage. The original data will then be deleted from BookKeeper after a configured delay (4 hours by default).
 
-> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage).
+> For a guide for setting up tiered storage, see the [Tiered storage cookbook](cookbooks-tiered-storage.md).
diff --git a/site2/website/versioned_docs/version-2.3.0/concepts-topic-compaction.md b/site2/website/versioned_docs/version-2.3.0/concepts-topic-compaction.md
index 790ce76b7c5..300cf68956d 100644
--- a/site2/website/versioned_docs/version-2.3.0/concepts-topic-compaction.md
+++ b/site2/website/versioned_docs/version-2.3.0/concepts-topic-compaction.md
@@ -6,7 +6,7 @@ sidebar_label: "Topic Compaction"
 
 Pulsar was built with highly scalable [persistent storage](concepts-architecture-overview.md#persistent-storage) of message data as a primary objective. Pulsar topics enable you to persistently store as many unacknowledged messages as you need while preserving message ordering. By default, Pulsar stores *all* unacknowledged/unprocessed messages produced on a topic. Accumulating many unacknowledged messages on a topic is necessary for many Pulsar use cases but it can also be very time int [...]
 
-> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction).
+> For a more practical guide to topic compaction, see the [Topic compaction cookbook](cookbooks-compaction.md).
 
 For some use cases consumers don't need a complete "image" of the topic log. They may only need a few values to construct a more "shallow" image of the log, perhaps even just the most recent value. For these kinds of use cases Pulsar offers **topic compaction**. When you run compaction on a topic, Pulsar goes through a topic's backlog and removes messages that are *obscured* by later messages, i.e. it goes through the topic on a per-key basis and leaves only the most recent message assoc [...]
 
@@ -23,7 +23,7 @@ Pulsar's topic compaction feature:
 
 ## How topic compaction works
 
-When topic compaction is triggered [via the CLI](cookbooks-compaction), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
+When topic compaction is triggered [via the CLI](cookbooks-compaction.md), Pulsar will iterate over the entire topic from beginning to end. For each key that it encounters the compaction routine will keep a record of the latest occurrence of that key.
 
 After that, the broker will create a new [BookKeeper ledger](concepts-architecture-overview.md#ledgers) and make a second iteration through each message on the topic. For each message, if the key matches the latest occurrence of that key, then the key's data payload, message ID, and metadata will be written to the newly created ledger. If the key doesn't match the latest then the message will be skipped and left alone. If any given message has an empty payload, it will be skipped and con [...]
 
diff --git a/site2/website/versioned_docs/version-2.3.0/cookbooks-compaction.md b/site2/website/versioned_docs/version-2.3.0/cookbooks-compaction.md
index 0720019aaa0..214e899fa08 100644
--- a/site2/website/versioned_docs/version-2.3.0/cookbooks-compaction.md
+++ b/site2/website/versioned_docs/version-2.3.0/cookbooks-compaction.md
@@ -44,7 +44,7 @@ Configuring the compaction threshold on a namespace will apply to all topics wit
 
 ## Triggering compaction manually
 
-In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin) CLI tool. Here's an example:
+In order to run compaction on a topic, you need to use the [`topics compact`](reference-pulsar-admin.md#topics-compact) command for the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool. Here's an example:
 
 ```bash
 
diff --git a/site2/website/versioned_docs/version-2.3.0/cookbooks-non-persistent.md b/site2/website/versioned_docs/version-2.3.0/cookbooks-non-persistent.md
index d40c4fbd0cf..1346d19a042 100644
--- a/site2/website/versioned_docs/version-2.3.0/cookbooks-non-persistent.md
+++ b/site2/website/versioned_docs/version-2.3.0/cookbooks-non-persistent.md
@@ -40,7 +40,7 @@ $ bin/pulsar-client produce non-persistent://public/default/example-np-topic \
 
 ```
 
-> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-topics) guide.
+> For a more thorough guide to non-persistent topics from an administrative perspective, see the [Non-persistent topics](admin-api-topics.md) guide.
 
 ## Enabling
 
@@ -54,7 +54,7 @@ If you'd like to enable *only* non-persistent topics in a broker, you can set th
 
 ## Managing with cli
 
-Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin) non-persistent topics under a namespace, and more.
+Non-persistent topics can be managed using the [`pulsar-admin non-persistent`](reference-pulsar-admin.md#non-persistent) command-line interface. With that interface you can perform actions like [create a partitioned non-persistent topic](reference-pulsar-admin.md#non-persistent-create-partitioned-topic), get [stats](reference-pulsar-admin.md#non-persistent-stats) for a non-persistent topic, [list](reference-pulsar-admin.md) non-persistent topics under a namespace, and more.
 
 ## Using with Pulsar clients
 
diff --git a/site2/website/versioned_docs/version-2.3.0/cookbooks-partitioned.md b/site2/website/versioned_docs/version-2.3.0/cookbooks-partitioned.md
index 25896934788..c857d019edc 100644
--- a/site2/website/versioned_docs/version-2.3.0/cookbooks-partitioned.md
+++ b/site2/website/versioned_docs/version-2.3.0/cookbooks-partitioned.md
@@ -3,4 +3,4 @@ id: cookbooks-partitioned
 title: Partitioned topics
 sidebar_label: "Partitioned Topics"
 ---
-For details of the content, refer to [manage topics](admin-api-topics).
\ No newline at end of file
+For details of the content, refer to [manage topics](admin-api-topics.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.3.0/cookbooks-retention-expiry.md b/site2/website/versioned_docs/version-2.3.0/cookbooks-retention-expiry.md
index db4c4fe4c1e..64e1f405fc2 100644
--- a/site2/website/versioned_docs/version-2.3.0/cookbooks-retention-expiry.md
+++ b/site2/website/versioned_docs/version-2.3.0/cookbooks-retention-expiry.md
@@ -15,7 +15,7 @@ In Pulsar, you can override both of these default behaviors, at the namespace le
 * You can persistently store messages that have already been consumed and acknowledged for a minimum time by setting [retention policies](#retention-policies).
 * Messages that are not acknowledged within a specified timeframe, can be automatically marked as consumed, by specifying the [time to live](#time-to-live-ttl) (TTL).
 
-Pulsar's [admin interface](admin-api-overview) enables you to manage both retention policies and TTL at the namespace level (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
+Pulsar's [admin interface](admin-api-overview.md) enables you to manage both retention policies and TTL at the namespace level (and thus within a specific tenant and either on a specific cluster or in the [`global`](concepts-architecture-overview.md#global-cluster) cluster).
 
 
 > #### Retention and TTL are solving two different problems
diff --git a/site2/website/versioned_docs/version-2.3.0/deploy-aws.md b/site2/website/versioned_docs/version-2.3.0/deploy-aws.md
index 5db846fe790..60ac4c22d76 100644
--- a/site2/website/versioned_docs/version-2.3.0/deploy-aws.md
+++ b/site2/website/versioned_docs/version-2.3.0/deploy-aws.md
@@ -4,7 +4,7 @@ title: Deploying a Pulsar cluster on AWS using Terraform and Ansible
 sidebar_label: "Amazon Web Services"
 ---
 
-> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster).
+> For instructions on deploying a single Pulsar cluster manually rather than using Terraform and Ansible, see [Deploying a Pulsar cluster on bare metal](deploy-bare-metal.md). For instructions on manually deploying a multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare metal](deploy-bare-metal-multi-cluster.md).
 
 One of the easiest ways to get a Pulsar [cluster](reference-terminology.md#cluster) running on [Amazon Web Services](https://aws.amazon.com/) (AWS) is to use the [Terraform](https://terraform.io) infrastructure provisioning tool and the [Ansible](https://www.ansible.com) server automation tool. Terraform can create the resources necessary for running the Pulsar cluster---[EC2](https://aws.amazon.com/ec2/) instances, networking and security infrastructure, etc.---While Ansible can install [...]
 
@@ -209,7 +209,7 @@ Remember to enter this command just only once. If you attempt to enter this comm
 
 Once you have created the necessary AWS resources using Terraform, you can install and run Pulsar on the Terraform-created EC2 instances using Ansible. 
 
-(Optional) If you want to use any [built-in IO connectors](io-connectors), edit the `Download Pulsar IO packages` task in the `deploy-pulsar.yaml` file and uncomment the connectors you want to use. 
+(Optional) If you want to use any [built-in IO connectors](io-connectors.md), edit the `Download Pulsar IO packages` task in the `deploy-pulsar.yaml` file and uncomment the connectors you want to use. 
 
 To run the playbook, enter this command:
 
diff --git a/site2/website/versioned_docs/version-2.3.0/deploy-bare-metal-multi-cluster.md b/site2/website/versioned_docs/version-2.3.0/deploy-bare-metal-multi-cluster.md
index 70dff45080b..8a765d8843f 100644
--- a/site2/website/versioned_docs/version-2.3.0/deploy-bare-metal-multi-cluster.md
+++ b/site2/website/versioned_docs/version-2.3.0/deploy-bare-metal-multi-cluster.md
@@ -6,13 +6,13 @@ sidebar_label: "Bare metal multi-cluster"
 
 :::tip
 
-1. You can use single-cluster Pulsar installation in most use cases, such as experimenting with Pulsar or using Pulsar in a startup or in a single team. If you need to run a multi-cluster Pulsar instance, see the [guide](deploy-bare-metal-multi-cluster).
-2. If you want to use all built-in [Pulsar IO](io-overview.md) connectors, you need to download `apache-pulsar-io-connectors`package and install `apache-pulsar-io-connectors` under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
-3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`package and install `apache-pulsar-offloaders` under `offloaders` directory in the Pulsar directory on every broker node. For more details of how to configure this feature, you can refer to the [Tiered storage cookbook](cookbooks-tiered-storage).
+1. You can use single-cluster Pulsar installation in most use cases, such as experimenting with Pulsar or using Pulsar in a startup or in a single team. If you need to run a multi-cluster Pulsar instance, see the [guide](deploy-bare-metal-multi-cluster.md).
+2. If you want to use all built-in [Pulsar IO](io-overview.md) connectors, you need to download `apache-pulsar-io-connectors`package and install `apache-pulsar-io-connectors` under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
+3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`package and install `apache-pulsar-offloaders` under `offloaders` directory in the Pulsar directory on every broker node. For more details of how to configure this feature, you can refer to the [Tiered storage cookbook](cookbooks-tiered-storage.md).
 
 :::
 
-A Pulsar instance consists of multiple Pulsar clusters working in unison. You can distribute clusters across data centers or geographical regions and replicate the clusters amongst themselves using [geo-replication](administration-geo).Deploying a  multi-cluster Pulsar instance consists of the following steps:
+A Pulsar instance consists of multiple Pulsar clusters working in unison. You can distribute clusters across data centers or geographical regions and replicate the clusters amongst themselves using [geo-replication](administration-geo.md).Deploying a  multi-cluster Pulsar instance consists of the following steps:
 
 1. Deploying two separate ZooKeeper quorums: a local quorum for each cluster in the instance and a configuration store quorum for instance-wide tasks
 2. Initializing cluster metadata for each cluster
@@ -21,7 +21,7 @@ A Pulsar instance consists of multiple Pulsar clusters working in unison. You ca
 
 
 > #### Run Pulsar locally or on Kubernetes?
-> This guide shows you how to deploy Pulsar in production in a non-Kubernetes environment. If you want to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you want to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes) guide, which includes sections on running Pulsar on Kubernetes, on Google Kubernetes Engine and on Amazon Web Services.
+> This guide shows you how to deploy Pulsar in production in a non-Kubernetes environment. If you want to run a standalone Pulsar cluster on a single machine for development purposes, see the [Setting up a local cluster](getting-started-standalone.md) guide. If you want to run Pulsar on [Kubernetes](https://kubernetes.io), see the [Pulsar on Kubernetes](deploy-kubernetes.md) guide, which includes sections on running Pulsar on Kubernetes, on Google Kubernetes Engine and on Amazon Web Services.
 
 ## System requirement
 
@@ -65,7 +65,7 @@ The Pulsar binary package initially contains the following directories:
 
 Directory | Contains
 :---------|:--------
-`bin` | [Command-line tools](reference-cli-tools) of Pulsar, such as [`pulsar`](reference-cli-tools.md#pulsar) and [`pulsar-admin`](https://pulsar.apache.org/tools/pulsar-admin/)
+`bin` | [Command-line tools](reference-cli-tools.md) of Pulsar, such as [`pulsar`](reference-cli-tools.md#pulsar) and [`pulsar-admin`](https://pulsar.apache.org/tools/pulsar-admin/)
 `conf` | Configuration files for Pulsar, including for [broker configuration](reference-configuration.md#broker), [ZooKeeper configuration](reference-configuration.md#zookeeper), and more
 `examples` | A Java JAR file containing example [Pulsar Functions](functions-overview.md)
 `lib` | The [JAR](https://en.wikipedia.org/wiki/JAR_(file_format)) files that Pulsar uses 
@@ -244,7 +244,7 @@ As you can see from the example above, you need to specify the following:
 * The web service URL for the cluster
 * A broker service URL enabling interaction with the [brokers](reference-terminology.md#broker) in the cluster
 
-If you use [TLS](security-tls-transport), you also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
+If you use [TLS](security-tls-transport.md), you also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster.
 
 Make sure to run `initialize-cluster-metadata` for each cluster in your instance.
 
@@ -363,16 +363,16 @@ $ bin/pulsar broker
 
 ## Service discovery
 
-[Clients](getting-started-clients) connecting to Pulsar brokers need to communicate with an entire Pulsar instance using a single URL.
+[Clients](getting-started-clients.md) connecting to Pulsar brokers need to communicate with an entire Pulsar instance using a single URL.
 
-You can use your own service discovery system. If you use your own system, you only need to satisfy just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to some active brokers in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
+You can use your own service discovery system. If you use your own system, you only need to satisfy just one requirement: when a client performs an HTTP request to an [endpoint](reference-configuration.md) for a Pulsar cluster, such as `http://pulsar.us-west.example.com:8080`, the client needs to be redirected to some active brokers in the desired cluster, whether via DNS, an HTTP or IP redirect, or some other means.
 
 > **Service discovery already provided by many scheduling systems**
-> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes), have service discovery systems built in. If you run Pulsar on such a system, you may not need to provide your own service discovery mechanism.
+> Many large-scale deployment systems, such as [Kubernetes](deploy-kubernetes.md), have service discovery systems built in. If you run Pulsar on such a system, you may not need to provide your own service discovery mechanism.
 
 ## Admin client and verification
 
-At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
+At this point your Pulsar instance should be ready to use. You can now configure client machines that can serve as [administrative clients](admin-api-overview.md) for each cluster. You can use the [`conf/client.conf`](reference-configuration.md#client) configuration file to configure admin clients.
 
 The most important thing is that you point the [`serviceUrl`](reference-configuration.md#client-serviceUrl) parameter to the correct service URL for the cluster:
 
diff --git a/site2/website/versioned_docs/version-2.3.0/deploy-bare-metal.md b/site2/website/versioned_docs/version-2.3.0/deploy-bare-metal.md
index ace80182ddd..5b3bae38c59 100644
--- a/site2/website/versioned_docs/version-2.3.0/deploy-bare-metal.md
+++ b/site2/website/versioned_docs/version-2.3.0/deploy-bare-metal.md
@@ -9,13 +9,13 @@ original_id: deploy-bare-metal
 
 1. Single-cluster Pulsar installations should be sufficient for all but the most ambitious use cases. If you're interested in experimenting with
 Pulsar or using it in a startup or on a single team, we recommend opting for a single cluster. If you do need to run a multi-cluster Pulsar instance,
-however, see the guide [here](deploy-bare-metal-multi-cluster).
-2. If you want to use all builtin [Pulsar IO](io-overview) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
+however, see the guide [here](deploy-bare-metal-multi-cluster.md).
+2. If you want to use all builtin [Pulsar IO](io-overview.md) connectors in your Pulsar deployment, you need to download `apache-pulsar-io-connectors`
 package and make sure it is installed under `connectors` directory in the pulsar directory on every broker node or on every function-worker node if you
-have run a separate cluster of function workers for [Pulsar Functions](functions-overview).
-3. If you want to use [Tiered Storage](concepts-tiered-storage) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`
+have run a separate cluster of function workers for [Pulsar Functions](functions-overview.md).
+3. If you want to use [Tiered Storage](concepts-tiered-storage.md) feature in your Pulsar deployment, you need to download `apache-pulsar-offloaders`
 package and make sure it is installed under `offloaders` directory in the pulsar directory on every broker node. For more details of how to configure
-this feature, you could reference this [Tiered storage cookbook](cookbooks-tiered-storage).
+this feature, you could reference this [Tiered storage cookbook](cookbooks-tiered-storage.md).
 
 :::
 
@@ -264,9 +264,9 @@ Flag | Description
 `--zookeeper` | A "local" ZooKeeper connection string for the cluster. This connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--configuration-store` | The configuration store connection string for the entire instance. As with the `--zookeeper` flag, this connection string only needs to include *one* machine in the ZooKeeper cluster.
 `--web-service-url` | The web service URL for the cluster, plus a port. This URL should be a standard DNS name. The default port is 8080 (we don't recommend using a different port).
-`--web-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
+`--web-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster. The default port is 8443 (we don't recommend using a different port).
 `--broker-service-url` | A broker service URL enabling interaction with the brokers in the cluster. This URL should use the same DNS name as the web service URL but should use the `pulsar` scheme instead. The default port is 6650 (we don't recommend using a different port).
-`--broker-service-url-tls` | If you're using [TLS](security-tls-transport), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
+`--broker-service-url-tls` | If you're using [TLS](security-tls-transport.md), you'll also need to specify a TLS web service URL for the cluster as well as a TLS broker service URL for the brokers in the cluster. The default port is 6651 (we don't recommend using a different port).
 
 ## Deploying a BookKeeper cluster
 
@@ -365,7 +365,7 @@ clusterName=pulsar-cluster-1
 
 ### Enabling Pulsar Functions (optional)
 
-If you want to enable [Pulsar Functions](functions-overview), you can follow the instructions as below:
+If you want to enable [Pulsar Functions](functions-overview.md), you can follow the instructions as below:
 
 1. Edit `conf/broker.conf` to enable function worker, by setting `functionsWorkerEnabled` to `true`.
 
diff --git a/site2/website/versioned_docs/version-2.3.0/deploy-dcos.md b/site2/website/versioned_docs/version-2.3.0/deploy-dcos.md
index 07f446edaff..599d3a1b045 100644
--- a/site2/website/versioned_docs/version-2.3.0/deploy-dcos.md
+++ b/site2/website/versioned_docs/version-2.3.0/deploy-dcos.md
@@ -7,7 +7,7 @@ original_id: deploy-dcos
 
 :::tip
 
-To enable all built-in [Pulsar IO](io-overview) connectors in your Pulsar deploymente, we recommend you use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image; the former has already bundled [all built-in connectors](io-overview.md#working-with-connectors).
+To enable all built-in [Pulsar IO](io-overview.md) connectors in your Pulsar deploymente, we recommend you use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image; the former has already bundled [all built-in connectors](io-overview.md#working-with-connectors).
 
 :::
 
diff --git a/site2/website/versioned_docs/version-2.3.0/deploy-kubernetes.md b/site2/website/versioned_docs/version-2.3.0/deploy-kubernetes.md
index 4e170dcd471..7455247c901 100644
--- a/site2/website/versioned_docs/version-2.3.0/deploy-kubernetes.md
+++ b/site2/website/versioned_docs/version-2.3.0/deploy-kubernetes.md
@@ -5,6 +5,6 @@ sidebar_label: "Kubernetes"
 ---
 
 To get up and running with these charts as fast as possible, in a **non-production** use case, we provide
-a [quick start guide](getting-started-helm) for Proof of Concept (PoC) deployments.
+a [quick start guide](getting-started-helm.md) for Proof of Concept (PoC) deployments.
 
-To configure and install a Pulsar cluster on Kubernetes for production usage, follow the complete [Installation Guide](helm-install).
\ No newline at end of file
+To configure and install a Pulsar cluster on Kubernetes for production usage, follow the complete [Installation Guide](helm-install.md).
\ No newline at end of file
diff --git a/site2/website/versioned_docs/version-2.3.0/deploy-monitoring.md b/site2/website/versioned_docs/version-2.3.0/deploy-monitoring.md
index 677c9092bd2..97f60cd17aa 100644
--- a/site2/website/versioned_docs/version-2.3.0/deploy-monitoring.md
+++ b/site2/website/versioned_docs/version-2.3.0/deploy-monitoring.md
@@ -89,7 +89,7 @@ For that reason we only collect time series of metrics aggregated at the namespa
 
 ### Pulsar per-topic dashboard
 
-The per-topic dashboard instructions are available at [Dashboard](administration-dashboard).
+The per-topic dashboard instructions are available at [Dashboard](administration-dashboard.md).
 
 ### Grafana
 
diff --git a/site2/website/versioned_docs/version-2.3.0/develop-schema.md b/site2/website/versioned_docs/version-2.3.0/develop-schema.md
index e71c04ef60d..2d4461a5ea2 100644
--- a/site2/website/versioned_docs/version-2.3.0/develop-schema.md
+++ b/site2/website/versioned_docs/version-2.3.0/develop-schema.md
@@ -5,7 +5,7 @@ sidebar_label: "Custom schema storage"
 original_id: develop-schema
 ---
 
-By default, Pulsar stores data type [schemas](concepts-schema-registry) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
+By default, Pulsar stores data type [schemas](concepts-schema-registry.md) in [Apache BookKeeper](https://bookkeeper.apache.org) (which is deployed alongside Pulsar). You can, however, use another storage system if you wish. This doc walks you through creating your own schema storage implementation.
 
 In order to use a non-default (i.e. non-BookKeeper) storage system for Pulsar schemas, you need to implement two Java interfaces: [`SchemaStorage`](#schemastorage-interface) and [`SchemaStorageFactory`](#schemastoragefactory-interface).
 
diff --git a/site2/website/versioned_docs/version-2.3.0/functions-deploying.md b/site2/website/versioned_docs/version-2.3.0/functions-deploying.md
index 19565c1c438..d5395324ef8 100644
--- a/site2/website/versioned_docs/version-2.3.0/functions-deploying.md
+++ b/site2/website/versioned_docs/version-2.3.0/functions-deploying.md
@@ -19,8 +19,8 @@ Cluster mode | The function runs *inside of* your Pulsar cluster, on the same ma
 
 In order to deploy and manage Pulsar Functions, you need to have a Pulsar cluster running. There are several options for this:
 
-* You can run a [standalone cluster](getting-started-standalone) locally on your own machine
-* You can deploy a Pulsar cluster on [Kubernetes](deploy-kubernetes.md), [Amazon Web Services](deploy-aws.md), [bare metal](deploy-bare-metal), [DC/OS](https://dcos.io/), and more
+* You can run a [standalone cluster](getting-started-standalone.md) locally on your own machine
+* You can deploy a Pulsar cluster on [Kubernetes](deploy-kubernetes.md), [Amazon Web Services](deploy-aws.md), [bare metal](deploy-bare-metal.md), [DC/OS](https://dcos.io/), and more
 
 If you're running a non-[standalone](reference-terminology.md#standalone) cluster, you'll need to obtain the service URL for the cluster. How you obtain the service URL will depend on how you deployed your Pulsar cluster.
 
@@ -52,7 +52,7 @@ Function name | Whichever value is specified for the class name (minus org, libr
 Tenant | Derived from the input topics' names. If the input topics are under the `marketing` tenant---i.e. the topic names have the form `persistent://marketing/{namespace}/{topicName}`---then the tenant will be `marketing`.
 Namespace | Derived from the input topics' names. If the input topics are under the `asia` namespace under the `marketing` tenant---i.e. the topic names have the form `persistent://marketing/asia/{topicName}`, then the namespace will be `asia`.
 Output topic | `{input topic}-{function name}-output`. A function with an input topic name of `incoming` and a function name of `exclamation`, for example, would have an output topic of `incoming-exclamation-output`.
-Subscription type | For at-least-once and at-most-once [processing guarantees](functions-guarantees), the [`SHARED`](concepts-messaging.md#shared) is applied by default; for effectively-once guarantees, [`FAILOVER`](concepts-messaging.md#failover) is applied
+Subscription type | For at-least-once and at-most-once [processing guarantees](functions-guarantees.md), the [`SHARED`](concepts-messaging.md#shared) is applied by default; for effectively-once guarantees, [`FAILOVER`](concepts-messaging.md#failover) is applied
 Processing guarantees | [`ATLEAST_ONCE`](functions-guarantees.md)
 Pulsar service URL | `pulsar://localhost:6650`
 
diff --git a/site2/website/versioned_docs/version-2.3.0/functions-overview.md b/site2/website/versioned_docs/version-2.3.0/functions-overview.md
index c84be36c588..3a59d43923e 100644
--- a/site2/website/versioned_docs/version-2.3.0/functions-overview.md
+++ b/site2/website/versioned_docs/version-2.3.0/functions-overview.md
@@ -163,7 +163,7 @@ tenant/namespace/name
 FQFNs enable you to create multiple functions with the same name provided that they are in different namespaces.
 
 ## Supported languages
-Currently, you can write Pulsar Functions in Java, Python, and Go. For details, refer to [Develop Pulsar Functions](functions-develop).
+Currently, you can write Pulsar Functions in Java, Python, and Go. For details, refer to [Develop Pulsar Functions](functions-develop.md).
 
 ## Processing guarantees
 Pulsar Functions provide three different messaging semantics that you can apply to any function.
diff --git a/site2/website/versioned_docs/version-2.3.0/getting-started-docker.md b/site2/website/versioned_docs/version-2.3.0/getting-started-docker.md
index 26908245cb2..904d6740166 100644
--- a/site2/website/versioned_docs/version-2.3.0/getting-started-docker.md
+++ b/site2/website/versioned_docs/version-2.3.0/getting-started-docker.md
@@ -43,8 +43,8 @@ When you start a local standalone cluster, a `public/default` namespace is creat
 
 ## Use Pulsar in Docker
 
-Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python) 
-and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can
+Pulsar offers client libraries for [Java](client-libraries-java.md), [Go](client-libraries-go.md), [Python](client-libraries-python.md) 
+and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can
 use one of these root URLs to interact with your cluster:
 
 * `pulsar://localhost:6650`
@@ -103,7 +103,7 @@ client.close()
 ## Get the topic statistics
 
 In Pulsar, you can use REST, Java, or command-line tools to control every aspect of the system.
-For details on APIs, refer to [Admin API Overview](admin-api-overview).
+For details on APIs, refer to [Admin API Overview](admin-api-overview.md).
 
 In the simplest example, you can use curl to probe the stats for a particular topic:
 
diff --git a/site2/website/versioned_docs/version-2.3.0/getting-started-standalone.md b/site2/website/versioned_docs/version-2.3.0/getting-started-standalone.md
index e82283b002d..f6647488180 100644
--- a/site2/website/versioned_docs/version-2.3.0/getting-started-standalone.md
+++ b/site2/website/versioned_docs/version-2.3.0/getting-started-standalone.md
@@ -8,7 +8,7 @@ original_id: getting-started-standalone
 For the purposes of local development and testing, you can run Pulsar in standalone mode on your own machine. Standalone mode includes a Pulsar broker as well as the necessary ZooKeeper and BookKeeper components running inside of a single Java Virtual Machine (JVM) process.
 
 > #### Pulsar in production? 
-> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal) guide.
+> If you're looking to run a full production Pulsar installation, see the [Deploying a Pulsar instance](deploy-bare-metal.md) guide.
 
 ## Run Pulsar Standalone Manually
 
@@ -103,7 +103,7 @@ pulsar-io-aerospike-@pulsar:version@.nar
 > If you are running Pulsar in a bare metal cluster, you need to make sure `connectors` tarball is unzipped in every broker's pulsar directory
 > (or in every function-worker's pulsar directory if you are running a separate worker cluster for Pulsar functions).
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled [all builtin connectors](io-overview.md#working-with-connectors).
 
 ## Installing Tiered Storage Offloaders (optional)
@@ -112,7 +112,7 @@ pulsar-io-aerospike-@pulsar:version@.nar
 > If you would like to enable tiered storage feature, you can follow the instructions as below; otherwise you can
 > skip this section for now.
 
-To get started using [tiered storage offloaders](concepts-tiered-storage), you'll need to download the offloaders tarball release on every broker node in
+To get started using [tiered storage offloaders](concepts-tiered-storage.md), you'll need to download the offloaders tarball release on every broker node in
 one of the following ways:
 
 * by clicking the link below and downloading the release from an Apache mirror:
@@ -152,7 +152,7 @@ For more details of how to configure tiered storage feature, you could reference
 >
 > If you are running Pulsar in a bare metal cluster, you need to make sure `offloaders` tarball is unzipped in every broker's pulsar directory
 > 
-> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes) or [DC/OS](https://dcos.io/)),
+> If you are [running Pulsar in Docker](getting-started-docker.md) or deploying Pulsar using a docker image (e.g. [K8S](deploy-kubernetes.md) or [DC/OS](https://dcos.io/)),
 > you can use `apachepulsar/pulsar-all` image instead of `apachepulsar/pulsar` image. `apachepulsar/pulsar-all` image has already bundled tiered storage offloaders.
 
 
@@ -239,12 +239,12 @@ hello-pulsar
 
 ## Using Pulsar clients locally
 
-Pulsar currently offers client libraries for [Java](client-libraries-java.md),  [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
+Pulsar currently offers client libraries for [Java](client-libraries-java.md),  [Go](client-libraries-go.md), [Python](client-libraries-python.md) and [C++](client-libraries-cpp.md). If you're running a local standalone cluster, you can use one of these root URLs for interacting with your cluster:
 
 * `http://localhost:8080`
 * `pulsar://localhost:6650`
 
-Here's an example producer for a Pulsar topic using the [Java](client-libraries-java) client:
+Here's an example producer for a Pulsar topic using the [Java](client-libraries-java.md) client:
 
 ```java
 
@@ -255,7 +255,7 @@ Producer<byte[]> producer = client.newProducer().topic("my-topic").create();
 
 ```
 
-Here's an example [Python](client-libraries-python) producer:
+Here's an example [Python](client-libraries-python.md) producer:
 
 ```python
 
@@ -266,7 +266,7 @@ producer = client.create_producer('my-topic')
 
 ```
 
-Finally, here's an example [C++](client-libraries-cpp) producer:
+Finally, here's an example [C++](client-libraries-cpp.md) producer:
 
 ```cpp
 
diff --git a/site2/website/versioned_docs/version-2.3.0/io-develop.md b/site2/website/versioned_docs/version-2.3.0/io-develop.md
index 69c9a2f42c4..d361a302b25 100644
--- a/site2/website/versioned_docs/version-2.3.0/io-develop.md
+++ b/site2/website/versioned_docs/version-2.3.0/io-develop.md
@@ -13,15 +13,15 @@ import TabItem from '@theme/TabItem';
 This guide describes how to develop Pulsar connectors to move data
 between Pulsar and other systems. 
 
-Pulsar connectors are special [Pulsar Functions](functions-overview), so creating
+Pulsar connectors are special [Pulsar Functions](functions-overview.md), so creating
 a Pulsar connector is similar to creating a Pulsar function. 
 
 Pulsar connectors come in two types: 
 
 | Type | Description | Example
 |---|---|---
-{@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}|Import data from another system to Pulsar.|[RabbitMQ source connector](io-rabbitmq) imports the messages of a RabbitMQ queue to a Pulsar topic.
-{@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java}|Export data from Pulsar to another system.|[Kinesis sink connector](io-kinesis) exports the messages of a Pulsar topic to a Kinesis stream.
+{@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}|Import data from another system to Pulsar.|[RabbitMQ source connector](io-rabbitmq.md) imports the messages of a RabbitMQ queue to a Pulsar topic.
+{@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java}|Export data from Pulsar to another system.|[Kinesis sink connector](io-kinesis.md) exports the messages of a Pulsar topic to a Kinesis stream.
 
 ## Develop
 
@@ -274,7 +274,7 @@ For more information about **how to create integration tests for Pulsar connecto
 ## Package
 
 Once you've developed and tested your connector, you need to package it so that it can be submitted
-to a [Pulsar Functions](functions-overview) cluster. 
+to a [Pulsar Functions](functions-overview.md) cluster. 
 
 There are two methods to
 work with Pulsar Functions' runtime, that is, [NAR](#nar) and [uber JAR](#uber-jar).
@@ -305,7 +305,7 @@ For more information about **how NAR works**, see [here](https://medium.com/hash
 
 :::
 
-Pulsar uses the same mechanism for packaging **all** [built-in connectors](io-connectors). 
+Pulsar uses the same mechanism for packaging **all** [built-in connectors](io-connectors.md). 
 
 The easiest approach to package a Pulsar connector is to create a NAR package using [nifi-nar-maven-plugin](https://mvnrepository.com/artifact/org.apache.nifi/nifi-nar-maven-plugin).
 
@@ -380,7 +380,7 @@ Pulsar connectors enable you to move data in and out of Pulsar easily. It is imp
 
 - Check the metrics provided by Pulsar.
 
-  Pulsar connectors expose the metrics that can be collected and used for monitoring the health of **Java** connectors. You can check the metrics by following the [monitoring](deploy-monitoring) guide.
+  Pulsar connectors expose the metrics that can be collected and used for monitoring the health of **Java** connectors. You can check the metrics by following the [monitoring](deploy-monitoring.md) guide.
 
 - Set and check your customized metrics.
 
diff --git a/site2/website/versioned_docs/version-2.3.0/io-managing.md b/site2/website/versioned_docs/version-2.3.0/io-managing.md
index cce795bbae8..8c834410a5d 100644
--- a/site2/website/versioned_docs/version-2.3.0/io-managing.md
+++ b/site2/website/versioned_docs/version-2.3.0/io-managing.md
@@ -50,7 +50,7 @@ For details, consult the documentation for [individual connectors](io-overview.m
 
 ## Running Connectors
 
-Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Pulsar connectors can be managed using the [`source`](reference-pulsar-admin.md#source) and [`sink`](reference-pulsar-admin.md#sink) commands of the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Running sources
 
@@ -166,8 +166,8 @@ Here's an example to submit a Cassandra sink:
 
 ## Monitoring Connectors
 
-Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview), so you can use [`functions`](reference-pulsar-admin.md#source) commands
-available in the [`pulsar-admin`](reference-pulsar-admin) CLI tool.
+Since Pulsar IO connectors are running as [Pulsar Functions](functions-overview.md), so you can use [`functions`](reference-pulsar-admin.md#source) commands
+available in the [`pulsar-admin`](reference-pulsar-admin.md) CLI tool.
 
 ### Retrieve Connector Metadata
 
diff --git a/site2/website/versioned_docs/version-2.3.0/io-overview.md b/site2/website/versioned_docs/version-2.3.0/io-overview.md
index 2a6ecaee588..ea49e4b042e 100644
--- a/site2/website/versioned_docs/version-2.3.0/io-overview.md
+++ b/site2/website/versioned_docs/version-2.3.0/io-overview.md
@@ -157,7 +157,7 @@ For more information about the options of `pulsar-admin sinks update`, see [here
 
 ## Work with connector
 
-You can manage Pulsar connectors (for example, create, update, start, stop, restart, reload, delete and perform other operations on connectors) via the [Connector Admin CLI](reference-connector-admin) with [sources](io-cli.md#sources) and [sinks](io-cli.md#sinks) subcommands.
+You can manage Pulsar connectors (for example, create, update, start, stop, restart, reload, delete and perform other operations on connectors) via the [Connector Admin CLI](reference-connector-admin.md) with [sources](io-cli.md#sources) and [sinks](io-cli.md#sinks) subcommands.
 
-Connectors (sources and sinks) and Functions are components of instances, and they all run on Functions workers. When managing a source, sink or function via [Connector Admin CLI](reference-connector-admin.md) or [Functions Admin CLI](functions-cli), an instance is started on a worker. For more information, see [Functions worker](functions-worker.md#run-functions-worker-separately).
+Connectors (sources and sinks) and Functions are components of instances, and they all run on Functions workers. When managing a source, sink or function via [Connector Admin CLI](reference-connector-admin.md) or [Functions Admin CLI](functions-cli.md), an instance is started on a worker. For more information, see [Functions worker](functions-worker.md#run-functions-worker-separately).
 
diff --git a/site2/website/versioned_docs/version-2.3.0/io-quickstart.md b/site2/website/versioned_docs/version-2.3.0/io-quickstart.md
index c4230323e66..83a57170dfc 100644
--- a/site2/website/versioned_docs/version-2.3.0/io-quickstart.md
+++ b/site2/website/versioned_docs/version-2.3.0/io-quickstart.md
@@ -6,14 +6,14 @@ original_id: io-quickstart
 ---
 
 This tutorial provides a hands-on look at how you can move data out of Pulsar without writing a single line of code.
-It is helpful to review the [concepts](io-overview) for Pulsar I/O in tandem with running the steps in this guide
+It is helpful to review the [concepts](io-overview.md) for Pulsar I/O in tandem with running the steps in this guide
 to gain a deeper understanding. At the end of this tutorial, you will be able to:
 
 - Connect your Pulsar cluster with your Cassandra cluster
 
 :::tip
 
-1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone). However all
+1. These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone.md). However all
 the commands used in this tutorial should be able to be used in a multi-nodes Pulsar cluster without any changes.
 2. All the instructions are assumed to run at the root directory of a Pulsar binary distribution.
 
@@ -260,11 +260,11 @@ configs:
 
 ```
 
-To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra).
+To learn more about Cassandra Connector, see [Cassandra Connector](io-cassandra.md).
 
 ### Submit a Cassandra Sink
 
-Pulsar provides the [CLI](reference-cli-tools) for running and managing Pulsar I/O connectors.
+Pulsar provides the [CLI](reference-cli-tools.md) for running and managing Pulsar I/O connectors.
 
 We can run following command to sink a sink connector with type `cassandra` and config file `examples/cassandra-sink.yml`.
 
diff --git a/site2/website/versioned_docs/version-2.3.0/pulsar-2.0.md b/site2/website/versioned_docs/version-2.3.0/pulsar-2.0.md
index 560c8c1bd7c..07fba365e9f 100644
--- a/site2/website/versioned_docs/version-2.3.0/pulsar-2.0.md
+++ b/site2/website/versioned_docs/version-2.3.0/pulsar-2.0.md
@@ -4,13 +4,13 @@ title: Pulsar 2.0
 sidebar_label: "Pulsar 2.0"
 ---
 
-Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview) feature, some terminology changes, and more.
+Pulsar 2.0 is a major new release for Pulsar that brings some bold changes to the platform, including [simplified topic names](#topic-names), the addition of the [Pulsar Functions](functions-overview.md) feature, some terminology changes, and more.
 
 ## New features in Pulsar 2.0
 
 Feature | Description
 :-------|:-----------
-[Pulsar Functions](functions-overview) | A lightweight compute option for Pulsar
+[Pulsar Functions](functions-overview.md) | A lightweight compute option for Pulsar
 
 ## Major changes
 
diff --git a/site2/website/versioned_docs/version-2.3.0/reference-cli-tools.md b/site2/website/versioned_docs/version-2.3.0/reference-cli-tools.md
index 204079aa6ce..4e8c146f68e 100644
--- a/site2/website/versioned_docs/version-2.3.0/reference-cli-tools.md
+++ b/site2/website/versioned_docs/version-2.3.0/reference-cli-tools.md
@@ -7,7 +7,7 @@ original_id: reference-cli-tools
 
 Pulsar offers several command-line tools that you can use for managing Pulsar installations, performance testing, using command-line producers and consumers, and more.
 
-All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone). The following tools are currently documented:
+All Pulsar command-line tools can be run from the `bin` directory of your [installed Pulsar package](getting-started-standalone.md). The following tools are currently documented:
 
 * [`pulsar`](#pulsar)
 * [`pulsar-client`](#pulsar-client)
diff --git a/site2/website/versioned_docs/version-2.3.0/security-athenz.md b/site2/website/versioned_docs/version-2.3.0/security-athenz.md
index ba27ba43eb9..6d338fc4013 100644
--- a/site2/website/versioned_docs/version-2.3.0/security-athenz.md
+++ b/site2/website/versioned_docs/version-2.3.0/security-athenz.md
@@ -75,7 +75,7 @@ For more information on Pulsar client authentication using Athenz, see the follo
 
 ## Configure CLI tools for Athenz
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You need to add the following authentication parameters to the `conf/client.conf` config file to use Athenz with CLI tools of Pulsar:
 
diff --git a/site2/website/versioned_docs/version-2.3.0/security-authorization.md b/site2/website/versioned_docs/version-2.3.0/security-authorization.md
index 1f706a56b5a..bbb0a049d2b 100644
--- a/site2/website/versioned_docs/version-2.3.0/security-authorization.md
+++ b/site2/website/versioned_docs/version-2.3.0/security-authorization.md
@@ -29,7 +29,7 @@ superUserRoles=my-super-user-1,my-super-user-2
 > A full list of parameters available in the `conf/broker.conf` file,
 > as well as the default values for those parameters, can be found in [Broker Configuration](reference-configuration.md#broker) 
 
-Typically, superuser roles are used for administrators and clients but also for broker-to-broker authorization. When using [geo-replication](concepts-replication), every broker needs to be able to publish to all the other clusters' topics.
+Typically, superuser roles are used for administrators and clients but also for broker-to-broker authorization. When using [geo-replication](concepts-replication.md), every broker needs to be able to publish to all the other clusters' topics.
 
 Authorization can also be enabled for the proxy the proxy configuration file (`conf/proxy.conf`). If it is enabled on the proxy, the proxy will do an additional authorization check before forwarding the request to a broker. The broker will still check the authorization of the request when it receives the forwarded request.
 
@@ -62,7 +62,7 @@ superUserRoles=my-super-user-1,my-super-user-2,my-proxy-role
 
 A Pulsar [tenant](reference-terminology.md#tenant) is typically provisioned by Pulsar [instance](reference-terminology.md#instance) administrators or by some kind of self-service portal.
 
-Tenants are managed using the [`pulsar-admin`](reference-pulsar-admin) tool. Here's an example tenant creation command:
+Tenants are managed using the [`pulsar-admin`](reference-pulsar-admin.md) tool. Here's an example tenant creation command:
 
 ```shell
 
@@ -86,7 +86,7 @@ persistent://tenant/namespace/topic
 
 ### Managing permissions
 
-You can use [Pulsar Admin Tools](admin-api-permissions) for managing permission in Pulsar.
+You can use [Pulsar Admin Tools](admin-api-permissions.md) for managing permission in Pulsar.
 
 ### Pulsar admin authentication
 
diff --git a/site2/website/versioned_docs/version-2.3.0/security-overview.md b/site2/website/versioned_docs/version-2.3.0/security-overview.md
index 2f3fc035ad4..3f08cb29ad8 100644
--- a/site2/website/versioned_docs/version-2.3.0/security-overview.md
+++ b/site2/website/versioned_docs/version-2.3.0/security-overview.md
@@ -20,7 +20,7 @@ You had better secure the service components in your Apache Pulsar deployment.
 
 In Pulsar, a *role* is a string, like `admin` or `app1`, which can represent a single client or multiple clients. You can use roles to control permission for clients to produce or consume from certain topics, administer the configuration for tenants, and so on.
 
-Apache Pulsar uses a [Authentication Provider](#authentication-providers) to establish the identity of a client and then assign a *role token* to that client. This role token is then used for [Authorization and ACLs](security-authorization) to determine what the client is authorized to do.
+Apache Pulsar uses a [Authentication Provider](#authentication-providers) to establish the identity of a client and then assign a *role token* to that client. This role token is then used for [Authorization and ACLs](security-authorization.md) to determine what the client is authorized to do.
 
 ## Authentication providers
 
diff --git a/site2/website/versioned_docs/version-2.3.0/security-tls-authentication.md b/site2/website/versioned_docs/version-2.3.0/security-tls-authentication.md
index e6921bd4418..d34ecbc1fdc 100644
--- a/site2/website/versioned_docs/version-2.3.0/security-tls-authentication.md
+++ b/site2/website/versioned_docs/version-2.3.0/security-tls-authentication.md
@@ -6,9 +6,9 @@ sidebar_label: "Authentication using TLS"
 
 ## TLS authentication overview
 
-TLS authentication is an extension of [TLS transport encryption](security-tls-transport). Not only servers have keys and certs that the client uses to verify the identity of servers, clients also have keys and certs that the server uses to verify the identity of clients. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
+TLS authentication is an extension of [TLS transport encryption](security-tls-transport.md). Not only servers have keys and certs that the client uses to verify the identity of servers, clients also have keys and certs that the server uses to verify the identity of clients. You must have TLS transport encryption configured on your cluster before you can use TLS authentication. This guide assumes you already have TLS transport encryption configured.
 
-`Bouncy Castle Provider` provides TLS related cipher suites and algorithms in Pulsar. If you need [FIPS](https://www.bouncycastle.org/fips_faq.html) version of `Bouncy Castle Provider`, please reference [Bouncy Castle page](security-bouncy-castle).
+`Bouncy Castle Provider` provides TLS related cipher suites and algorithms in Pulsar. If you need [FIPS](https://www.bouncycastle.org/fips_faq.html) version of `Bouncy Castle Provider`, please reference [Bouncy Castle page](security-bouncy-castle.md).
 
 ### Create client certificates
 
@@ -102,7 +102,7 @@ brokerClientTrustCertsFilePath=/path/my-ca/certs/ca.cert.pem
 
 To configure proxies to authenticate clients, add the following parameters to `proxy.conf`, alongside [the configuration to enable tls transport](security-tls-transport.md#proxy-configuration):
 
-The proxy should have its own client key pair for connecting to brokers. You need to configure the role token for this key pair in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization) for more details.
+The proxy should have its own client key pair for connecting to brokers. You need to configure the role token for this key pair in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization.md) for more details.
 
 ```properties
 
@@ -122,7 +122,7 @@ When you use TLS authentication, client connects via TLS transport. You need to
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-pulsar-admin.md), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You need to add the following parameters to that file to use TLS authentication with the CLI tools of Pulsar:
 
diff --git a/site2/website/versioned_docs/version-2.3.0/security-tls-transport.md b/site2/website/versioned_docs/version-2.3.0/security-tls-transport.md
index d4a36de0a3d..51e90aa7660 100644
--- a/site2/website/versioned_docs/version-2.3.0/security-tls-transport.md
+++ b/site2/website/versioned_docs/version-2.3.0/security-tls-transport.md
@@ -9,7 +9,7 @@ original_id: security-tls-transport
 
 By default, Apache Pulsar clients communicate with the Apache Pulsar service in plain text, which means that all data is sent in the clear. TLS can be used to encrypt this traffic so that it cannot be snooped by a man-in-the-middle attacker.
 
-TLS can be configured for both encryption and authentication. You may configure just TLS transport encryption, which is covered in this guide. TLS authentication is covered [elsewhere](security-tls-authentication.md). Alternatively, you can use [another authentication mechanism](security-athenz) on top of TLS transport encryption.
+TLS can be configured for both encryption and authentication. You may configure just TLS transport encryption, which is covered in this guide. TLS authentication is covered [elsewhere](security-tls-authentication.md). Alternatively, you can use [another authentication mechanism](security-athenz.md) on top of TLS transport encryption.
 
 > Note that enabling TLS may have a performance impact due to encryption overhead.
 
@@ -19,7 +19,7 @@ TLS is a form of [public key cryptography](https://en.wikipedia.org/wiki/Public-
 
 To use TLS transport encryption, you need two kinds of key pairs, **server key pairs** and a **certificate authority**.
 
-A third kind of key pair, **client key pairs**, are used for [client authentication](security-tls-authentication).
+A third kind of key pair, **client key pairs**, are used for [client authentication](security-tls-authentication.md).
 
 The **certificate authority** private key should be stored in a very secure location (a fully encrypted, disconnected, air gapped computer). The certificate authority public key, the **trust cert**, can be freely shared.
 
@@ -27,7 +27,7 @@ For both client and server key pairs, the administrator first generates a privat
 
 For TLS transport encryption, the clients can use the **trust cert** to verify that the server they are talking to has a key pair that was signed by the certificate authority. A man-in-the-middle attacker would not have access to the certificate authority, so they couldn't create a server with such a key pair.
 
-For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that was signed by the certificate authority. The Common Name of the **client cert** is then used as the client's role token (see [Overview](security-overview)).
+For TLS authentication, the server uses the **trust cert** to verify that the client has a key pair that was signed by the certificate authority. The Common Name of the **client cert** is then used as the client's role token (see [Overview](security-overview.md)).
 
 ## Creating TLS Certificates
 
@@ -128,7 +128,7 @@ At this point, you have a cert, `broker.cert.pem`, and a key, `broker.key-pk8.pe
 
 ## Broker Configuration
 
-To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you'll need to make some changes to `broker.conf`, which is located in the `conf` directory of your [Pulsar installation](getting-started-standalone).
+To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS transport encryption, you'll need to make some changes to `broker.conf`, which is located in the `conf` directory of your [Pulsar installation](getting-started-standalone.md).
 
 Add these values to the configuration file (substituting the appropriate certificate paths where necessary):
 
@@ -199,7 +199,7 @@ The examples below show hostname verification being disabled for the Java client
 
 ### CLI tools
 
-[Command-line tools](reference-cli-tools) like [`pulsar-admin`](reference-cli-tools.md#pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
+[Command-line tools](reference-cli-tools.md) like [`pulsar-admin`](reference-cli-tools.md#pulsar-admin), [`pulsar-perf`](reference-cli-tools.md#pulsar-perf), and [`pulsar-client`](reference-cli-tools.md#pulsar-client) use the `conf/client.conf` config file in a Pulsar installation.
 
 You'll need to add the following parameters to that file to use TLS transport with Pulsar's CLI tools:
 
diff --git a/site2/website/versioned_docs/version-2.3.0/security-token-admin.md b/site2/website/versioned_docs/version-2.3.0/security-token-admin.md
index 4accb85a75a..a4370fb3f81 100644
--- a/site2/website/versioned_docs/version-2.3.0/security-token-admin.md
+++ b/site2/website/versioned_docs/version-2.3.0/security-token-admin.md
@@ -162,7 +162,7 @@ tokenSecretKey=file:///path/to/secret.key
 To configure proxies to authenticate clients, put the following in `proxy.conf`:
 
 The proxy will have its own token used when talking to brokers. The role token for this
-key pair should be configured in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization) for more details.
+key pair should be configured in the ``proxyRoles`` of the brokers. See the [authorization guide](security-authorization.md) for more details.
 
 ```properties
 
diff --git a/site2/website/versioned_docs/version-2.3.0/security-token-client.md b/site2/website/versioned_docs/version-2.3.0/security-token-client.md
index b955bcddacf..2ef64e045e3 100644
--- a/site2/website/versioned_docs/version-2.3.0/security-token-client.md
+++ b/site2/website/versioned_docs/version-2.3.0/security-token-client.md
@@ -24,12 +24,12 @@ eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL6
 
 Application specifies the token when you are creating the client instance. An alternative is to pass a "token supplier" (a function that returns the token when the client library needs one).
 
-See [Token authentication admin](security-token-admin) for a reference on how to enable token
+See [Token authentication admin](security-token-admin.md) for a reference on how to enable token
 authentication on a Pulsar cluster.
... 55537 lines suppressed ...