diff --git a/.gitignore b/.gitignore
index 744c3539a4109dabaa544e2e59ff24263a75d5e6..ccf932c97afccfbbe23f5fc2b209fb7c9e62cc5e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -99,3 +99,6 @@ Makefile.in
 # cygwin
 *.exe
 *.exe.manifest
+
+# clang
+.qtc_clangd
diff --git a/doc/configuration.rst b/doc/configuration.rst
index 9d27e4bb9558c7685f1af5a45071e6a44cf861d8..24d8d1ebeb8e960dccd0a71856724ded28ad70ba 100644
--- a/doc/configuration.rst
+++ b/doc/configuration.rst
@@ -399,16 +399,21 @@ Automatic DNSSEC signing
 Knot DNS supports automatic DNSSEC signing of zones. The signing
 can operate in two modes:
 
-1. :ref:`Automatic key management <dnssec-automatic-zsk-management>`.
+1. :ref:`Manual key management <dnssec-manual-key-management>`:
+   In this mode, the server maintains zone signatures (RRSIGs) only. The
+   signatures are kept up-to-date and signing keys are rolled according to
+   the timing parameters assigned to the keys. The keys must be generated and
+   timing parameters must be assigned by the zone operator.
+
+2. :ref:`Automatic key management <dnssec-automatic-zsk-management>`:
    In this mode, the server maintains signing keys. New keys are generated
-   according to assigned policy and are rolled automatically in a safe manner.
-   No zone operator intervention is necessary.
+   according to the assigned policy and are rolled automatically in a safe manner.
+   No intervention from the zone operator is necessary.
 
-2. :ref:`Manual key management <dnssec-manual-key-management>`.
-   In this mode, the server maintains zone signatures only. The signatures
-   are kept up-to-date and signing keys are rolled according to timing
-   parameters assigned to the keys. The keys must be generated and timing
-   parameters must be assigned by the zone operator.
+For automatic DNSSEC signing, a :ref:`policy<Policy section>` must
+be configured and assigned to the zone. The policy specifies how the zone
+is signed (i.e. signing algorithm, key size, key lifetime, signature lifetime,
+etc.). If no policy is specified, the default signing parameters are used.
 
 The DNSSEC signing process maintains some metadata which is stored in the
 :abbr:`KASP (Key And Signature Policy)` database. This database is backed
@@ -421,24 +426,63 @@ by LMDB.
   the database also contains private key material – don't set the permissions
   too weak.
 
-.. _dnssec-automatic-zsk-management:
+.. _dnssec-manual-key-management:
 
-Automatic ZSK management
-------------------------
+Manual key management
+---------------------
 
-For automatic ZSK management a signing :ref:`policy<Policy section>` has to
-be configured and assigned to the zone. The policy specifies how the zone
-is signed (i.e. signing algorithm, key size, key lifetime, signature lifetime,
-etc.). If no policy is specified or the ``default`` one is assigned, the
-default signing parameters are used.
+For automatic DNSSEC signing with manual key management, the
+:ref:`policy_manual` has to be enabled in the policy::
 
-A minimal zone configuration may look as follows::
+  policy:
+    - id: manual
+      manual: on
 
   zone:
     - domain: myzone.test
       dnssec-signing: on
+      dnssec-policy: manual
+
+To generate signing keys, use the :doc:`keymgr<man_keymgr>` utility.
+For example, we can use Single-Type Signing:
+
+.. code-block:: console
+
+  $ keymgr myzone.test. generate algorithm=ECDSAP256SHA256 ksk=yes zsk=yes
+
+And reload the server. The zone will be signed.
+
+To perform a manual rollover of a key, the timing parameters of the key need
+to be set. Let's roll the key. Generate a new key, but do not activate
+it yet:
+
+.. code-block:: console
+
+  $ keymgr myzone.test. generate algorithm=ECDSAP256SHA256 ksk=yes zsk=yes active=+1d
+
+Take the key ID (or key tag) of the old key and disable it the same time
+the new key gets activated:
+
+.. code-block:: console
+
+  $ keymgr myzone.test. set <old_key_id> retire=+2d remove=+3d
+
+Reload the server again. The new key will be published (i.e. the DNSKEY record
+will be added into the zone). Remember to update the DS record in the
+parent zone to include a reference to the new key. This must happen within one
+day (in this case) including a delay required to propagate the new DS to
+caches.
+
+.. _dnssec-automatic-zsk-management:
+
+Automatic ZSK management
+------------------------
 
-With a custom signing policy, the policy section will be added::
+With :ref:`policy_manual` disabled in the assigned policy (the default),
+the DNSSEC keys are generated automatically (if they do not already exist)
+and are also automatically rolled over according to their configured lifetimes.
+The default :ref:`policy_zsk-lifetime` is finite, whereas :ref:`policy_ksk-lifetime`
+infinite, meaning no KSK rollovers occur in the following example::
 
   policy:
     - id: custom_policy
@@ -457,17 +501,27 @@ After configuring the server, reload the changes:
 
   $ knotc reload
 
-The server will generate initial signing keys and sign the zone properly. Check
-the server logs to see whether everything went well.
+Check the server logs (regularly) to see whether everything went well.
+
+.. NOTE::
+   Enabling automatic key management with already existing keys requires attention:
+
+   - Any key timers set to future timestamps are automatically cleared,
+     preventing interference with automatic operation procedures.
+   - If the keys are in an inconsistent state (e.g. an unexpected number of keys
+     or active keys), it might lead to undefined behavior or, at the very least,
+     a halt in key management.
 
 .. _dnssec-automatic-ksk-management:
 
 Automatic KSK management
 ------------------------
 
-For automatic KSK management, first configure ZSK management like above, and use
-additional options in :ref:`policy section <Policy section>`, mostly specifying
-desired (finite) lifetime for KSK: ::
+For automatic KSK management, first configure ZSK management as described above,
+and use :ref:`submission section <Submission section>` along with several options in
+:ref:`policy section <Policy section>`, specifying the desired (finite) lifetime for
+KSK and semi-automatic DS submission (see also :ref:`DNSSEC Key states` and
+:ref:`DNSSEC Key rollovers`)::
 
   remote:
     - id: parent_zone_server
@@ -496,56 +550,9 @@ and the user shall propagate them to the parent. The server periodically checks
 DS at the parent zone and when positive, finishes the rollover.
 
 .. NOTE::
-   As the key timestamp semantics differ between the automatic and manual key
-   management, all key timestamps set in the future, either manually or during
-   a key import, are ignorred (cleared).
-
-.. _dnssec-manual-key-management:
-
-Manual key management
----------------------
-
-For automatic DNSSEC signing with manual key management, a signing policy
-with manual key management flag has to be set::
-
-  policy:
-    - id: manual
-      manual: on
-
-  zone:
-    - domain: myzone.test
-      dnssec-signing: on
-      dnssec-policy: manual
-
-To generate signing keys, use the :doc:`keymgr<man_keymgr>` utility.
-For example, we can use Single-Type Signing:
-
-.. code-block:: console
-
-  $ keymgr myzone.test. generate algorithm=ECDSAP256SHA256 ksk=yes zsk=yes
-
-And reload the server. The zone will be signed.
-
-To perform a manual rollover of a key, the timing parameters of the key need
-to be set. Let's roll the key. Generate a new key, but do not activate
-it yet:
-
-.. code-block:: console
-
-  $ keymgr myzone.test. generate algorithm=ECDSAP256SHA256 ksk=yes zsk=yes active=+1d
-
-Take the key ID (or key tag) of the old key and disable it the same time
-the new key gets activated:
-
-.. code-block:: console
-
-  $ keymgr myzone.test. set <old_key_id> retire=+2d remove=+3d
-
-Reload the server again. The new key will be published (i.e. the DNSKEY record
-will be added into the zone). Remember to update the DS record in the
-parent zone to include a reference to the new key. This must happen within one
-day (in this case) including a delay required to propagate the new DS to
-caches.
+   When the initial keys are automatically generated for the first time, the KSK
+   is actually in the ``ready`` state, allowing the initial parent DS submission
+   to take place automatically.
 
 .. _dnssec-signing: